stdout
[TOC] 遇到puts或printf,就会将_IO_write_base指向的内容打印出来。实际操作中发现如果是write函数还不行
代码
这里给出爆破的模板
while True:
try:
p=process(file)
exp()
break
except:
p.close()
continue
trick
覆盖一字节泄露libcbase
- add(0x40,p64(0xfbad1887)+p64(0)*3+b’\x00')
- 图示
直接gdb.attach到这个位置查看泄露出来的是什么然后手动算偏移
- 原理
对于一个libc里面的函数,其地址为libcbase+libc.sym[’…’],_IO_2_1_stdout_和main_arena非常接近,因此覆盖2字节后只有1位不同(在此图中是4和3不同),因此要进行爆破,1/16概率
泄露retaddr
- add(0x80,p64(0xfbad1800)+p64(0)*3+p64(environ)+p64(environ+8))
- dbg手算泄露的environ的值与retaddr的相对偏移
一些比较细节的东西
- 注意这里的指针有多少次解引用,如果一个chunk在unsortedbin或者largebin中,其fd加上这个getnum,就可以让stdout里面的位置置0
flags规则
flags很重要,因为这决定的函数的走向
puts()函数执行流程
具体细节见博客 经过一系列调用最后进行系统调用 _IO_puts -> _IO_new_file_xsputn -> _IO_OVERFLOW -> _IO_do_write -> new_do_write -> _IO_SYSWRITE
重点