好友
阅读权限10
听众
最后登录1970-1-1
|
1.看题下载看格式
看题目说明:听说运行就能拿到flag,但是是乱码。
从题目中好像发现不了什么问题。
下载附件,看格式是.exe文件,拖入IDA后发现文件格式是pe,证明在windows环境可运行。
打开下载好的目标文件,发现是界面这样的:
从中看出一堆乱码,点击三个按钮都是关闭程序。因为不是很明白这个题要做什么,所以我们直接将其拖入ida进行分析。
2.ida静态调试
打开ida后,查找main()函数然后看main()函数流程图:
为了方便我把执行路径标号为01way和02way。
然后F5查看反汇编代码:
可以看到出现了一个IsDebuggerPresent()函数,我百度了下,这个函数的作用检测调试器,如果检测到被调试了,那么就会直接终止程序。
所以动态调试时遇到这个函数需要nop掉。
查看字符串,发现没有什么神秘的字符串,所以我们可以猜测flag应该是经过一定的算法得来的。
然后接下来我们进行分析main()函数的反汇编代码,发现有个if判断语句,如果if成立,那么执行完里面的语句,就会直接调用ExitProcess(0xFFFFFFFF)退出(即02way);
如果if条件不成立,那么就会执行下面的代码(即01way)。
可以看到我们想要的flag在MessageBoxA(0, key_value + 1, "Flag", 2u),所以我们猜得到flag的流程就是
- if条件语句为false
- 调用函数MessageBoxA(0, key_value + 1, "Flag", 2u);
即选择01way流程走可能会得出flag。
而其他的变量函数看起来比较麻烦,所以我们选择不分析其他代码段的意义而直段到od里试试运气:
首先在main()函数首地址下断点,进行单步调试。
经过单步调试,我们最后调用了MessageBoxA(0, key_value + 1, "Flag", 2u);然后我们可以看到
运行时验证了我们先前按照01way走从而得出flag猜想是错误的。
那么既然01way是错误的,那么通过02way可不可能得出flag呢?
那么就试试看吧如何才能跳转到02way:
就在01way和02way的判断条件处进行操作,这时候就需要再次分析main()函数的流程
可以判断出地址在0040108A处将jnz的跳转标志寄存器改掉就可以实现跳转了。
经过验证是改变Z标志位。
所以动态调试时执行到108A的判断跳转语句时改z标志位就可以跳转到02way执行路线上。
经过02way流程的单步操作,flag还是没有出来。
这个时候其实我就自闭了,静下心来,心想如果简单地只对if动手就能得到flag那就太无聊了,然后我就回头静下心来看了看main()的反汇编代码,发现key_value很让人怀疑,下面的分析:
其中有三个函数跟key_value有关系:
[C] 纯文本查看 复制代码 1.key_value = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + 1);
2.sub_401000(v3 + 4, (int)key_value);
3.MessageBoxA(0, key_value + 1, "Flag", 2u);
而我们可以看出,执行了sub_401000,就不执行MessageBoxA;执行了MessageBoxA,就不能执行sub_401000。
而我们点开sub_401000函数后,发现对于key_value的处理异常繁琐。
所以我们可以推测应该需要把sub_401000处理过的key_value放入MessageBoxA进行下一步处理得出flag(合理猜测:)
所以我们的猜想2就是;
先执行sub_401000(v3 + 4, (int)key_value),然后将ExitProcess进行nop或者跳转到MessageBoxA的首地址开始调用MessageBoxA函数,然后得出flag。
我们怀着这样纯真的想法,对比ida的main()函数汇编流程图在相应的位置进行修改:
[Asm] 纯文本查看 复制代码 004010A3 jmp short loc_4010EF -->jmp 004010B9 ;sub_401000调用完毕后后即跳转到MessageBoxA函数首地址。
(别忘了nop 掉__debugbreak()函数,把int 3改为nop)
然后你就得到了令人开心的界面:
猜想成功!果然key_value是很重要的,而且sub_401000和MessageBoxA对key_value的共同处理决定了最后的eax的值
分析MessageBoxA就会得知是将[ebp+key_value]保存的数据给eax后,eax自增后得出的flag(od中的text就是输出的flag),果然key_value很重要。
我做这个题目的时候有点心急了,我觉得静下心来分析分析main()函数的流程图和汇编代码应该能快速发现问题的切入点。
不过做题做多了可能会更能静下心来分析分析吧,慌是因为自己没底气啊。:0
祝你我都好!
:P |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|