off_by_null—-从null戳到getshell
| 0 | 前言
好久没写博客了……最近发生了很多事情,有点疲惫 :_(
选择了二进制安全,再痛苦也要走完,只是最近精神上有些失落 :(
好羡慕铃仙师傅啊
| 1 | 基础知识
在ctf的二进制安全的对堆利用板块,有一种特殊的漏洞 : off_by_null
这种漏洞指的是我们能对一个堆块越界写一个字节,且这个字节是'\x00'
从直觉上看,这几乎没有任何一点点利用价值 heap_overflow >> off_by_one >> off_by_null
修改哪里
我们想要利用这个null戳,肯定需要向下个堆块写入
当我们申请的堆块大小以8结尾时,next_chunk的pre_size位会被复用,此时我们可以向下个堆块的pre_size
位的下个字节写入null
此时我们写的结构是next_chunk
的size
的低8位
而next_chunk的size的低三位是三个标志位,分别代表
1 | /* size 字段的低三位: */ |
mmap
与arena
位的用处不大,pre_inuse
位却很有用:它标记着前一个堆块是否处于使用中
如果我们修改了这个标记,就能混淆前个堆块在ptmalloc
中的状态,有可能在unlink
合并时出现堆块重叠的情况
堆块合并
从上述的思维链,我们可以看到,最重要的一步是借助ptmalloc
的unlink
完成free
状态的堆块合并
在不同版本中,unlink
的检查也不大一样
所以off_by_null
利用的关键,也是对各个版本unlink
检查的绕过
| 2 | 不同版本下的 house of einherjar
house of einherjar
指的是一种特定的对风水模式,专门用于处理off_by_null
类型漏洞
其中以2.27作为分隔版本,前后产生了两种存在细微差距的手法