本文主要是介绍170916 逆向-WHCTF(BabyRe/CrackMe),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1625-5 王子昂 总结《2017年9月16日》 【连续第349天总结】
A. XCTF(武汉站)-Reverse
B.
CRACKME
无壳,C++
打开是一个简单的输入框和注册按钮
点击注册按钮会弹框“哎,注册码错了,你得换个新的哟!”
IDA没有main函数,看起来是MFC写的
查找字符串、断GetDlgText等API都没有结果
说明字符串都被加密过了
IDA逐个函数查找,发现有两个函数调用了MessageBoxA
查看交叉引用,发现这两个函数的call都来自于同一个函数,并且还是分支关系
回到汇编状态找到sub_401720和sub_4016e0的地址,在OD中下断,再点击注册按钮果然被401720断下来了
说明这里就是关键跳,再回到sub_401720里看看:
int __thiscall sub_401720(CWnd *this)
{CWnd *v1; // ebx@1char v3; // [sp+Ch] [bp-24h]@1v1 = this;qmemcpy(&v3, &unk_403290, 0x22u);//字符串拷贝sub_4016A0(30, &v3);//处理return CWnd::MessageBoxA(v1, &v3, 0, 0);//弹窗
}
两个函数结构类似,都是调用sub_4016A0对v3进行处理,拷贝的字符串源当然不同
sub_4016A0对字符串进行了异或解密,分别是20和30
在OD里对sub_4015E0的判断处下断,爆破之
弹窗“看到我的注册码了么,那就是flag哦”
…………果然没这么简单哦
那么关键问题就在于if里调用的函数了
因为是指针调用,所以只能在OD里看了
004015E6 . E8 9F030000 call <jmp.&MFC42.#6334> ; get注册码
004015EB . 8B8E 94020000 mov ecx,dword ptr ds:[esi+0x294]
004015F1 . 8D86 94020000 lea eax,dword ptr ds:[esi+0x294]
004015F7 . 8379 F8 21 cmp dword ptr ds:[ecx-0x8],0x21 ; 长度=0x21
004015FB . 75 22 jnz short 0dc17c69.0040161F ; 关键跳1
这篇关于170916 逆向-WHCTF(BabyRe/CrackMe)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!