利用 _IO_2_1_stdout_ 泄露信息
IO_2_1_stdout_ 结构体

如果能够改结构体中的 flags
为 0x0FBAD1887
(原来的值 0xfbad2887
) 、改小 _IO_write_base
,那么之后一次在调用 puts
函数时会打印出 _IO_write_base
到 _IO_write_ptr
之间的数据,从而获得 libc
地址
1 | //部分源码 |
sctf_2019_one_heap
思路
题目只有
add
和delete
这两个功能,没有show
功能去leak
。delete
中存在UAF
可以进行double free
,并且题目使用的libc
版本是较老一点的libc-2.27
,利用tcache
进行double free
的时候不会有key
字段的检测,就可以进行任意地址堆块的分配,劫持__malloc_hook
为one_gadget
。没有
show
功能但是需要leak
的话就要用到上面提到的_IO_2_1_stdout_
这个结构体,利用unsorted bin
中指向main_arena
内部的指针降低爆破到_IO_2_1_stdout_
的概率,再利用上面的方法改结构体内的值实现泄露。为了获取到
unsorted bin
要利用double free
,使得当前大小tcache
的count
变为-1
,由于无符号数所以会分配到unsorted bin
(mp_.tcache_count
的数据类型是size_t
)delete
功能有限,要多申请一个堆块用来改tcache
的next
指针最后利用
realloc_hook
调栈帧
exp
基本参考抄的其他 wp:https://www.freesion.com/article/7253509267/
1 | #coding:utf8 |
利用 _IO_2_1_stdout_ 泄露信息