Xctf进阶-Junk_Instruction

一道 MFC 题,之前找验证函数是查看字符串,但在这题里不奏效,学一下根据控件 id 找函数

patch 过的程序 Junk Instruction.exe

找关键函数

首先查找字符串 CDialog ,之后在这个字符串位置下方查看到消息映射表,在 ida 中建立如下两个结构体,分别设置类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct AFX_MSGMAP
{
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
const AFX_MSGMAP_ENTRY* lpEntries; //指向下面这个结构体
};
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID; //控件id
UINT nLastID;
UINT_PTR nSig;
AFX_PMSG pfn; //对应的函数
};

使用 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
2
3
4
5
6
7
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']
for i in range(0,16):
temp=flag[i]
flag[i]=flag[31-i]
flag[31-i]=temp
print('flag{'+''.join(flag)+'}')
#flag{973387a11fa3f724d74802857d3e052f}

参考资料

作者

0wl

发布于

2021-07-21

更新于

2021-07-21

许可协议

评论