0x00 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)
等破坏预期堆分配逻辑的操作。
0x01 举例分析
强网杯-secular-checker脚本部分示例
cur=build(io,0x90,'a\n')
#print 'low_address->0x%03x'%(cur)
if cur!=0x070:
raise Exception("Heap_check error")
cur=build(io,0xa0,'b\n',777)
print 'low_address->0x%03x'%(cur)
if cur!=0x130:
raise Exception("Heap_check error")
cur=build(io,0xf0,'c\n')
print 'low_address->0x%03x'%(cur)
if cur!=0x200:
raise Exception("Heap_check error")
cur=build(io,0x100,'d\n',777)
print 'low_address->0x%03x'%(cur)
if cur!=0x320:
raise Exception("Heap_check error")
cur=build(io,0x30,'d\n')
print 'low_address->0x%03x'%(cur)
if cur!=0x450:
raise Exception("Heap_check error")
delete(io,2)
delete(io,3)
cur=build(io,0xa0,'d\n',777)
print 'low_address->0x%03x'%(cur)
if cur!=0x200:
raise Exception("Heap_check error")
cur=build(io,0xf0,'d\n',999)
print 'low_address->0x%03x'%(cur)
if cur!=0x490:
raise Exception("Heap_check error")
delete(io,1)
cur=build(io,0x90,'d\n',999)
print 'low_address->0x%03x'%(cur)
if cur!=0x070:
raise Exception("Heap_check error")
magic(io,777)
cur=build(io,0x90,'a\n')
print 'low_address->0x%03x'%(cur)
if cur!=0x590:
raise Exception("Heap_check error")
可以看到脚本中间有一个地方是申请了0xf0
大小的堆块,然后得到预期地址尾部应该是0x200
,然后后面释放之后再次申请了0xf0
大小的内存,所以预期情况下应该是会重新分配到0x200
这个空闲的堆块上,如果选手在修补过程中,nop
了free
操作,那么分配不到0x200
上,便可以判定check down
。本次线下赛,使用了这种checker机制
,第一天查出了许多队伍使用nop掉free
的套路,但是没有想到主办方还有这种sao操作,所以被判down了。
0x02 交流
这种全新的方法可以用于日后的线下赛参考,借某大佬的评价全新的堆check方式会被大家广泛使用,线下赛不适宜出堆将成为过去时。
所以,以后大家还是好好针对漏洞点修补漏洞吧。此处at某wings
如果大家对线下赛pwn
类型题目的checker
还有什么好的想法,欢迎交流。
[培训]《安卓高级研修班(网课)》月薪三万计划