Ret2win
Osnovne Informacije
Ret2win izazovi su popularna kategorija u takmičenjima Capture The Flag (CTF), posebno u zadacima koji uključuju binarno eksploatisanje. Cilj je iskoristiti ranjivost u datom binarnom fajlu kako bi se izvršila određena, neizvršena funkcija unutar binarnog fajla, često nazvana nešto poput win
, flag
, itd. Ova funkcija, kada se izvrši, obično ispisuje zastavu ili poruku o uspehu. Izazov obično uključuje prepisivanje adrese povratka na steku kako bi se preusmerio tok izvršavanja ka željenoj funkciji. Evo detaljnijeg objašnjenja sa primerima:
Primer u C-u
Razmotrimo jednostavan C program sa ranjivošću i win
funkcijom koju nameravamo pozvati:
Da biste kompajlirali ovaj program bez zaštite steka i sa ASLR onemogućenim, možete koristiti sledeću komandu:
-m32
: Kompajliraj program kao 32-bitni binarni fajl (ovo je opcionalno ali često se koristi u CTF izazovima).-fno-stack-protector
: Onemogući zaštitu od preplavljivanja steka.-z execstack
: Dozvoli izvršavanje koda na steku.-no-pie
: Onemogući izvršavanje nezavisno od pozicije kako bi se osiguralo da adresa funkcijewin
ne promeni.-o vulnerable
: Nazovi izlazni fajlvulnerable
.
Python Eksploatacija korišćenjem Pwntools
Za eksploataciju, koristićemo pwntools, moćan CTF okvir za pisanje eksploata. Skripta za eksploataciju će kreirati payload za preplavljivanje bafera i prepisati povratnu adresu sa adresom funkcije win
.
Da biste pronašli adresu funkcije win
, možete koristiti gdb, objdump, ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa objdump
-om, možete koristiti:
Ova komanda će vam prikazati sklop win
funkcije, uključujući njenu početnu adresu.
Python skripta šalje pažljivo oblikovanu poruku koja, kada je obrađena od strane vulnerable_function
, preplavljuje bafer i prepisuje adresu povratka na steku adresom win
. Kada vulnerable_function
završi, umesto vraćanja na main
ili izlaska, prelazi na win
, i poruka se ispisuje.
Zaštite
PIE treba biti onemogućen da bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i trebaće vam neko curenje informacija da biste saznali gde je smeštena win funkcija. U nekim slučajevima, kada funkcija koja uzrokuje preplavljivanje je
read
ili slična, možete izvršiti Delimično prepisivanje od 1 ili 2 bajta da biste promenili adresu povratka da bude win funkcija. Zbog toga kako ASLR funkcioniše, poslednje tri heksadecimalne cifre nisu nasumične, tako da postoji 1/16 šansa (1 heksadecimalna cifra) da dobijete ispravnu adresu povratka.Stack Canaries takođe treba da budu onemogućeni ili kompromitovana EIP adresa povratka nikada neće biti praćena.
Ostali primeri i Reference
32 bit, bez ASLR-a
64 bita sa ASLR-om, sa curenjem bin adrese
64 bita, bez ASLR-a
32 bita, bez ASLR-a, dvostruko malo preplavljivanje, prvo da preplavi stek i poveća veličinu drugog preplavljivanja
32 bita, relro, bez canary-a, nx, bez pie-a, formatiranje stringa za prepisivanje adrese
fflush
sa win funkcijom (ret2win)32 bita, nx, ništa drugo, delimično prepisivanje EIP-a (1 bajt) da bi se pozvala win funkcija
32 bita, nx, ništa drugo, delimično prepisivanje EIP-a (1 bajt) da bi se pozvala win funkcija
Program samo validira poslednji bajt broja da proveri veličinu unosa, stoga je moguće dodati bilo koju veličinu sve dok je poslednji bajt unutar dozvoljenog opsega. Zatim, unos stvara preplavljivanje bafera koje se eksploatiše sa ret2win.
64 bita, relro, bez canary-a, nx, pie. Delimično prepisivanje da bi se pozvala win funkcija (ret2win)
arm64, PIE, daje PIE curenje win funkcije koja zapravo ima 2 funkcije pa ROP gedžet koji poziva 2 funkcije
ARM64, off-by-one da pozove win funkciju
Primer za ARM64
pageRet2win - arm64Last updated