首页
社区
课程
招聘
[原创] KCTF2506 第六题 秘辛揭露 WriteUp
发表于: 2025-8-27 11:42 4981

[原创] KCTF2506 第六题 秘辛揭露 WriteUp

HHHso 活跃值
26
2025-8-27 11:42
4981

摘要:

        本题基于复用VC6.0 MFC机制的易语言平台,其非常规标准的调用约定给IDA带来一定分析的不友好甚至崩溃,这时可以复用Binary Ninja或Ghidra辅助分析。其对输入的31字节ikey追加0x00,构成32字节key,然后(ekey=encode_with_xkey(key))==rkey校验;8字节xkey和32字节rkey都已知,encode_with_xkey内部用xkey生成sbox,key经过一次与xkey的基本变换后,再经过114514次于sbox的相关变换得到最终的ekey==rkey;通过rkey反向变换即可得到ikey。




我们通过frida插桩下述MFC的CEdit相关的敏感函数,获取调用来源(栈上的ret地址),启动exe,执行下述命令,如下图


两函数的插桩js代码如下

GetWindowTextW

GetWindowTextA


输入其他题目的序列号,如【7FF3675E036335E65E5D29D121FC149197556E6EA39F2E1A1A05437A9609EBC2】,登录,结果如下




我们在输入ikey登录后断下,多走一步,查看返回的CString ikey的内存值,如下图

也可得到其调用点12357BB1,这属于干扰,我们看到frida获取了三次ikey,我们这里重点关注最后一次获取ikey的返回地址,



第三次返回地址如下(实际也可以直接在frida中通过打印一定深度的调用栈返回地址得到次地址),可见其获取的ikey存放到了this.40h结构成员,这一般是MFC控件相关变量的机制。

我们在返回点1235689C下断,后续复现测试,不需在考虑其他断点,直接此处下断点;然后在[esi+0x40]的ikey处下硬件访问字节断点,执行,在1236267C处触发,如下图




通过分析,其实际是str_dup(克隆)功能,其返回123677c0处


同理,我们对Hi_app_dup_str返回的eax的ikey设置硬件访问字节断点,执行,在123544D8处触发


其栈返回地址如下,0x12353C1B,0x1235195F



在返回地址0x1235195F所在函数处,我们定位到了主要业务逻辑框架



我们注意到,其相关多维数组结构如下,主要又维度数dim和各维度的大小size(这里是一个维度则只有一个size,实际应该是size[dim],然后跟元素列表,

我们在进入计算ekey函数前断下,123519B6 E8 8C 0B 00 00          call    Hi_encode_mdata_with_xkey_12352547,如下,

获取xkey(指针未知1240870C)和rkey(指针位置12408710)的值,另外123D62B6处为只有一个0x00字节的一维数组,用于追加到ikey上,得到key。


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

最后于 2025-8-27 14:51 被HHHso编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回