-
-
[原创]攻防世界题库7分逆向题目FindKey破解记录
-
发表于: 2025-3-14 10:00 1332
-
攻防世界题库7分逆向题目FindKey破解记录
文件解压后是一个exe文件,首先用工具查一下壳,发现无壳。
运行一下看看,是一个界面程序,可能是MFC写的,用鼠标点击没什么反应,暂时看不出来什么东西。
拖入IDA看看,找到“flag{}”,"Are you kidding me?" 等关键字符串。
注意看"Are you kidding me?" 调用MessageBoxA进行输出,推测正确的flag也是由MessageBoxA进行输出。
通过查看代码发现,关键字符串和信息都在0x401640模块中,而0x401640被sub_401014调用
继续看sub_401014被谁调用,发现被sub_4011d0调用,而且sub_401014作为窗口消息的回调函数,当有鼠标点击等消息时sub_401014就会被调用。
sub_4011D0被sub_401023调用
ATOM __cdecl sub_401023(HINSTANCE hInstance)
{
return sub_4011D0(hInstance);
}
sub_401023被WinMain 调用
到这里已经基本清楚了,关键代码在0x401640处,我们直接上x32dbg进行动态调试。
由于IDA F5 无法对这里进行反编译,所以只能动态调试,可以看到下方有一连串的跳转指令,这里猜测是对windows消息进行处理,类似于switch case之类的结构,
windows 消息ID对应如下
WM_DESTROY 0x0002
WM_PAINT 0x000F
WM_COMMAND 0x0111
WM_RBUTTONUP 0x0205
WM_MBUTTONUP 0x0208
WM_GETMINMAXINFO 0x0024
凭直觉到 WM_RBUTTONUP(0x0205)鼠标右键消息处理处4018a8去看看,在4018a8处下断点,同时取消0x401640处的断点,不然程序就会一直断在0x401640这里。
F9 运行后弹出窗口,鼠标点击右键,程序断在4018a8这里。
这里调用的一些函数是没有符号的,可以结合IDA进行注释
004018DA 这里有一个关键跳转,一旦跳转成功,破解程序就失败了。
004018DA | 0F86 A0010000 jbe findkey.401A80 | 这里跳转就gg了
可以看到上方调用strlen查询了428c54处的字符串长度,一旦长度为0,004018DA 处就会进行跳转,但实际上调试到这里的时候,428c54处都是0,因此我们需要手动在内存中填入一些数据。填入多少数据呢,从下方memset初始化参数来看,其对0x100(256) 个字节进行了置0操作,因此我们在428c54处填入256个字符。
1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
一路跟随到401930处,发下一个调用40101e对我们刚刚填入的字符串进行加密,IDA打开sub_40101e,sub_40101e,会调用sub_4013A0。
这个函数的功能很简单,就是调用CryptCreateHash对我们输入的字符串进行hash运算,第二个参数0x8003u表示使用MD5算法。
继续往下跟,发现401005处的函数计算出一个32位的字符串与之前MMD5 hash计算出的值进行比较。
聪明的小伙伴可能已经猜到了,只要两个值相等,说不定就可以输出字符串。这里需要对MD5 hash 进行求逆,对"C8837B23FF8AAA8A2DDE915473CE0991"求逆,结果位“123321”。
在428c54处填入123321,F9,输出flag!
总结:这题考察了Windows窗口消息处理,MD5加密,修改内存等知识点,欢迎小伙伴们亲自尝试!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课