glibc-2.39:house_of_apple2


追一波libc版本~~

在glibc-2.38版本中,笔者测试发现需要在0x88偏移的位置(应该还是_lock字段)照抄_IO_2_1_stderr的偏移0x88的位置的值,如果仅仅是写入一个合法的地址,那么将会陷入到一个死循环中;之后笔者就成功劫持了控制流,但是由于开了保护,需要orw但是笔者没有找到合适的栈迁移gadget也就没继续下去;

逆向分析

add_note

0x410~0x1000之间的chunk,largebin范围;

下标不可以复用;

free_note

漏洞是UAF;

show_note

printf+%s输出;

edit_note

正常read,没有溢出;

exit

exit(0);

largebin attack

largebin共占用bins数组中的64个bin,且氛围6个组,每个组的公差不一样。可以理解为这64个largebin各自管理一个范围,但是范围的大小不尽相同;

fd-bk域

largebin的头会参与进来

fd-bk管理了一个largebin中的所有chunk;

里边的chunk按照大小顺序进行排列,相同大小的chunk就按照进入的时间顺序进行排列;

bk由小指向大,相同大小则看时间先后,fd反之;

fd/bk-nextsize

fd/bk-nextsize域的引入纯粹是为了加速chunk的寻找,是一个附加产品;

fd_nextsize和bk_nextsize用于指向第一个与自己大小不同的chunk,所以也只有在加入了大小不同的chunk时这两个指针才有可能被修改;

相当于从多个相同size的chunk中选出一个代表,它们组成一个双链表(largebin头不参与),加快查找速度。

attack

source code

如果新来的chunk严格最小,然后largebin中最大chunk的bk_next域被写入了goal-0x20,则在上图中第8行会将goal-0x20写入到victim->bk_nextsize中,然后到了第9行的时候,直接使用这个地址,将其fd_nextsize域里写入victim,也就实现了向goal中写入victim地址;

所以,对于largebin attack的利用方法总结如下:

house_of_apple2

栈迁移打法

在glibc-2.39找到了一个magic可以用:

发现house_of_apple2执行的时候,rax、rbx、rdi都指向f1_addr:

所以找到如下magic:

对于rdx的控制要用下面这个gadget:

setcontext+61如下:


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录