阅读汇编代码(Bomb lab stage 5帮助)

时间:2016-04-17 17:16:45

标签: assembly x86 reverse-engineering

我必须为炸弹实验室解码这种汇编语言:

Dump of assembler code for function phase_5:
0x08048e79 <+0>:    push   %ebx
0x08048e7a <+1>:    sub    $0x28,%esp
0x08048e7d <+4>:    lea    0x1c(%esp),%eax
0x08048e81 <+8>:    mov    %eax,0xc(%esp)
0x08048e85 <+12>:   lea    0x18(%esp),%eax
0x08048e89 <+16>:   mov    %eax,0x8(%esp)
0x08048e8d <+20>:   movl   $0x804a9de,0x4(%esp)
0x08048e95 <+28>:   mov    0x30(%esp),%eax
0x08048e99 <+32>:   mov    %eax,(%esp)
0x08048e9c <+35>:   call   0x8048940 <__isoc99_sscanf@plt>
0x08048ea1 <+40>:   cmp    $0x1,%eax
0x08048ea4 <+43>:   jg     0x8048eab <phase_5+50>
0x08048ea6 <+45>:   call   0x804961b <explode_bomb>
0x08048eab <+50>:   mov    0x18(%esp),%eax
0x08048eaf <+54>:   mov    %eax,%edx
0x08048eb1 <+56>:   and    $0xf,%edx
0x08048eb4 <+59>:   cmp    %edx,%eax
0x08048eb6 <+61>:   je     0x8048ebd <phase_5+68>
0x08048eb8 <+63>:   call   0x804961b <explode_bomb>
0x08048ebd <+68>:   mov    0x18(%esp),%ebx
0x08048ec1 <+72>:   mov    %ebx,%eax
0x08048ec3 <+74>:   mov    $0x0,%ecx
0x08048ec8 <+79>:   mov    $0x0,%edx
0x08048ecd <+84>:   add    $0x1,%edx
0x08048ed0 <+87>:   add    %eax,%ecx
0x08048ed2 <+89>:   mov    0x804a700(,%eax,4),%eax
0x08048ed9 <+96>:   cmp    %eax,%ebx
0x08048edb <+98>:   jne    0x8048ecd <phase_5+84>
0x08048edd <+100>:  cmp    0x1c(%esp),%edx
0x08048ee1 <+104>:  jne    0x8048ee8 <phase_5+111>
0x08048ee3 <+106>:  cmp    $0x41,%ecx
0x08048ee6 <+109>:  je     0x8048eed <phase_5+116>
0x08048ee8 <+111>:  call   0x804961b <explode_bomb>
0x08048eed <+116>:  add    $0x28,%esp
0x08048ef0 <+119>:  pop    %ebx
0x08048ef1 <+120>:  ret

我知道直到+68,它基本上会检查我输入的字符串中是否至少有2个整数。

退出循环后,edx必须为4(+100时我看到0x1c(%esp)= 4)且ecx必须为65(0x41为+106)。有人可以帮我弄清楚发生了什么以及我需要输入什么?

***编辑4/18(数组内容): 它在%eax = 24之后变为0,所以我想我到了最后。当eax = 5并且遍历7次到eax = 11时开始,%ecx将= 65但是当我进入&#34; 5 7&#34;它没有用:(

%eax=0: 0x00000014 
1:  0x00000008
2:  0x00000010
3:  0x00000018
4:  0x00000005
5:  0x0000000a
6:  0x0000000e
7:  0x0000000d
8:  0x00000000
9:  0x00000004
10: 0x00000016
11: 0x00000002
12: 0x00000013
13: 0x00000017
14: 0x00000012
15: 0x00000015
16: 0x0000000f
17: 0x0000000c
18: 0x00000006
19: 0x00000011
20: 0x00000001
21: 0x0000000b
22: 0x00000009
23: 0x00000003
24: 0x00000007
25: 0x00000000
26: 0x00000000
27: 0x00000000
28: 0x00000000
29: 0x00000000...

1 个答案:

答案 0 :(得分:2)

首先,您显然在0x18(%esp)0x1c(%esp)处有两个输入整数。因此,您的声明&#34; edx必须是4&#34;只有在您输入4作为第二个号码时才有效。通常,检查是edx必须等于第二个数字。

代码在地址0x804a700处有一个链接列表,从第一个输入数字给出的索引开始遍历。如果找到第一个输入给出的值,则循环退出。 edx用于跟踪迭代次数,以及与第二个数字匹配的内容。

ecx用于跟踪搜索过程中遇到的所有值的总和,最后应为0x41

因此,您需要确定链接列表的哪一部分将0x41作为总和,并输入其起点和长度作为两个输入。

请记住,退出条件是找到第一个数字。从5开始将进入0->20->1->8->0...的循环,因此它永远不会退出。 顺便说一句,这意味着您无法从018开始。所以,让我们试试22 + 16 + 15 + 21 + 11 = 65然后我们回到2,以便循环退出。是的,这是我们的解决方案:2 5