战队名称:
Archaia
队长QQ:
916964950
参赛题目:
见附件
公开的用户名及序列号:
用户名 : E1445A98642AEBC1
序列号 : 933C7436B05D705A4E84BA95B4E3884EBA1ED212053F8B6D9DAA2C893F3ABE39
题目答案:
用户名 : KCTF
序列号 : 39ED62B341BC560217EAB3BF90265D101067856B36495264144A5B487264CB4B
题目设计:
此题为分别使用了X86和X64的代码混淆,并使用了天堂之门技术对调试进行干扰。
1.题目介绍:这次提交的题目是windows32位的应用程序,作战思路是将算法代码分成三部分,分别对三部分算法代码进行不同运行模式(32位运行模式和64位运行模式)的混淆,然后使用天堂之门进行运行模式的切换。
2.整体设计:
(1)核心算法部分:
本程序将解密算法分割成3部分。
第一部分是用64位指令实现;
第二部分是用32位指令实现;
第三部分是用64位指令实现;
使用天堂之门技术进行三个部分的连接;
(2)除算法外的其他部分:
本程序的其他部分由cpp编写,在项目中使用cpp的异常处理干扰调试者。
(3)天堂之门:天堂之门的运行模式切换,能使该程序可以对抗市面上大部分的调试器,使其调试工作不顺利的进行。
3.混淆:
(1)64位混淆:64位混淆主要有指令等价替换,流程干扰,花指令,产生垃圾代码、栈地址修改等干扰功能,为了影响攻击者,指令等价替换、产生垃圾代码等功能具有一定随机性。
(2)32位混淆:32位的混淆在64位的功能基础上,加入了seh异常处理干扰程序执行流程,主要目的是影响调试器的trace功能。同时将部分代码做了简单的加密处理(将某些指令做了异或加密),也是通过异常的方式获取代码控制权,然后在异常中使用天堂之门切换到64位之后再解密后续的代码,解密完成之后切换到32位继续执行。
4.算法:
使用AES算法和修改的Base64算法(以下简称Base64)验证用户名和序列号是否正确
(1) 算法参考KCTF2021春季赛-千里寻根实现
(2) 验证算法部分是一段完整的shellcode代码,将其分片成3部分后,做了混淆和校验。
(3) 如果对输入的序列号解密失败,或者解密结果与用户名不匹配,则提示失败。
使用CRC32算法保护算法部分的内存完整性
(1) 在解密shellcode中,随机插入5份CRC32检查,计算出当前EIP前后一段内存范围内的校验值
(2) 使用5份校验值分别对Base64映射表的一部分做异或,得到加密后的Base64映射表
(3) CrackMe一开始使用该加密后的Base64映射表,只有运行时得到正确的CRC32值,才可以恢复正确的Base64映射表
(4) 该校验主要用于反调试,在校验范围内的内存如果有被修改(比如下了int3断点),那么Base64映射表的结果将是错误的
技术要点:
1、天堂之门
2、X86和X64的代码混淆
3、SEH异常
4、算法设计
破解时可能会遇到的问题
1.总体思路:
通过调试器的trace功能或者模拟执行的方式拿到完整的解密算法,最后分析解密算法得到加密算法。
2.需要解决的问题
(1)想办法突破天堂之门的限制
(2)在32位算法部分,对抗异常处理和天堂之门
(3)拿到完整的代码之后,需要写脚本将垃圾指令除去,以便最后的分析
(4)通过分析解密算法得到加密的算法。
预期的破解思路:
1.想办法处理32位到64位天堂之门的模式转换
2.调试第一层,找出第一层64位代码混淆的规律,编写脚本获取到关键信息
3.想办法处理64位到32位天堂之门的模式转换
4.调试第二层,找出第二层32位代码混淆的规律,编写脚本获取到关键信息
5.想办法处理32位到64位天堂之门的模式转换
6.调试第三层,找出第三层64位代码混淆的规律,编写脚本获取到关键信息
7.想办法处理64位到32位天堂之门的模式转换,然后找到结果校验处
8.经过上面的步骤找到的信息,根据特征分离出关键算法代码
9.根据关键算法代码写逆算法
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2022-5-20 11:54
被醍醐编辑
,原因: