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

重点