Ret2win
Basic Information
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 da se izvrši određena, neinvokovana funkcija unutar binarnog fajla, često nazvana 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 Example
Razmotrite jednostavan C program sa ranjivošću i win
funkcijom koju nameravamo da pozovemo:
Da biste kompajlirali ovaj program bez zaštite steka i sa ASLR onemogućenim, možete koristiti sledeću komandu:
-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 funkcijewin
ne menja.-o vulnerable
: Imenovati izlazni fajlvulnerable
.
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
.
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:
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 treba da bude onemogućena kako 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 je
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 takođe treba da budu onemogućene ili kompromitovana EIP adresa povratka nikada neće biti praćena.
Ostali primeri & Reference
32bit, bez ASLR
64 bita sa ASLR, sa leak-om adrese bin
64 bita, bez ASLR
32 bita, bez ASLR, dvostruko malo prelivanje, prvo da preplavi stek i poveća veličinu drugog prelivanja
32 bita, relro, bez kanarinca, nx, bez pie, format string za prepisivanje adrese
fflush
sa funkcijom win (ret2win)32 bita, nx, ništa drugo, delimično prepisivanje EIP (1Byte) da pozove funkciju win
32 bita, nx, ništa drugo, delimično prepisivanje EIP (1Byte) da pozove funkciju win
Program samo validira poslednji bajt broja da proveri veličinu ulaza, stoga je moguće dodati bilo koju veličinu sve dok je poslednji bajt unutar dozvoljenog opsega. Tada, ulaz stvara prelivanje bafera koje se eksploatiše sa ret2win.
64 bita, relro, bez kanarinca, nx, pie. Delimično prepisivanje da pozove funkciju win (ret2win)
arm64, PIE, daje PIE leak funkcija win je zapravo 2 funkcije tako da ROP gadget koji poziva 2 funkcije
ARM64, off-by-one da pozove funkciju win
ARM64 Primer
Ret2win - arm64Last updated