首页
社区
课程
招聘
[原创]强网杯线下赛堆分配检查机制(lowbits leak check)
2018-4-18 21:52 10673

[原创]强网杯线下赛堆分配检查机制(lowbits leak check)

2018-4-18 21:52
10673

目录

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这个空闲的堆块上,如果选手在修补过程中,nopfree操作,那么分配不到0x200上,便可以判定check down。本次线下赛,使用了这种checker机制,第一天查出了许多队伍使用nop掉free的套路,但是没有想到主办方还有这种sao操作,所以被判down了。

0x02 交流

这种全新的方法可以用于日后的线下赛参考,借某大佬的评价全新的堆check方式会被大家广泛使用,线下赛不适宜出堆将成为过去时。

 

1
所以,以后大家还是好好针对漏洞点修补漏洞吧。此处at某wings

 

如果大家对线下赛pwn类型题目的checker还有什么好的想法,欢迎交流。


[培训]《安卓高级研修班(网课)》月薪三万计划

收藏
点赞1
打赏
分享
最新回复 (6)
雪    币: 264
活跃值: (184)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
wx_sw 1 2018-4-18 21:56
2
0
你有毒
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
simSimple 3 2018-4-18 21:57
3
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
simSimple 3 2018-4-18 22:00
4
0

忘记把代码附一下

雪    币: 18
活跃值: (301)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qazgzz 2018-4-19 17:43
5
0
搞这么复杂的check还不如把攻防模式换成解题模式
雪    币: 438
活跃值: (223)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
ID蝴蝶 1 2018-4-20 14:31
6
0
不如二进制这块不check,只攻击不修复,更能锻炼能力和写exp。
雪    币: 1689
活跃值: (178)
能力值: ( LV7,RANK:103 )
在线值:
发帖
回帖
粉丝
Snowleo 1 2019-4-26 09:33
7
0
这种方法必须在源程序中把堆地址的低3位信息输出才能check吧。这样就有一定的局限性了,大部分堆题都不会直接把地址输出限制信息的泄露。
游客
登录 | 注册 方可回帖
返回