Stack Pivoting - EBP2Ret - EBP chaining
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Teknolojia hii inatumia uwezo wa kudhibiti Base Pointer (EBP) ili kuunganisha utekelezaji wa kazi nyingi kupitia matumizi makini ya register ya EBP na mfuatano wa amri leave; ret
.
Kumbuka, leave
kwa msingi inamaanisha:
And as the EBP is in the stack before the EIP it's possible to control it controlling the stack.
Hii mbinu ni muhimu hasa unapoweza kubadilisha register ya EBP lakini huna njia ya moja kwa moja kubadilisha register ya EIP. Inatumia tabia ya kazi wakati zinamaliza kutekeleza.
Ikiwa, wakati wa utekelezaji wa fvuln
, unafanikiwa kuingiza EBP bandia kwenye stack inayotaja eneo katika kumbukumbu ambapo anwani ya shellcode yako inapatikana (plus 4 bytes ili kuzingatia operesheni ya pop
), unaweza kudhibiti kwa njia isiyo ya moja kwa moja EIP. Wakati fvuln
inarudi, ESP inawekwa kwenye eneo hili lililotengenezwa, na operesheni inayofuata ya pop
inapunguza ESP kwa 4, kimsingi inafanya iwe pointing kwa anwani iliyohifadhiwa na mshambuliaji humo.
Kumbuka jinsi unavyohitaji kujua anwani 2: Ile ambayo ESP itakwenda, ambapo utahitaji kuandika anwani ambayo inatolewa na ESP.
Kwanza unahitaji kujua anwani ambapo unaweza kuandika data / anwani zisizo na mipaka. ESP itakuwa in pointing hapa na kufanya ret
ya kwanza.
Kisha, unahitaji kujua anwani inayotumiwa na ret
ambayo itafanya kodi zisizo na mipaka. Unaweza kutumia:
Anwani halali ya ONE_GADGET.
Anwani ya system()
ikifuatiwa na bytes 4 za takataka na anwani ya "/bin/sh"
(x86 bits).
Anwani ya gadget ya jump esp;
(ret2esp) ikifuatiwa na shellcode ya kutekeleza.
Mnyororo fulani wa ROP
Kumbuka kwamba kabla ya mojawapo ya hizi anwani katika sehemu iliyo na udhibiti wa kumbukumbu, lazima kuwe na 4
bytes kwa sababu ya sehemu ya pop
ya amri ya leave
. Itakuwa inawezekana kutumia hizi 4B kuweka EBP bandia ya pili na kuendelea kudhibiti utekelezaji.
Kuna toleo maalum la mbinu hii linalojulikana kama "Off-By-One Exploit". Inatumika unapoweza kubadilisha tu byte ya chini kabisa ya EBP. Katika hali kama hiyo, eneo la kumbukumbu linalohifadhi anwani ya kuruka kwa ret
lazima liwe na bytes tatu za kwanza zinazoshiriki na EBP, kuruhusu manipulasi kama hiyo kwa masharti yaliyopangwa zaidi.
Kawaida inabadilishwa byte 0x00 ili kuruka mbali iwezekanavyo.
Pia, ni kawaida kutumia RET sled kwenye stack na kuweka mnyororo halisi wa ROP mwishoni ili kuongeza uwezekano kwamba ESP mpya in pointing ndani ya RET SLED na mnyororo wa mwisho wa ROP unatekelezwa.
Kwa hivyo, kuweka anwani iliyo na udhibiti katika kiingilio cha EBP
cha stack na anwani ya leave; ret
katika EIP
, inawezekana kuhamasisha ESP
kwa anwani ya EBP
iliyo na udhibiti kutoka kwenye stack.
Sasa, ESP
inadhibitiwa ikielekeza kwenye anwani inayotakiwa na amri inayofuata ya kutekeleza ni RET
. Ili kutumia hii, inawezekana kuweka katika sehemu iliyo na udhibiti ya ESP hii:
&(next fake EBP)
-> Pakia EBP mpya kwa sababu ya pop ebp
kutoka kwa amri ya leave
system()
-> Inaitwa na ret
&(leave;ret)
-> Inaitwa baada ya mfumo kumaliza, itahamisha ESP kwa EBP bandia na kuanza tena
&("/bin/sh")
-> Param fro system
Kimsingi kwa njia hii inawezekana kuunganisha EBPs bandia kadhaa ili kudhibiti mtiririko wa programu.
Hii ni kama ret2lib, lakini ngumu zaidi bila faida dhahiri lakini inaweza kuwa ya kuvutia katika baadhi ya hali za ukingo.
Zaidi ya hayo, hapa una mfano wa changamoto inayotumia mbinu hii na stack leak ili kuita kazi ya kushinda. Hii ndiyo payload ya mwisho kutoka kwenye ukurasa:
Kama ilivyoelezwa katika chapisho hili, ikiwa binary imeandikwa kwa baadhi ya uboreshaji, EBP haitawahi kudhibiti ESP, kwa hivyo, exploit yoyote inayofanya kazi kwa kudhibiti EBP itashindwa kimsingi kwa sababu haina athari halisi. Hii ni kwa sababu prologue na epilogue hubadilika ikiwa binary imeboreshwa.
Haitaboreshwa:
Imara:
pop rsp
gadgetKatika ukurasa huu unaweza kupata mfano wa kutumia mbinu hii. Kwa changamoto hii ilihitajika kuita kazi yenye hoja 2 maalum, na kulikuwa na pop rsp
gadget na kuna leak kutoka kwenye stack:
Angalia mbinu ya ret2esp hapa:
64 bits, exploitation ya off by one na mchain ya rop ikianza na ret sled
64 bit, hakuna relro, canary, nx na pie. Programu inatoa leak kwa stack au pie na WWW ya qword. Kwanza pata leak ya stack na tumia WWW kurudi na kupata leak ya pie. Kisha tumia WWW kuunda loop ya milele ikitumia entries za .fini_array
+ kuita __libc_csu_fini
(maelezo zaidi hapa). Kwa kutumia "kuandika" hii "ya milele", imeandikwa mchain ya ROP katika .bss na kumaliza kwa kuitwa ikipivot na RBP.
Katika ARM64, prologue na epilogues za kazi hazihifadhi na kurejesha usajili wa SP katika stack. Zaidi ya hayo, amri ya RET
hairejeshi kwenye anwani inayotolewa na SP, bali kwenye anwani ndani ya x30
.
Hivyo, kwa kawaida, kwa kutumia epilogue huwezi kudhibiti usajili wa SP kwa kuandika data fulani ndani ya stack. Na hata kama unafanikiwa kudhibiti SP bado unahitaji njia ya kudhibiti usajili wa x30
.
prologue
epilogue
Njia ya kufanya kitu kinachofanana na stack pivoting katika ARM64 itakuwa kuwa na uwezo wa kudhibiti SP
(kwa kudhibiti usajili fulani ambao thamani yake inapitishwa kwa SP
au kwa sababu fulani SP
inachukua anwani yake kutoka stack na tuna overflow) na kisha kuandika epilogu ili kupakia usajili wa x30
kutoka SP
iliyo kudhibitiwa na RET
kwake.
Pia katika ukurasa ufuatao unaweza kuona sawa na Ret2esp katika ARM64:
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)