Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfBasic Information
ret2csu ni mbinu ya udukuzi inayotumika 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 kwa ajili ya kusimamia jinsi vipande tofauti vya programu vinavyoongea na kila mmoja. Miongoni mwa kazi hizi kuna baadhi ya vito vilivyofichwa ambavyo vinaweza kutenda kama gadgets zetu zinazokosekana, hasa moja inayoitwa __libc_csu_init
.
The Magic Gadgets in __libc_csu_init
Katika __libc_csu_init
, kuna mfuatano mbili za maagizo (gadgets) za kuangazia:
Mfuatano wa kwanza unaturuhusu kuweka thamani katika register kadhaa (rbx, rbp, r12, r13, r14, r15). Hizi ni kama nafasi ambapo tunaweza kuhifadhi nambari au anwani tunazotaka kutumia baadaye.
Hii gadget inatupa uwezo wa kudhibiti hizi registers kwa kupopoa thamani kutoka kwenye stack ndani yao.
Mfululizo wa pili unatumia thamani tulizoweka kufanya mambo kadhaa:
Hamisha thamani maalum kwenye registers nyingine, na kuziandaa kwa ajili yetu kuzitumia kama vigezo katika kazi.
Fanya wito kwa eneo lililopangwa kwa kujumlisha thamani katika r15 na rbx, kisha kuzidisha rbx kwa 8.
Labda hujui anwani yoyote ya kuandika hapo na unahitaji amri ya
ret
. Kumbuka kwamba gadget ya pili pia itamalizika kwaret
, lakini utahitaji kukutana na masharti fulani ili kufikia hiyo:
Masharti yatakuwa:
[r12 + rbx*8]
lazima iwe inaelekeza kwenye anwani inayohifadhi kazi inayoweza kuitwa (ikiwa huna wazo na hakuna pie, unaweza kutumia tu kazi ya_init
):Ikiwa _init iko kwenye
0x400560
, tumia GEF kutafuta kiashiria katika kumbukumbu kwake na ufanye[r12 + rbx*8]
kuwa anwani yenye kiashiria cha _init:
rbp
narbx
lazima wawe na thamani sawa ili kuepuka kurukaKuna baadhi ya pops zilizokosekana unahitaji kuzingatia
RDI na RSI
Njia nyingine ya kudhibiti rdi
na rsi
kutoka kwa gadget ya ret2csu ni kwa kufikia ofseti maalum:
Angalia ukurasa huu kwa maelezo zaidi:
BROP - Blind Return Oriented ProgrammingMfano
Kutumia wito
Fikiria unataka kufanya syscall au kuita kazi kama write()
lakini unahitaji thamani maalum katika register za rdx
na rsi
kama vigezo. Kawaida, ungeangalia gadgets ambazo zinaweka register hizi moja kwa moja, lakini huwezi kupata yoyote.
Hapa ndipo ret2csu inapoingia:
Weka Register: Tumia gadget ya kwanza ya kichawi kupop values kutoka kwenye stack na kuingia rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), na r15.
Tumia Gadget ya Pili: Ukiwa na register hizo zimewekwa, unatumia gadget ya pili. Hii inakuwezesha kuhamasisha thamani zako ulizochagua katika
rdx
narsi
(kutoka r14 na r13, mtawalia), ukitayarisha vigezo kwa wito wa kazi. Zaidi ya hayo, kwa kudhibitir15
narbx
, unaweza kufanya programu iite kazi iliyoko kwenye anwani unayoihesabu na kuweka katika[r15 + rbx*8]
.
Una mfano unaotumia mbinu hii na kuielezea hapa, na hii ndiyo exploit ya mwisho iliyotumika:
Kumbuka kwamba exploit iliyopita haikusudiwi kufanya RCE
, inakusudia tu kuita kazi inayoitwa win
(ikichukua anwani ya win
kutoka stdin inayoita gets katika mnyororo wa ROP na kuihifadhi katika r15) na hoja ya tatu yenye thamani 0xdeadbeefcafed00d
.
Kupita simu na kufikia ret
Exploit ifuatayo ilitolewa kutoka kwenye ukurasa huu ambapo ret2csu inatumika lakini badala ya kutumia simu, in akipita kulinganisha na kufikia ret
baada ya simu:
Kwa Nini Usitumie libc Moja kwa Moja?
Kawaida kesi hizi pia zina udhaifu wa ret2plt + ret2lib, lakini wakati mwingine unahitaji kudhibiti vigezo zaidi kuliko vile ambavyo vinaweza kudhibitiwa kwa urahisi na gadgets unazozipata moja kwa moja katika libc. Kwa mfano, kazi ya write()
inahitaji vigezo vitatu, na kupata gadgets za kuweka yote haya moja kwa moja huenda isiwezekane.
Last updated