MFC框架的易语言32位程序。IDA自动识别出了部分mfc的函数,结合AI能更快速的判断库函数的功能。尝试导入mfc140.i386.pdb的结构体发现偏移不太对,可能是版本不对。 但是程序的函数非常多,而且C++虚函数表的间接调用非常讨厌,相当长的时间根本找不到按钮的回调函数以及输入校验的函数所在。 通过AI得知mfc封装了windows api,获取输入框的内容最后还是会调用GetWindowTextA,因此对它下断点,然后向上跟踪调用栈分析控制流,以及对获取的输入下数据断点跟踪分析数据流。 sub_12356850和sub_12357BA0两个函数调用的CWnd::GetWindowTextA获得的是输入框的内容,后者被sub_12357E20调用,如果返回1,会调用三个SendMessageA,但具体检查逻辑不在这里。 从数据断点追踪到一路调用:sub_12362670 <- sub_12367500 <- sub_12366BD0 <- sub_1236E250 <- sub_123539A9 <- sub_12351004。 sub_12351004没有直接调用的交叉引用,只有一个全局变量的引用。里面还引用了大量GBK编码的常量字符串,其中包含了错误输入的弹窗内容(输入测试发现30个字符以内无反应,31个字符及以上会弹窗)。(虽然很早就从字符串交叉引用发现了sub_12351004,但相当长的时间内并没有搞清楚它的作用)
这个函数上半部分可以忽略,下半部分首先调用sub_123512E4获取输入字符串(返回的是一个结构,前4字节意义不明,后4字节是长度,再后面是字符串内容。后续此结构反复出现,在IDA里定义出type然后标记相关变量,增强伪代码的展示效果)。
然后通过sub_123543A0计算长度(被sub_12353BC0包装,此包装函数后续也反复出现,但功能只是封装参数(va_arg等)和返回值,无实际逻辑)。
下面是长度检查,如果>=31,则会调用sub_12351552。 后续分析发现sub_12351552是真正的输入框内容正确性的检查逻辑所在。里面引用调用的一些函数意义和全局变量: 至此才完全确定,sub_12352547是真正对输入内容做具体运算的逻辑所在,而输入校验要求计算后的值与dword_12408710的常量值相等。 sub_12352547接收两个字符串结构作为参数,第一个参数a1来自输入框的内容,第二个参数a2调试发现是固定常量。函数里面有很多浮点数的复杂运算,但都与a1无关,全部跳过。
需要关注的几个位置: 反编译代码不贴了,根据上面的分析以及调试验证和修正,dump出所需的常量数据后,直接整理出相应的计算逻辑,并写出反向逻辑,计算得到正确的输入。 最终正确的输入: def split_bytes_to_ints(b):
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288241.htm
[原创] 看雪 2025 KCTF 第六题 秘辛揭露
468 浏览
3 回复
补充一下,我用的IDA 9.2.250718版本,全程没有遇到任何反编译报错,看来高版本已经修复了bextr指令的问题
最后于 2025-8-27 13:45
被mb_mgodlfyn编辑
,原因:
最后于 2025-8-27 13:45
被mb_mgodlfyn编辑
,原因:
sub_12351368:一个奇怪的数组累乘,但对于上面的字符串结构由于第一个4字节总是1,似乎等价于取第二个4字节出来,也即获取字符串的长度 易语言对于核心库相关的操作设计了一份独立的调用约定,简单来说,IDA的反编译结果存在错误。sub_12351368的实际功能是取数组的指针和大小,下面这段汇编代码等价于crypt_key = { 75, 12, 84, 15, 50, 0, 2, 53 }。12351584B8 74623D12mov eax,天龙八部之crackme_2——1.123D6274
1235158950push eax
1235158A50push eax
1235158B8BD8mov ebx,eax
1235158DE8 D6FDFFFFcall <天龙八部之crackme_2——1.取数组成员内容>
1235159258pop eax
123515932BD8sub ebx,eax
1235159503CBadd ecx,ebx
1235159751push ecx
12351598E8 FA230000call <天龙八部之crackme_2——1.分配内存>
1235159D59pop ecx
1235159E5Epop esi
1235159F8BF8mov edi,eax
123515A1F3:A4rep movsb
123515A350push eax
123515A48B1D 0C874012mov ebx,dword ptr ds:[1240870C]1240870C:"P5m"123515AA53push ebx
123515ABE8 E1230000call <天龙八部之crackme_2——1.释放内存>
123515B083C4 04add esp,4
123515B358pop eax
123515B4A3 0C874012mov dword ptr ds:[1240870C],eax1240870C:"P5m"sub_12354220:意义不明,但调试看下来没做什么事 %模运算,由于易语言调用约定的问题,IDA反编译结果可能会发生变化:五个参数:sub_12353BC0(2, (double)v207, -2147482111, 1024.0 - (double)dword_12408704 * 2.0, -2147482111)四个参数:sub_12353BC0(1, v16[v18], 0, -2147482879)
1235158950push eax
1235158A50push eax
1235158B8BD8mov ebx,eax
1235158DE8 D6FDFFFFcall <天龙八部之crackme_2——1.取数组成员内容>
1235159258pop eax
123515932BD8sub ebx,eax
1235159503CBadd ecx,ebx
1235159751push ecx
12351598E8 FA230000call <天龙八部之crackme_2——1.分配内存>
1235159D59pop ecx
1235159E5Epop esi
1235159F8BF8mov edi,eax
123515A1F3:A4rep movsb
123515A350push eax
123515A48B1D 0C874012mov ebx,dword ptr ds:[1240870C]1240870C:"P5m"123515AA53push ebx
123515ABE8 E1230000call <天龙八部之crackme_2——1.释放内存>
123515B083C4 04add esp,4
123515B358pop eax
123515B4A3 0C874012mov dword ptr ds:[1240870C],eax1240870C:"P5m"sub_12354220:意义不明,但调试看下来没做什么事 %模运算,由于易语言调用约定的问题,IDA反编译结果可能会发生变化:五个参数:sub_12353BC0(2, (double)v207, -2147482111, 1024.0 - (double)dword_12408704 * 2.0, -2147482111)四个参数:sub_12353BC0(1, v16[v18], 0, -2147482879)
mb_mgodlfyn
补充一下,我用的IDA 9.2.250718版本,全程没有遇到任何反编译报错,看来高版本已经修复了bextr指令的问题
似乎9.0以上都没报错
补充一下,我用的IDA 9.2.250718版本,全程没有遇到任何反编译报错,看来高版本已经修复了bextr指令的问题
似乎9.0以上都没报错