KCTF2019 SleepingDunhuang
前言
这题太坑了,最开始edit的次数限制是2,做出来之后远程一直不通,问了客服才知道临时换题了,目次2次有多解,事实证明2次的确多解了,嗨呀早点做就好了。
程序逻辑
程序有4个功能,但是使用起来有诸多限制。
Malloc的地址限制在bss某个地址上的值[0,800]范围内,这里初始化成heap_base,有个gift可以泄露堆地址。啊对每次Malloc(0x28)但是读0x29,可以off-by-one,修改下一个chunk的prev_size和size的低字节。
Free应该没什么毛病
Edit只能有一次机会。
漏洞利用
看了下出题人的发帖,似乎之前普及过unlink的出题思路2333,首先要泄露出来libc,构造unsorted bin。使用off-by-one申请chunk[i],然后修改chunk[i+1]的size为0x90并释放chunk[i+1],最终free7个0x90的块,此后0x90再释放就会进unsorted bin。
之后最开始我构造overlap chunk然后double free到一个释放的unsorted bin上修改其prev_size和size,实际上不用这么麻烦(且之后会出问题),可以先free一个中间块,再malloc它,在其中构造fake_chunk(大小为0x20)+0x20+’\x90’从而使其下一个chunk的prev_size为0x20,size为0x90,之前我们提到再释放0x90的块就会使其进入unsorted bin,现在释放这个chunk即可unlink。之后再add两次就可以得到重合堆块了,从而double free。
具体地,我们先对0x404178位置的块进行unlink,铺垫一下。
之后用double free分配到第一个堆块(这个堆地址存储在0x404060中),对这个块再用相同的方法unlink,从而使得0x404060的值为0x404048,进而Malloc的限制变成了0x404048-0x404048+0x800,我们用Edit编辑0x404060-0x404088,伪造一个假堆块0x404060,0x404078填0x404070即可free0x404060这个块到tcache里,再malloc就可以绕过检查,编辑0x404070开始的0x28区域,去掉所有的限制,之后free_hook改成system,Free一个”/bin/sh\x00”的块即可执行system(“/bin/sh\x00”)
exp.py
1 | #coding=utf-8 |