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

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

2018-4-18 21:52
11681

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

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

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

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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 264
活跃值: (214)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
你有毒
2018-4-18 21:56
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
2018-4-18 21:57
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4

忘记把代码附一下

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