-
-
[原创]强网杯线下赛堆分配检查机制(lowbits leak check)
-
发表于:
2018-4-18 21:52
11680
-
[原创]强网杯线下赛堆分配检查机制(lowbits leak check)
我们Flappypig
战队经过探索,设计并实现了一种新颖的堆分配检查机制(lowbits leak check),可以检测修改预期堆分配结构使得漏洞利用失效的通用防御方法
,并应用到了本次强网杯线下赛的pwn
类型题目的checker
中,下面给大家介绍一下这种checker
机制。
按照linux
内存分配机制,在每个进程默认创建时会预先分配堆栈空间,默认堆栈空间的大小是4K(0x1000=4096),然后进程再分配空间是使用malloc
对这4k
大小进行管理,如果超过了4k
再向内核申请。所以,在用户空间下,总堆块大小不超过4k
的情况下,malloc
返回的堆地址在低12bit(0xfff)
是变化的,而前面的比特是相对不变(随着ASLR变化)的。
那么这就给了我们在CTF线下赛
中一种针对堆漏洞的Checker
的思路,我们在程序交互中预先在每次malloc
后,把堆地址的低12bit
输出。
然后正常设计堆漏洞(UAF、Double Free、off by Null),再写Checker
脚本时,通过不断申请、释放不同大小的堆块,可以检查出选手对漏洞修补过程中,是否有nop掉free函数或者改大malloc(size)
等破坏预期堆分配逻辑的操作。
强网杯-secular-checker脚本部分示例
可以看到脚本中间有一个地方是申请了0xf0
大小的堆块,然后得到预期地址尾部应该是0x200
,然后后面释放之后再次申请了0xf0
大小的内存,所以预期情况下应该是会重新分配到0x200
这个空闲的堆块上,如果选手在修补过程中,nop
了free
操作,那么分配不到0x200
上,便可以判定check down
。本次线下赛,使用了这种checker机制
,第一天查出了许多队伍使用nop掉free
的套路,但是没有想到主办方还有这种sao操作,所以被判down了。
这种全新的方法可以用于日后的线下赛参考,借某大佬的评价全新的堆check方式会被大家广泛使用,线下赛不适宜出堆将成为过去时。
所以,以后大家还是好好针对漏洞点修补漏洞吧。此处at某wings
如果大家对线下赛pwn
类型题目的checker
还有什么好的想法,欢迎交流。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!