boring_heap
挺不错的一题
先看一眼保护–全开
程序功能:
1 | 1.Add |
程序漏洞主要存在update函数中
1 | unsigned __int64 update() |
这里abs函数取绝对值可以用0x80000000
绕过(abs(0x80000000) = 0x80000000)但是后面再%size,写个c验证一下可以发现
1 | 0x80000000 % 0x30 = 0 |
所以这里就存在了一个向上溢出0x20大小的空间,所以就可以修改到size
再来看delete函数中,UAF
1 | unsigned __int64 delete() |
到这里就可以拿到libc了,但是因为add限制了size为0x30,0x40,0x50
并不能申请0x60,也就是不能直接通过UAF申请到malloc_hook上方的fack_chunk来覆盖malloc_hook为onegadget;
这里换一种思路,修改top_chunk到malloc_hook:
众所周知glibc分箱式管理中,fastbin链保存在main_arena上,所以可以通过UAF留个0x51,再将main_arena申请出来修改main_arena+88
为malloc_hook上方即可
exp:
1 | #coding:utf-8 |
login
Delete功能中存在UAF,login功能中只要登录成功就会打印出密码
那么,我们就可以通过login功能一位一位地爆破出密码,因为没开PIE,所以可以直接爆出free@got,再UAF修改free_hook为system即可
exp:
1 | from pwn import * |
slient_note
好可惜的一题,可能太久没利用got表泄漏地址,迟钝了
checksec
1 | Arch: amd64-64-little |
可以看到RELOR强度只开到Partial,也就是说got 表可改
再来看一下功能
Add
1 | unsigned __int64 sub_400AEC() |
只能申请两种大小的堆0x28
和0x208
,而且用calloc,也就是申请后会清空内容,两种大小的块用两个全局变量存放,且都只能放一个
delete
1 | unsigned __int64 sub_400BCF() |
存在UAF
思路:unlink然后修改got表得到地址,再将free@got修改为system ,free(‘/bin/sh\x00’) get shell
具体操作就不多解释了
1 | #coding:utf-8 |