一、 文件描述
- 正儿八经的.exe程序;
- 24KB;
- 32位;
- 工具:OllyDbg
二、解题思路
- 二话不说,先放上图看看运行起来的模样。。
- 于是,,各个下拉框都试了一遍,,点击【确定】没反应。。它竟然没反应,也不显示正确,也不显示错误。。。
- 好吧,,直接OD中绕过
- 打开字符串列表,如下图,,,
- 这里第三行有个MCTF{N3t_Rev_1s_E4ay},直觉告诉我,这就是你要的flag,,,好吧,,这样太容易了吧,,
- 不行,,我要再试试的
- 第四行是“Try again!”,第五行是“欢迎来到MCTF信息安全大赛”。。
- 咋整呢,,,
- 来到 反汇编窗口中,定位"欢迎来到MCTF信息安全大赛",,,显然这句话是【确定】按钮后弹出来的,,
- 所以,思路就是,,,,要从程序运行后就跳转到这句输出,,直接跳过【确定】键。。。
- 这句话往上看,找到最近的一个跳转键【jnz】【00402776】,,它表or edx,eax使得ZF=1时就跳转,,跳转到很远的地方【004028AC】,直接跳过了“欢迎…”.
- 再往上翻,,,没有找到其他跳转指令,,倒是有很多cmp指令,,,可想而知,,这些个cmp都是与我们在下拉框中输入的值进行cmp、、、
- 所以,,这更加确定了,我们应该在这个【jnz】处进行修改、、
- 废话不多说,,将【00402776】处修改为NOP,,你可能会问为什么不直接跳到“欢迎。。。。”那里,,答案是jnz下面的指令必须得执行才行!!!
- 修改后,F9运行程序,点击【确定】,出现一个小弹框。。
- 点击小对话框的【确定】后,,原来的程序变成这样、、
- 随便输入一串字符试试看【获取flag】。。
- 弹出“Try Again!”的弹框,,看来是需要我们自己找到flag才行。。
- 继续加油鸭,,
- 我们在“Try Again”上打个断点,,
- 继续输入flag,,然后F8调试程序。。。
- 调试到这句【00402498h】的时候才出现“Try Again!”的弹框。。
- 重点来了,,,“Try Again”上面有个【jmp】【0040246Bh】跳转,,这个jmp直接跳过“Try Again”及其弹窗【00402498h】。。
- 由于这个是jmp无条件跳转,,你细想,,程序正常往下走,,遇到【jmp】肯定会执行,也就是会跳过Try Again,,对吧。但是,我这里无论输入什么,,,一直都有Try Again弹窗。。。
- 这就说明一点,在【jmp】指令之前,就有一个跳转指向"Try Again!",,,,找找看鸭~~~
- 往上找的时候发现一个【jge】【00402471h】和一个【je】【004023EE】,,,
- 很明显,【je】跳转证明了我的猜想,,,它果然直接跳到了“try again”那里。
- 直接把这个【je】给NOP掉。。然后输入继续调试,,
- 弹窗出现我们输入的结果,,,嘎嘎,,这也不是我想要的flag,,,
- 继续往上看,这个跳转之前做了哪些事情。。。
- 在这张图最上面一行【004023A9h】处,程序push一个字符串:MCTF{N3t_Rev_1s_E4ay},,然后我在下面一行【004023AEh】处打了个断点,,运行调试的时候,可以看到堆栈窗口有两个Unicode,,一个是我输入的“64366”,一个是正确的flag值,,
- 这个时候,,已经知道这就是我们要的FLAG了,,
- 验证一下,,把之前对【je】的修改撤销,,输入正确的Flag后,出来这个弹窗。。。
- 完美收官,,,
记录一下,,这是我学习逆向的第二个星期,,加油,,有啥解释的不到位或者不对的地方,请大家多多批评指正哇!!!
私信或者评论都行,,共同进步鸭,,,fighting!!!
APK文件的逆向等我装好了软件,再更新好伐~~~