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的汇编代码。

phase_6
分析的时候要尽量抓住重点,很明显,这里的重点是这个叫做fun6的函数。那么这里势必需要去看fun6的汇编代码,其中还要注意到fun6的参数储存在rdi里,是一个与用户输入无关的值:0x203750。
fun6_1
fun6_2
由于智力太低的原因,我并不能直接看懂这个汇编代码——也就是说,我不能把他翻译成c代码。所以如果我想看懂这些代码的话,我必须逐行理解这个代码,并且自行模拟这个代码的过程。我昨晚尝试这么做,前前后后花了数不清的时间也不能做出来。

然后今天上午我想到,这个函数有一个很大的特点——他的输入与用户输入无关,是一个固定的地址值。然后我去查看了这个地址值,发现是一些精心设计好的数据,可以看出来也是与用户无关的。以上这些话的结论是,这个函数输出的势必是一个固定的值。

那么这么一来就很简单了,我们只需要在gdb里设置合理的断点,直接查看该函数的返回值就可以了。如此一来,就省去了理解这个函数所需的功夫。

通过继续观察phase_6,发现该函数最后决定对错的是1605处的cmp语句。在这句话之前三行,被操作的值是rax和edx。而我们输入的值是strtol的返回值,被储存在rbx里。也就是说,这些操作数和我们的输入也没有关系。那么事请就更加简单了,我们继续在1605处设置一个断点,直接查看rax的值,然后再输入一个正确的和rax一摸一样的答案就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值