Xctf进阶-Junk_Instruction
patch 过的程序 Junk Instruction.exe
找关键函数
首先查找字符串 CDialog
,之后在这个字符串位置下方查看到消息映射表,在 ida 中建立如下两个结构体,分别设置类型

1 | struct AFX_MSGMAP |
使用 Resource Hacker 可以查看 check 按钮对应的 id

十六进制是 0x3e9,有一些文章里说 alt+i 查找控件 id 可以找到对应函数,但是在这题里好像找不到,所以只能根据父类的消息映射表一个个找子类映射表从而找到控件注册函数,具体寻找方法参考这 使用IDA定位基于MFC的CrackMe的按钮函数—–实践篇(一)

在地址 0x57f730(未经调试)处找到对应的入口点
去花指令
找到函数后确定 check 函数

在 check 函数可以看到 __asm { retn }
的代码,说明这里存在花指令,而这里主要存在两种花指令

call 指令相当于 push+jump,把 call 下方的地址 push 到栈里再 jump 到对应位置,这里 loc_402953 的 ebx 存放返回地址,inc ebx 把返回地址加一那么返回的地址变成 call 下面的 jump,所以这里的花指令可以把除了 mov eax,11111111h 以外的都 nop 掉

这种跟上面一样分析可以全 nop 掉
这题的花指令不算多可以手动修复,当然也可以用 idapython 脚本修复
都弄好后就可以逆 check 的逻辑
解密
rc4加密,密钥是 qwertyuiop
密文是上面的那些赋值
1 | flag=['f','2','5','0','e','3','d','7','5','8','2','0','8','4','7','d','4','2','7','f','3','a','f','1','1','a','7','8','3','3','7','9'] |
参考资料
Xctf进阶-Junk_Instruction