深入理解操作系统实验——bomb lab(phase_2)

2、对phase_2破解:
得到phase_2的汇编代码,开始破解

push   %es
push   %ebx
sub    $0x34,%esp
lea    0x18(%esp),%eax
mov    %eax,0x4(%esp)
mov    0x40(%esp),%eax
mov    %eax,(%esp)
call   0x80492ab <read_six_numbers>
cmpl   $0x1,0x18(%esp) 
je     0x8048b99 <phase_2+37> 
call   0x8049176 <explode_bomb>
lea    0x1c(%esp),%ebx
lea    0x30(%esp),%esi 
mov    -0x4(%ebx),%eax
add    %eax,%eax
cmp    %eax,(%ebx)
je     0x8048baf <phase_2+59>
call   0x8049176 <explode_bomb>
add    $0x4,%ebx  
cmp    %esi,%ebx 
jne    0x8048ba1 <phase_2+45>
add    $0x34,%esp     
pop    %ebx   
pop    %esi 
ret

可以看到这里调用了一个read_six_numbers的函数,所以可以假定这个密码是连续的六个数字,每个数字之间通过空格连接,而通过第九行cmpl $0x1,0x18(%esp)可以得到,第一个数字必须是1,然后最重要的就是add %eax,%eax指令会得到上一个数值的两倍,然后这个结果与第二个数值进行比较,如果不相等就会引爆炸弹,因此可以得到这是一个二次幂的数列,为1 2 4 8 16 32,代入后得到没有引爆,证明结果正确。
深入理解操作系统实验——bomb lab(phase_2)_第1张图片
对应的编程语言代码为:

int a[6];
read_six_number;
if(a[0]!=1)
explode_bomb;
for(int i=0;i<5;i++){
int b=a[i]+a[i];
if(a[i+1]!=a[i])
    explode_bomb;
}

你可能感兴趣的:(深入理解操作系统)