周杰伦3/15/2025, 8:00:37 PM
文章分类软件逆向阅读数 : 48阅读时长 : 7分钟
【软件逆向-攻防世界题库7分逆向题目FindKey破解记录】此文章归类为:软件逆向。
攻防世界题库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 0x0002WM_PAINT 0x000FWM_COMMAND 0x0111WM_RBUTTONUP 0x0205WM_MBUTTONUP 0x0208WM_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加密,修改内存等知识点,欢迎小伙伴们亲自尝试!
更多【软件逆向-攻防世界题库7分逆向题目FindKey破解记录】相关视频教程:www.yxfzedu.com