2022巅峰极客-pwn
本文最后更新于:2023年10月15日 晚上
Gift
程序中仅允许创建10
个chunk
,但在remove_gift
函数中存在uaf
,bargain
函数可以用来修改chunk
的fd
,且可以输入负数让fd
向大地址偏移,但只能修改低四字节,经过测试,靶机中libc
版本为libc_2.27
~libc_2.31
,所以可以利用tcache bin attack
,在free_hook
的位置写入one_gadget
函数,来获取shell
,使用正常的方法先释放7
个chunk
填满tcache bin
,再释放一个chunk
,使其进入unsorted bin
来获取libc
地址,这时已经创建了8
个chunk
,bargain
函数又不能修改整个fd
字段,所以这种方法不行,不过可以利用bargain
修改tcache bin
的结构,让原本释放过的chunk
,再次释放,这样可以省下一开始创建chunk
的数量,又可以构造double free
达到tcache bin attack
1 |
|
smallcontainer
问题出在check函数中,check
函数会检测被修改的chunk
的数据,直到某个字节为0
,这导致如果curr_chunk
的data
的每个字节都不为0
,且next_chunk
的size段
的第一个字节为0x11
时,程序会设置next_chunk
的size段
的第一个字节为0x00
,这样可以把next_chunk
的inuse
为设置为0,表示了当前chunk
是被释放的chunk
,如果能够把next_chunk
放入unsorted bin
,程序就会将curr_chunk
与next_chunk
合并,虽然当前chunk没有被释放
如果我们在从unsorted bin
中获取到chunk
,则在heappp数组
中就会存在两个指向同一chunk
的指针,这样就可以利用tcache bin attack
,在free_hook
中写入system
函数地址,执行system("/bin/sh");
1 |
|
happy_note
程序允许用户执行一次uaf
,并且允许用户从tcache bin
中获取两次chunk
,那么重点就是这唯一一次uaf
如何使用,我的想法是用于泄露chunk地址
和libc地址
,并用于修改small bin
中chunk
的bk字段
为某个tcache bin
的地址,tcache bin
的地址可以通过chunk
的地址进行计算,small bin
中chunk
逆序进入tcache bin
,这时当前tcache bin
的第一个成员就为某一个tcache bin
的地址,当我们在tcache bin
的地址创建一个chunk
,并修改tcache bin
的内容,就可以在一个任意地址创建chunk
,进行任意读写,因为libc2.34中删除了malloc_hook
,free_hook
,所以我们只能利用IO
调用system函数
或one_gadget
1 |
|
1 |
|