Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfMaelezo Msingi
ret2csu ni mbinu ya udukuzi inayotumiwa unapojaribu kuchukua udhibiti wa programu lakini huwezi kupata gadgets unazotumia kawaida kubadilisha tabia ya programu.
Wakati programu inatumia maktaba fulani (kama libc), ina baadhi ya kazi zilizojengwa ndani ya kusimamia jinsi sehemu tofauti za programu zinavyozungumza na nyingine. Kati ya kazi hizi kuna baadhi ya vitu vya thamani vinavyoweza kutenda kama gadgets zetu zilizopotea, hasa moja inayoitwa __libc_csu_init
.
Gadgets za Kichawi katika __libc_csu_init
Katika __libc_csu_init
, kuna mfululizo wa maagizo (gadgets) ya kutiliwa maanani:
Mfululizo wa kwanza uturuhusu kuweka thamani katika rejista kadhaa (rbx, rbp, r12, r13, r14, r15). Hizi ni kama nafasi ambapo tunaweza kuhifadhi nambari au anwani tutakazotumia baadaye.
Kifaa hiki kinaturuhusu kudhibiti hizi rejista kwa kuzitoa thamani kwenye steki na kuziweka.
Mfuatano wa pili hutumia thamani tulizoweka kufanya mambo kadhaa:
Kuhamisha thamani maalum kwenye rejista nyingine, kuzifanya ziwe tayari kwetu kutumia kama parameta katika kazi.
Kufanya wito kwenye eneo lililodhamiriwa kwa kuongeza thamani katika r15 na rbx, kisha kuzidisha rbx mara 8.
Labda hujui anwani yoyote ya kuandika hapo na unahitaji maagizo ya
ret
. Kumbuka kuwa kifaa cha pili pia kitamalizika kwaret
, lakini utahitaji kukutana na hali fulani ili kuifikia:
The conditions will be:
[r12 + rbx*8]
lazima iwe inaelekeza kwenye anwani inayohifadhi kazi inayoweza kuitwa (ikiwa hakuna wazo na hakuna pie, unaweza kutumia kazi ya_init
):Ikiwa _init iko kwenye
0x400560
, tumia GEF kutafuta kidude kumbukumbu kinachoelekeza kwake na ufanye[r12 + rbx*8]
iwe anwani yenye kidude kinachoelekeza kwa _init:
rbp
narbx
lazima kuwa na thamani sawa ili kuepuka kurukaKuna pops zilizopuuzwa ambazo unahitaji kuzingatia
RDI na RSI
Njia nyingine ya kudhibiti rdi
na rsi
kutoka kwa kifaa cha ret2csu ni kwa kufikia vipimo maalum:
Angalia ukurasa huu kwa habari zaidi:
BROP - Blind Return Oriented ProgrammingMfano
Kutumia wito
Fikiria unataka kufanya syscall au kuita kazi kama write()
lakini unahitaji thamani maalum katika rejista za rdx
na rsi
kama paramita. Kawaida, ungeangalia vifaa vya kielelezo ambavyo hupanga rejista hizi moja kwa moja, lakini huwezi kupata yoyote.
Hapa ndipo ret2csu inapoingia:
Wekeza Rejista: Tumia kifaa cha kichawi cha kwanza kupata thamani kutoka kwenye steki na kuingiza kwenye rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), na r15.
Tumia Kifaa cha Pili: Ukiwa na rejista hizo zilizowekwa, tumia kifaa cha pili. Hii inakuruhusu kuhamisha thamani zako zilizochaguliwa kwenye
rdx
narsi
(kutoka r14 na r13, mtawalia), tayari kwa wito wa kazi. Zaidi ya hayo, kwa kudhibitir15
narbx
, unaweza kufanya programu iite kazi iliyoko kwenye anwani unayohesabu na kuweka kwenye[r15 + rbx*8]
.
Una mfano ukitumia mbinu hii na kuiweka wazi hapa, na hii ndio shambulio la mwisho lililotumika:
Tafadhali elewa kuwa shambulio lililopita halikusudiwi kufanya RCE
, lilikuwa linakusudia tu kuita kazi iliyoitwa win
(ikichukua anwani ya win
kutoka stdin ikitoa wito wa gets katika mnyororo wa ROP na kuihifadhi katika r15) na hoja ya tatu yenye thamani 0xdeadbeefcafed00d
.
Kupitisha wito na kufikia ret
Shambulio lifuatalo lilichimbuliwa kutoka kwenye ukurasa huu ambapo ret2csu inatumika lakini badala ya kutumia wito, inapitisha mikataba na kufikia ret
baada ya wito:
Kwa Nini Tusitumie libc Moja kwa moja?
Kawaida kesi hizi pia ni dhaifu kwa ret2plt + ret2lib, lakini mara nyingine unahitaji kudhibiti vigezo zaidi kuliko inavyoweza kudhibitiwa kwa urahisi na vifaa unavyopata moja kwa moja katika libc. Kwa mfano, kazi ya write()
inahitaji vigezo vitatu, na kupata vifaa vya kuweka hivi moja kwa moja huenda ikawa haiwezekani.
Last updated