Ret2esp / Ret2reg
Last updated
Last updated
Jifunze na zoea AWS Hacking:Mafunzo ya HackTricks AWS Red Team Expert (ARTE) Jifunze na zoea GCP Hacking: Mafunzo ya HackTricks GCP Red Team Expert (GRTE)
Kwa sababu ESP (Stack Pointer) daima inaelekeza juu ya stack, mbinu hii inahusisha kubadilisha EIP (Instruction Pointer) na anwani ya maagizo ya jmp esp
au call esp
. Kwa kufanya hivi, shellcode inawekwa moja kwa moja baada ya EIP iliyobadilishwa. Wakati maagizo ya ret
yanatekelezwa, ESP inaelekeza kwenye anwani inayofuata, mahali ambapo shellcode imehifadhiwa kwa usahihi.
Ikiwa Address Space Layout Randomization (ASLR) haijashughulikiwa kwenye Windows au Linux, inawezekana kutumia maagizo ya jmp esp
au call esp
yaliyopatikana kwenye maktaba za pamoja. Walakini, na ASLR ikiwa imewashwa, inaweza kuhitajika kutafuta maagizo haya ndani ya programu yenye kasoro yenyewe (na unaweza kuhitaji kushinda PIE).
Zaidi ya hayo, kuweza kuweka shellcode baada ya uharibifu wa EIP, badala ya katikati ya stack, kuhakikisha kuwa maagizo ya push
au pop
yanayotekelezwa wakati wa operesheni ya kazi hayavurugi shellcode. Kuvuruga huku kunaweza kutokea ikiwa shellcode ingewekwa katikati ya stack ya kazi.
Ikiwa unakosa nafasi ya kuandika baada ya kubadilisha RIP (labda tu baadhi ya baiti), andika shellcode ya awali ya jmp
kama:
Na andika shellcode mapema kwenye stack.
Unaweza kupata mfano wa mbinu hii katika https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp na shambulio la mwisho kama:
Unaweza kuona mfano mwingine wa mbinu hii katika https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Kuna kipeperushi cha kujaza bila NX kuwezeshwa, hutumiwa kifaa cha kupunguza anwani ya $esp
na kisha jmp esp;
kuruka kwenye shellcode:
Vivyo hivyo, ikiwa tunajua kwamba kazi inarudisha anwani ambapo shellcode imewekwa, tunaweza kutumia maagizo ya call eax
au jmp eax
(inayojulikana kama mbinu ya ret2eax), ikitoa njia nyingine ya kutekeleza shellcode yetu. Kama eax, daftari lingine lolote lenye anwani ya kuvutia linaweza kutumika (ret2reg).
Unaweza kupata mifano hapa:
strcpy
itahifadhiwa katika eax
anwani ya buffer ambapo shellcode ilihifadhiwa na eax
haibadilishwi, hivyo niwezekana kutumia ret2eax
.
Katika ARM64 hakuna maagizo yanayoruhusu kuruka kwenye daftari la SP. Inaweza kuwa inawezekana kupata kifaa kinachosonga sp kwa daftari kisha kuruka kwenye daftari hilo, lakini katika libc ya kali yangu sikuweza kupata kifaa kama hicho:
Niliyogundua pekee zitabadilisha thamani ya usajili ambapo sp ilikopiwa kabla ya kuruka kwenda kwake (hivyo itakuwa haifai):
Ikiwa usajili una anwani ya kuvutia ni rahisi kuruka kwenda kwake kwa kupata maagizo sahihi. Unaweza kutumia kitu kama:
Katika ARM64, ni x0
ambaye huchukua thamani ya kurudi kwa kazi, kwa hivyo inaweza kuwa kwamba x0 inahifadhi anwani ya buffer inayodhibitiwa na mtumiaji na shellcode ya kutekelezwa.
Mfano wa nambari:
Kwa kuchunguza disassembly ya kazi, ni wazi kuona kwamba anwani ya buffer (inayoweza kudhuriwa na kudhibitiwa na mtumiaji) imehifadhiwa katika x0
kabla ya kurudi kutoka kwa buffer overflow:
Pia ni rahisi kupata kifaa cha br x0
katika kazi ya do_stuff
:
Tutatumia kifaa hicho kuruka kwenda kwake kwa sababu binary imekamilika BILA PIE. Kwa kutumia mfano, ni wazi kuona kwamba kielelezo cha buffer overflow ni 80, hivyo shambulio litakuwa:
Ikiwa badala ya fgets
ingetumika kitu kama read
, ingewezekana kukiuka PIE pia kwa kuweka tu byte za mwisho 2 za anwani ya kurudi kurudi kwenye maagizo ya br x0;
bila haja ya kujua anwani kamili.
Na fgets
haitafanyi kazi kwa sababu inaweka null (0x00) byte mwishoni.
NX: Ikiwa steki haiwezi kutekelezwa hii haitasaidia kwani tunahitaji kuweka shellcode kwenye steki na kuruka kuitekeleza.
Jifunze & zoezi la Udukuzi wa AWS:Mafunzo ya HackTricks AWS Red Team Expert (ARTE) Jifunze & zoezi la Udukuzi wa GCP: Mafunzo ya HackTricks GCP Red Team Expert (GRTE)