做成功这道逆向题了,哈哈哈哈。
启程。
运行了一下子程序,发现它是要保证所有灯亮着才会给flag。如下图所示。
我聪明滴认为首先可以通过关键字符串找到关键代码位置哦。
1.找到关键代码位置
使用olldbg运行此程序,右键反汇编界面-》查找-》所有参考文本字串。看到了“the flag is”。如下图
记住这一块的详细信息。如下。
文本字串参考位于 ConsoleA:.textbss, 条目 1
地址=0045E968
反汇编=push ConsoleA.0050B0F0
文本字串=ASCII "done!!! the flag is "
emmmm,看到了地址是0045E968,那可以想办法修改代码跳转到此处哦。
2.修改代码
拿起米尺划重点。第一点,很多时候那些非跳转的代码是不能篡改成跳转代码的,好像内存将那儿调成不可写,反正运行不成功。第二点,和脱壳一样,有些call会卡住就记住,重新来过得时候记得F4直接在此call下一行继续运行即可。 目的是什么,目的就是找到jmp语句篡改跳到关键语句处。
在找jmp语句中,我经历了如下call,特此记住。
00460373 |. E8 D8FCFFFF call ConsoleA.00460050
00460058 |. E8 13000000 call ConsoleA.00460070
> E8 80010000 call ConsoleA.00460340
00460359 |. E8 609AFFFF call ConsoleA.00459DBE
那么,这时候,就可以愉快地直接从地址“00460359”出发,找到jmp语句篡改。
按运行键,运行到后,一步一步往后走起来-。-
哇,找到jmp语句,毫不犹豫地篡改。
执行,有回显了,看见没。如下图
继续运行,不一会儿,就蹦出flag。
开心,愉快地结束。
但目前,我看有说法说,这是一种取巧的方法,就是暴力的方法,不能应用到实践中。真正的逆向应该是分析逻辑,然后编写功能去顺着它正确的逻辑走下去,这也是我后面需要努力的。