摘要: 本题基于复用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代码如下GetWindowTextWGetWindowTextA
输入其他题目的序列号,如【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。
登录后可查看完整内容
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288246.htm
[原创] KCTF2506 第六题 秘辛揭露 WriteUp
188 浏览
0 回复
暂无回复,快来抢沙发吧!