CSAPP Bomb lab(内含答案)

CSAPP Bomb lab

CSAPP的bomb lab是让你通过反汇编和gdb,找到六个相应的字符串,来拆掉炸弹。

本实验一共六个阶段,每个阶段对应一个字符串。在完成这六个阶段以后,还有一个彩蛋secret_phase。彩蛋可以在反汇编的代码中看到,只能通过gdb进入,没有出现在main函数中。

整个实验的整体框架可以在bomb.c文件中看到。主要是用的工具是gdb和objdump。

下面的代码都是在gdb中反汇编出来的代码,通过gdb反汇编出来的代码跳转地址是用的绝对地址,比较好看。

Phase_1

phase_1:
   0x0000000000400ee0 <+0>:     sub    $0x8,%rsp
   0x0000000000400ee4 <+4>:     mov    $0x402400,%esi
   0x0000000000400ee9 <+9>:     callq  0x401338 
   0x0000000000400eee <+14>:    test   %eax,%eax
   0x0000000000400ef0 <+16>:    je     0x400ef7 
   0x0000000000400ef2 <+18>:    callq  0x40143a 
   0x0000000000400ef7 <+23>:    add    $0x8,%rsp
   0x0000000000400efb <+27>:    retq 

第一阶段是将输入的字符串与位于0x402400比较,如果相等则成功。函数strings_not_equal做的事情就是比较两个字符串,如果相等就返回0,反之返回1。

strings_not_equla中首先调用string_length测量两个字符串的长度,不想等直接返回1,相等的话在逐一比对字符串中的字符,全部相等返回0。

答案就是储存在0x402400里面的字符:Border relations with Canada have never been better.

Phase_2

phase_2:
   0x0000000000400efc <+0>:     push   %rbp
   0x0000000000400efd <+1>:     push   %rbx
   0x0000000000400efe <+2>:     sub    $0x28,%rsp
   0x0000000000400f02 <+6>:     mov    %rsp,%rsi
   0x0000000000400f05 <+9>:     callq  0x40145c 
   0x0000000000400f0a <+14>:    cmpl   $0x1,(%rsp)
   0x0000000000400f0e <+18>:    je     0x400f30 
   0x0000000000400f10 <+20>:    callq  0x40143a 
   0x0000000000400f15 <+25>:    jmp    0x400f30 
   0x0000000000400f17 <+27>:    mov    -0x4(%rbx),%eax
   0x0000000000400f1a <+30>:    add    %eax,%eax
   0x0000000000400f1c <+32>:    cmp    %eax,(%rbx)
   0x0000000000400f1e <+34>:    je     0x400f25 
   0x0000000000400f20 <+36>:    callq  0x40143a 
   0x0000000000400f25 <+41>:    add    $0x4,%rbx
   0x0000000000400f29 <+45>:    cmp    %rbp,%rbx
   0x0000000000400f2c <+48>:    jne    0x400f17 
   0x0000000000400f2e <+50>:    jmp    0x400f3c 
   0x0000000000400f30 <+52>:    lea    0x4(%rsp),%rbx
   0x0000000000400f35 <+57>:    lea    0x18(%rsp),%rbp
   0x0000000000400f3a <+62>:    jmp    0x400f17 
   0x0000000000400f3c <+64>:    add    $0x28,%rsp
   0x0000000000400f40 <+68>:    pop    %rbx
   0x0000000000400f41 <+69>:    pop    %rbp
   0x0000000000400f42 <+70>:    retq   

第二阶段让我们输入六个数字,通过read_six_numbers,把输入的六个数字储存在栈中。并且第一个数字必须是1(代码0x400f0a),然后通过一个循环(从0x400f1a0x400f2c)来计算后一个数必须是前一个数的两倍,而且我们知道第一个数必须是1。所以答案是:1 2 4 8 16 32

Phase_3

phase_3: 
   0x0000000000400f43 <+0>:     sub    $0x18,%rsp
   0x0000000000400f47 <+4>:     lea    0xc(%rsp),%rcx
   0x0000000000400f4c <+9>:     lea    0x8(%rsp),%rdx
   0x0000000000400f51 <+14>:    mov    $0x4025cf,%esi
   0x0000000000400f56 <+19>:    mov    $0x0,%eax
   0x0000000000400f5b <+24>:    callq  0x400bf0 <__isoc99_sscanf@plt>
   0x0000000000400f60 <+29>:    cmp    $0x1,%eax
   0x0000000000400f63 <+32>:    jg     0x400f6a 
   0x0000000000400f65 <+34>:    callq  0x40143a 
   0x0000000000400f6a <+39>:    cmpl   $0x7,0x8(%rsp)
   0x0000000000400f6f <+44>:    ja     0x400fad 
   0x0000000000400f71 <+46>:    mov    0x8(%rsp),%eax
   0x0000000000400f75 <+50>:    jmpq   *0x402470(,%rax,8)
   0x0000000000400f7c &l

你可能感兴趣的:(csapp,csapp,汇编,反汇编)