本文主要是介绍SJTU-SE ICS lab2(bombing..),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
利用GDB以及objdump做ICS lab2(defuse bomb)的一些心得
这个lab我在网络上也看到了很多前辈的分析,主要是针对于对汇编代码的解读,这些固然是极为好的。但是有时候反汇编的工作太过于冗杂,所以这个时候如果可以巧妙地利用gdb去做一些工作的话,对于完成这个lab的效率可以有很大的提升。这篇博客主要由这个点出发,记录一些我的经验。
这个lab主要是一个拆弹工作,简单地说就是用gdb以及objdump生成的汇编代码去分析程序需要你做出什么样子的输入。
在这里主要需要用到gdb的两个指令,break和x。如果不了解用法的话请及时查阅。
那么这里用我个人的bomb里的phase_6举一个例子。
首先要声明的是,如果你想要对汇编有更深入的理解,我不推荐你用我做题的这种方法。我的方法注重的是“结果”,如果你想要深入理解“过程”,我推荐你仔细余阅读汇编代码,尽量写出相应的c代码,然后再寻求答案。
这里贴一下phase_6的汇编代码。
分析的时候要尽量抓住重点,很明显,这里的重点是这个叫做fun6的函数。那么这里势必需要去看fun6的汇编代码,其中还要注意到fun6的参数储存在rdi里,是一个与用户输入无关的值:0x203750。
由于智力太低的原因,我并不能直接看懂这个汇编代码——也就是说,我不能把他翻译成c代码。所以如果我想看懂这些代码的话,我必须逐行理解这个代码,并且自行模拟这个代码的过程。我昨晚尝试这么做,前前后后花了数不清的时间也不能做出来。
然后今天上午我想到,这个函数有一个很大的特点——他的输入与用户输入无关,是一个固定的地址值。然后我去查看了这个地址值,发现是一些精心设计好的数据,可以看出来也是与用户无关的。以上这些话的结论是,这个函数输出的势必是一个固定的值。
那么这么一来就很简单了,我们只需要在gdb里设置合理的断点,直接查看该函数的返回值就可以了。如此一来,就省去了理解这个函数所需的功夫。
通过继续观察phase_6,发现该函数最后决定对错的是1605处的cmp语句。在这句话之前三行,被操作的值是rax和edx。而我们输入的值是strtol的返回值,被储存在rbx里。也就是说,这些操作数和我们的输入也没有关系。那么事请就更加简单了,我们继续在1605处设置一个断点,直接查看rax的值,然后再输入一个正确的和rax一摸一样的答案就可以了。
这篇关于SJTU-SE ICS lab2(bombing..)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!