看雪·深信服 2021 KCTF 春季赛 | 第七题设计思路及解析

发布者:Editor
发布于:2021-05-25 17:30


少年长成,初为武林盟主。在本题,让我们和飞停一起踏上寻亲之旅,找寻他的身世之谜。


在经过4天的鏖战后,共有3支战队完成本题的战斗。mininep 战队再一次抢的一血,获得240分,成功升至第一名。金左手和hzqmwne紧随其后,分别获得181、178的好成绩。



接下来,我们一起来看看这道题的奥秘吧!


出题团队简介

KuCha128(Archaia战队队长),武汉科锐35期学员,喜欢打游戏,痴迷于软件安全技术研究。主要擅长windows平台的逆向,研究最多的是壳和代码流的防御和攻击手段。



赛题设计思路


此题《千里寻根》的设计思路就是代码长长长,并且设卡阻止破解者“眼看手跳快速pass大量框架代码直捣黄龙”。


技术 • 要点


PE加密壳:


CRC校验:只校验外壳代码,在攻击者patch外壳代码的时候会导致解压缩代码节数据不对。


反调试:使用了两种反调试“IsDebuggerPresent”和“模拟NtQueryInformationProcess”。


加密导入表:如果不脱此加密壳就着手研究,在“首代蜗牛”和“末代蜗牛”调用API的地方,不能直接看到被调用API的名字和地址。

 

蜗牛壳:


SMC加密:使用简单的加密算法保护后代蜗牛的代码,防止破解者看到未来太远的代码。


地址随机化:每一代蜗牛展开蜗牛壳,抛出下一代蜗牛时,随机指定下一代蜗牛的执行地址。


切片技术:将核心算法的代码切成切片,然后将每个切片贴到每层壳上(有可能有的层是没有核心算法代码的切片的),每层壳被执行的时候,相应的切片也会被执行。


代码独立:蜗牛壳在运作的时候,不调用任何外部的API,不使用外部的堆栈。


对抗脚本:破解者在看了前面几层壳的架势之后,不会真的一层一层单步跟踪,而会写脚本脱壳取肉。这是对比之前两题主要改进的地方,利用混淆工具对中间层进行随机混淆,加大破解者寻找蜗牛壳行为特征写脚本的难度。



预期 • 破解思路


思路1(难以实现):


1. 脱去最外层的"加密壳",得到只有"蜗牛壳"的应用程序。


"蜗牛壳"和最外层的"加密壳"不会相互依赖,所以可以确保最外层的"加密壳"脱掉后能正常运行,当然可能大佬不需要脱"加密壳"就能进行下面的破解步骤。


脱壳比较简单,找到OEP(0x140001088),dump,修复导入表项(导入表项只有system/scanf/printf/GetModuleHandleA/ExitProcess/VirtualProtect六项), 即可完成脱壳。


2. 使用x64dbg(或者ida等其他工具)的trace功能,得到"蜗牛壳"所有的执行过的代码。


(1) 从“首代蜗牛”输入完成一直跟踪到“末代蜗牛”完成比较输出结果,得到中间所有的代码。


(2) 观察并写代码对上面得到的代码进行优化:

去掉跳转代码;

多行汇编代码合并成一行(比如把mov rax, 1和add rax, 2 合并成mov rax, 3)。

 

(3) 经过上面的步骤就能发现,“中间的每一代蜗牛”代码基本上一样,根据特征分离出关键算法代码。


3. 根据关键算法代码写逆算法,此题在算法上没有过多设计,参考大佬们写的《三道八佛》wp算法部分和base64算法稍作修改即可写出KeyGen。


https://bbs.pediy.com/thread-256746.htm
https://bbs.pediy.com/thread-256835.htm


相信有不少选手想尝试思路1的“trace所有的执行过的代码”,都会遇到一个很尴尬的问题:很难trace完,或者莫名其妙trace结束了。


笔者在自己测试时候,使用x64dbg的trace into功能,大概跟踪半小时后, x64dbg会停止trace,直接把程序运行起来,而且还附带着"系统库名称符号不见了"/"Ctrl+G无法跳转地址"等一系列奇怪的现象。这应该是x64dbg的BUG吧,输出数据太多导致无法alloc内存。


思路2


断掉trace的念头(trace可能是条不归路),自己跟踪个一两层代码找特征,然后编写调试脚本能整层整层跑蜗牛壳。

 

要想破解蜗牛壳保护的程序,最关键的步骤就是从万千代码海中提取出“肉代码”,这也是此题的难点所在。

 

比较容易发现利用的特征是每层修改栈时候对gs:[30]写入值,这个在之前比赛的wp中也有选手提到过。


然后利用esp定律,对栈下访问断点(因为每次执行“肉代码”都要先恢复寄存器环境,栈地址将对偏移都是固定的),直接运行到"肉代码"处,然后一直单步跟完这层的肉代码。


脚本log出来的数据需要自己提取出有用的“肉代码”。人肉搞定,或者脚本一通字符串操作也能搞定。


图片

 

所有的"肉代码"拼在一起,就是一个完整的算法函数了,接着思路1的步骤(3)继续完成即可。

 

题目 • 小彩蛋


如果直接对printf函数下断点,在最后输出提示信息的时候,rdx/r8/r9寄存器会有字符串。


图片


赛题解析


本赛题解析由看雪论坛 mb_mgodlfyn 给出:


图片


解析文章链接,请点击:https://bbs.pediy.com/thread-267732.htm


往期解析


1. 看雪·深信服 2021 KCTF 春季赛 | 第二题设计思路及解析

2. 看雪·深信服 2021 KCTF 春季赛 | 第三题设计思路及解析

3. 看雪·深信服 2021 KCTF 春季赛 | 第四题设计思路及解析

4. 看雪·深信服 2021 KCTF 春季赛 | 第五题设计思路及解析

5. 看雪·深信服 2021 KCTF 春季赛 | 第六题设计思路及解析



主办方


看雪CTF(简称KCTF)是圈内知名度最高的技术竞技之一,从原CrackMe攻防大赛中发展而来,采取线上PK的方式,规则设置严格周全,题目涵盖Windows、Android、iOS、Pwn、智能设备、Web等众多领域。


看雪CTF比赛历史悠久、影响广泛。自2007年以来,看雪已经举办十多个比赛,与包括金山、360、腾讯、阿里等在内的各大公司共同合作举办赛事。比赛吸引了国内一大批安全人士的广泛关注,历年来CTF中人才辈出,汇聚了来自国内众多安全人才,高手对决,精彩异常,成为安全圈的一次比赛盛宴,突出了看雪论坛复合型人才多的优势,成为企业挑选人才的重要途径,在社会安全事业发展中产生了巨大的影响力。


合作伙伴


图片


深信服科技股份有限公司成立于2000年,是一家专注于企业级安全、云计算及基础架构的产品和服务供应商,致力于让用户的IT更简单、更安全、更有价值。目前深信服在全球设有50余个分支机构,员工规模超过7000名。



公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com



声明:该文观点仅代表作者本人,转载请注明来自看雪