首页
社区
课程
招聘
[原创] 看雪 2025 KCTF 第四题 血色试炼
发表于: 2025-8-21 03:34 4705

[原创] 看雪 2025 KCTF 第四题 血色试炼

2025-8-21 03:34
4705

大量反调试,包括 TlsCallBack、0xCC+AddVectoredExceptionHandler、Xtime_get_ticks等,还有裸调用的syscall指令、自行查找记录的Zw api函数地址、加密的字符串等。

结合AI辅助,逐渐识别出std::string、std::vector、std::map等函数,以及魔改的AES加解密和魔改的base64编解码。

整体逻辑上,TlsCallback_0(sub_140002B00)完成了很多常量的初始化(AES sbox、两个密钥、从Ntdll.dll提取并存入std::map的各种api、0x14000D0B8的CC C3指令)。

main函数几次给全局变量0x14000D890设置不同的值随后调用0x14000D0B8的CC C3,此异常被AddVectoredExceptionHandler注册的sub_140006D40函数捕获并根据0x14000D890进入不同的分支。
排除处理std::string的函数,其中sub_14000618C对输入的username做计算生成一个中间值,sub_140005D6C对输入的serial做计算生成另一个中间值(p.s.此函数还兼任各种常量字符串的解密),最终回到main函数的0x140003FD1处比较这两个值以判定serial是否正确。

对serial做计算的sub_140005D6C函数,依次进行了base64解码(sub_140001684),aes key展开(sub_140004BEC)、aes解密(0x14000593C)、生成一个固定的字节串(sub_140005B44)并异或它,得到最终参与比较的结果。

但是,其中的base64和aes实现都是经过魔改的,逻辑与标准算法并不相同。静态分析过于费力,而动态分析又有反调试,非常难搞。

第一步需要KCTF作为username时经过计算后参与比较的字节串,0x140003FD1这个位置非常靠后,而前面的反调试并没有找到办法解决。采用变通方案,将0x140003FD1 patch为EB FE (jmp $-2,原地循环),跑起来后再附加调试器,可以查看内存(但是如果尝试让调试器暂停程序执行则会立刻闪退,还是没有办法进一步调试),完成dump。


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回