Ret2esp / Ret2reg
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)
Kwa sababu ESP (Stack Pointer) kila wakati inaelekeza kwenye kilele cha stack, mbinu hii inahusisha kubadilisha EIP (Instruction Pointer) na anwani ya jmp esp
au call esp
amri. Kwa kufanya hivyo, shellcode inawekwa moja kwa moja baada ya EIP iliyobadilishwa. Wakati amri ya ret
inatekelezwa, ESP inaelekeza kwenye anwani inayofuata, hasa mahali shellcode imehifadhiwa.
Ikiwa Address Space Layout Randomization (ASLR) haijawashwa katika Windows au Linux, inawezekana kutumia amri za jmp esp
au call esp
zinazopatikana katika maktaba za pamoja. Hata hivyo, ikiwa ASLR inafanya kazi, mtu anaweza kuhitaji kutafuta ndani ya programu iliyo hatarini kwa amri hizi (na unaweza kuhitaji kushinda PIE).
Zaidi ya hayo, kuwa na uwezo wa kuweka shellcode baada ya uharibifu wa EIP, badala ya katikati ya stack, inahakikisha kwamba amri zozote za push
au pop
zinazotekelezwa wakati wa operesheni ya kazi hazingilii shellcode. Kuingilia huku kunaweza kutokea ikiwa shellcode ingewekwa katikati ya stack ya kazi.
Ikiwa unakosa nafasi ya kuandika baada ya kubadilisha RIP (labda ni byte chache tu), andika shellcode ya awali ya jmp
kama:
Na uandike shellcode mapema kwenye stack.
Unaweza kupata mfano wa mbinu hii katika https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp ukiwa na exploit ya mwisho kama:
Unaweza kuona mfano mwingine wa mbinu hii katika https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Kuna overflow ya buffer bila NX iliyoanzishwa, inatumika gadget ili kupunguza anwani ya $esp
na kisha jmp esp;
kuruka kwenye shellcode:
Vivyo hivyo, ikiwa tunajua kazi inarudisha anwani ambapo shellcode imehifadhiwa, tunaweza kutumia maagizo ya call eax
au jmp eax
(yanayojulikana kama mbinu ya ret2eax), ikitoa njia nyingine ya kutekeleza shellcode yetu. Kama vile eax, usajili mwingine wowote unaoshikilia anwani ya kuvutia unaweza kutumika (ret2reg).
Unaweza kupata mifano kadhaa hapa:
strcpy
itahifadhi katika eax
anwani ya buffer ambapo shellcode ilihifadhiwa na eax
haijapewa thamani mpya, hivyo inawezekana kutumia ret2eax
.
Katika ARM64 hakuna maagizo yanayoruhusu kuruka kwenye usajili wa SP. Inaweza kuwa inawezekana kupata gadget inayoweza kuhamasisha sp kwenye usajili kisha kuruka kwenye usajili huo, lakini katika libc ya kali yangu sikuweza kupata gadget kama hiyo:
Niliyogundua pekee ingekuwa kubadilisha thamani ya rejista ambapo sp ilikopwa kabla ya kuruka kwake (hivyo ingekuwa isiyo na maana):
Ikiwa rejista ina anwani ya kuvutia, inawezekana kuruka kwake kwa kutafuta tu maagizo sahihi. Unaweza kutumia kitu kama:
Katika ARM64, ni x0
ambaye huhifadhi thamani ya kurudi ya kazi, hivyo inaweza kuwa kwamba x0 huhifadhi anwani ya buffer inayodhibitiwa na mtumiaji yenye shellcode ya kutekeleza.
Mfano wa msimbo:
Kuangalia disassembly ya kazi inawezekana kuona kwamba anwani ya buffer (iliyokuwa na udhaifu wa bof na inayodhibitiwa na mtumiaji) imehifadhiwa katika x0
kabla ya kurudi kutoka kwa buffer overflow:
Pia inawezekana kupata gadget br x0
katika kazi ya do_stuff
:
Tutatumia gadget hiyo kuruka kwake kwa sababu binary imeandikwa BILA PIE. Kwa kutumia muundo inawezekana kuona kwamba offset ya buffer overflow ni 80, hivyo exploit itakuwa:
Ikiwa badala ya fgets
ilitumika kitu kama read
, ingekuwa inawezekana kupita PIE pia kwa kuandika tena tu bytes 2 za mwisho za anwani ya kurudi ili kurudi kwenye amri ya br x0;
bila kuhitaji kujua anwani kamili.
Kwa fgets
haiwezekani kwa sababu in ongeza byte ya null (0x00) mwishoni.
NX: Ikiwa stack haiwezi kutekelezwa hii haitasaidia kwani tunahitaji kuweka shellcode kwenye stack na kuruka ili kuitekeleza.
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)