追一波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
如果新来的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如下: