编译和反编译(二)

      上文说了汇编语言的基本要素和一些体系结构的东西。现在就付诸实践,来反编译试试。我用的是从一个公开课The Hardware/Software Interface上的lab,我上传了github。有兴趣的可以自己尝试。我花了大概5个小时才完全破解。而且还有一个过程没有弄明白,看到结果才明白过程是什么。。

GDB基础:

      具体的可以看链接1。我基本就用到了下面的选项。i r和x是特别有用的。

objdump:

      首先还是先把所有代码反汇编了再说,否则根本不知道框架。 objdump -d bomb > bomb.s 搞定。这下可以看出一共7个阶段,包括一个secret阶段。然后试着用 strings bomb ,说不定有惊喜。这样心里就更有数了,因为出来有一部分是这样的结果:

That’s number 2. Keep going!
Halfway there!
Welcome to my fiendish little bomb. You have 6 phases with
which to blow yourself up. Have a nice day!
Phase 1 defused. How about the next one?
So you got that one. Try this one.
Congratulations! You’ve (mostly) defused the bomb!
Hit Control-C to escape phase 6 (for free!), but if you want to
try phase 6 for extra credit, you can continue. Just beware!
Science isn’t about why, it’s about why not?
Wow! You’ve defused the secret stage!
So you think you can stop the bomb with ctrl-c, do you?
nonexistenthost.cs.washington.edu
Curses, you’ve found the secret phase!
But finding it and solving it are quite different…
Congratulations! You’ve defused the bomb! Again!

正式破解:

阶段一:
      这一步很简单,以下4个命令就能破解。你懂的,$esi就是参数。

阶段二:
      从objdump的bomb.s可以看出,这次要输入6个数字。通过下面3步可以知道我输入的数字存储的位置。我刚开始当然不知道答案是哪几个数字,所以随便放几个。

从这里就可以看出这是要测试第零个数字和第三个是否一样,同理看看其他是什么关系。

阶段三:
      这个好多mov, jmp。看到就吓尿了。关键点是 400f2b: ff 24 c5 60 1b 40 00 jmpq *0x401b60(,%rax,8)  ,我刚开始不明白其意义,是根据答案得到结果的。后来经查找,发现这是switch,用 x /20xw 0x401b60 就可以检查。然后迎刃而解。

阶段四:
      不说了,是个fibonacci数列。我觉得是第二简单的一个。

阶段五:
      首先这里有个数组,如下: 然后程序的目的是经过12次指针切换后,最后指到值为15的array[i]。可知上一次i = 6。依次类推。然后他也是输入两个数字,一个是起点,一个是总和。可以看出每次迭代都是把值相加,跟输入值相比。

阶段六: 
      那个fun6完全没有看懂,但是可以进行下去。按下面的步骤,得出的结果,一定能发现什么。然后就简单了。

Secret Phase:
      在这里我搞了近两个小时。首先是找不到入口。phase_defused中明白的写着是从这进,而且要输入两个参数。而且第二个字符串是austinpowers。但是半天没有搞定。最后发现居然不是在最后输入。。。在哪输入自己找。顺利进入secret phase。

      进入secret phase后,查看相关数据。发现也是链表类型的。然后进入fun7。这是个递归的函数。不用笔不行啊,然后我就手动写了递归函数。坑的是我把cmp搞反了,郁闷了半天。 c代码都写出来了就简单了。

链接:

  1. GDB tutorial