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 | |