Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfOsnovne informacije
ret2csu je hakovanje tehnika koja se koristi kada pokušavate preuzeti kontrolu nad programom, ali ne možete pronaći gadgete koje obično koristite za manipulisanje ponašanjem programa.
Kada program koristi određene biblioteke (poput libc), ima neke ugrađene funkcije za upravljanje načinom na koji različiti delovi programa komuniciraju međusobno. Među ovim funkcijama postoje neke skrivene dragocenosti koje mogu delovati kao naši nedostajući gadgeti, posebno jedna nazvana __libc_csu_init
.
Čarobni Gadgeti u __libc_csu_init
U __libc_csu_init
, postoje dve sekvence instrukcija (gadgeti) koje treba istaći:
Prva sekvencija nam omogućava postavljanje vrednosti u nekoliko registara (rbx, rbp, r12, r13, r14, r15). To su poput slotova gde možemo čuvati brojeve ili adrese koje želimo koristiti kasnije.
Ova sprava nam omogućava da kontrolišemo ove registre tako što ćemo izbaciti vrednosti sa steka u njih.
Drugi niz koristi vrednosti koje smo postavili da uradi nekoliko stvari:
Premesti određene vrednosti u druge registre, pripremajući ih za korišćenje kao parametre u funkcijama.
Izvrši poziv na lokaciju određenu sabiranjem vrednosti u r15 i rbx, zatim množenjem rbx sa 8.
Možda ne znate nijednu adresu na koju biste mogli pisati i potreban vam je
ret
instrukcija. Imajte na umu da će drugi uređaj takođe završiti saret
, ali moraćete ispuniti neke uslove kako biste došli do njega:
Uslovi će biti:
[r12 + rbx*8]
mora pokazivati na adresu na kojoj se nalazi pozivna funkcija (ako nemate ideju i nema pie, možete jednostavno koristiti_init
funkciju):Ako je _init na adresi
0x400560
, koristite GEF da pretražite pokazivač u memoriji koji pokazuje na nju i postavite[r12 + rbx*8]
da bude adresa sa pokazivačem na _init:
rbp
иrbx
морају имати исту вредност да би се избегао скокПостоје неки пропуштени
pop
инструкције које треба узети у обзир
RDI и RSI
Још један начин за контролисање rdi
и rsi
из ret2csu гаджета је приступање одређеним офсетима:
Погледајте ову страницу за више информација:
BROP - Blind Return Oriented ProgrammingПример
Коришћење позива
Замислите да желите да направите системски позив или позвате функцију као што је write()
, али вам требају специфичне вредности у регистрима rdx
и rsi
као параметре. Обично бисте тражили гаджете који постављају ове регистре директно, али их не можете пронаћи.
Овде на сцену ступа ret2csu:
Поставите регистре: Користите први магични гаджет да избаците вредности са стека и у
rbx
,rbp
,r12
(edi),r13
(rsi),r14
(rdx) иr15
.Користите други гаджет: Са тим постављеним регистрима, користите други гаджет. Ово вам омогућава да преместите изабране вредности у
rdx
иrsi
(из r14 и r13, респективно), спремајући параметре за позив функције. Штавише, контролишућиr15
иrbx
, можете навести програм да позва функцију која се налази на адреси коју израчунавате и стављате у[r15 + rbx*8]
.
Имате пример коришћења ове технике и објашњење овде, а ово је крајњи експлоит који је коришћен:
Imajte na umu da prethodni exploit nije namenjen za RCE
, već samo da pozove funkciju nazvanu win
(uzimanje adrese win
sa stdin pozivanjem gets u ROP lancu i smeštanje u r15) sa trećim argumentom sa vrednošću 0xdeadbeefcafed00d
.
Bypassing the call and reaching ret
Sledeći exploit je izvučen sa ove stranice gde se koristi ret2csu ali umesto korišćenja poziva, zaobilazi poređenja i stiže do ret
nakon poziva:
Zašto ne koristiti libc direktno?
Obično su ovi slučajevi takođe ranjivi na ret2plt + ret2lib, ali ponekad morate kontrolisati više parametara nego što se lako kontrolišu pomoću gedžeta koje direktno pronađete u libc-u. Na primer, funkcija write()
zahteva tri parametra, a pronaći gedžete za postavljanje svih ovih direktno možda nije moguće.
Last updated