SROP - Sigreturn-Oriented Programming
Osnovne informacije
Sigreturn
je poseban sistemski poziv (syscall) koji se uglavnom koristi za čišćenje nakon što je rukovalac signala završio svoje izvršavanje. Signali su prekidi koje operativni sistem šalje programu, često da bi ukazao da se desila neka izuzetna situacija. Kada program primi signal, privremeno pauzira svoj trenutni rad kako bi obradio signal pomoću rukovaoca signala, posebne funkcije dizajnirane za rukovanje signalima.
Nakon što rukovalac signala završi, program mora da nastavi svoje prethodno stanje kao da se ništa nije desilo. Tu dolazi do izražaja sigreturn
. Pomaže programu da vrati se iz rukovaoca signala i vraća stanje programa čišćenjem okvira steka (sekcija memorije koja čuva pozive funkcija i lokalne promenljive) koji je korišćen od strane rukovaoca signala.
Interesantan deo je kako sigreturn
vraća stanje programa: to čini tako što sve vrednosti registara CPU-a čuva na steku. Kada signal više nije blokiran, sigreturn
izbacuje ove vrednosti sa steka, efikasno resetujući registre CPU-a na njihovo stanje pre rukovanja signalom. To uključuje registar pokazivača steka (RSP), koji pokazuje na trenutni vrh steka.
Pozivanjem sistemskog poziva sigreturn
iz ROP lanca i dodavanjem vrednosti registara koje želimo da učita na stek moguće je kontrolisati sve vrednosti registara i stoga pozvati na primer sistemski poziv execve
sa /bin/sh
.
Primetite kako bi ovo bio tip Ret2syscall koji olakšava kontrolisanje parametara za pozivanje drugih Ret2syscall-ova:
pageRet2syscallAko ste radoznali, ovo je struktura sigcontext-a smeštena na steku kako bi se kasnije povratile vrednosti (dijagram sa ovde):
Za bolje objašnjenje pogledajte i:
Primer
Možete pronaći primer ovde gde je poziv za signeturn konstruisan putem ROP-a (stavljanjem vrednosti 0xf
u rxa), iako je ovo konačan eksploit od tamo:
Proverite i exploit ovde gde je binarni fajl već pozivao sigreturn
i stoga nije potrebno to izgraditi sa ROP:
Ostali primeri i reference
Binarni fajl na asembleru koji omogućava pisanje na stek i zatim poziva
sigreturn
sistemski poziv. Moguće je pisati na stek ret2syscall putem sigreturn strukture i pročitati zastavu koja se nalazi u memoriji binarnog fajla.Binarni fajl na asembleru koji omogućava pisanje na stek i zatim poziva
sigreturn
sistemski poziv. Moguće je pisati na stek ret2syscall putem sigreturn strukture (binarni fajl sadrži string/bin/sh
).64 bita, bez relro-a, bez canary-ja, nx, bez pie-a. Jednostavno preplavljivanje bafera zloupotrebom
gets
funkcije sa nedostatkom gedžeta koji izvršava ret2syscall. ROP lanac upisuje/bin/sh
u.bss
pozivajući ponovo gets, zloupotrebljavaalarm
funkciju da postavi eax na0xf
kako bi pozvao SROP i izvršio shell.64 bitni program na asembleru, bez relro-a, bez canary-ja, nx, bez pie-a. Tok omogućava pisanje na stek, kontrolu nekoliko registara, poziv sistemskog poziva i zatim poziva
exit
. Izabrani sistemski poziv jesigreturn
koji će postaviti registre i premestitieip
da pozove prethodnu instrukciju sistema i pokrenememprotect
da postavi prostor binarnog fajla narwx
i postavi ESP u prostor binarnog fajla. Nastavljajući tok, program će ponovo pozvati read u ESP, ali u ovom slučaju ESP će pokazivati na sledeću instrukciju tako da će prosleđivanje shell koda napisati ga kao sledeću instrukciju i izvršiti je.SROP se koristi da se daju privilegije izvršavanja (memprotect) na mestu gde je smešten shell kod.
Last updated