好的,所以我一直试图遵循这个汇编代码很长一段时间,我似乎无法确定它产生的模式。以下是代码及其缩写值。用GDB解码汇编语言
0x08048c74 <+0>: push %esi
0x08048c75 <+1>: push %ebx
=> 0x08048c76 <+2>: sub $0x34,%esp
0x08048c79 <+5>: lea 0x18(%esp),%eax
0x08048c7d <+9>: mov %eax,0x4(%esp)
0x08048c81 <+13>: mov 0x40(%esp),%eax
0x08048c85 <+17>: mov %eax,(%esp)
0x08048c88 <+20>: call 0x80494d4 <read_six_numbers>
0x08048c8d <+25>: cmpl $0x0,0x18(%esp)
0x08048c92 <+30>: jne 0x8048c9b <phase_2+39>
0x08048c94 <+32>: cmpl $0x1,0x1c(%esp)
0x08048c99 <+37>: je 0x8048cba <phase_2+70>
0x08048c9b <+39>: call 0x8049495 <explode_bomb>
0x08048ca0 <+44>: jmp 0x8048cba <phase_2+70>
0x08048ca2 <+46>: mov -0x8(%ebx),%eax
0x08048ca5 <+49>: add -0x4(%ebx),%eax
0x08048ca8 <+52>: cmp %eax,(%ebx)
0x08048caa <+54>: je 0x8048cb1 <phase_2+61>
0x08048cac <+56>: call 0x8049495 <explode_bomb>
0x08048cb1 <+61>: add $0x4,%ebx
0x08048cb4 <+64>: cmp %esi,%ebx
0x08048cb6 <+66>: jne 0x8048ca2 <phase_2+46>
---Type <return> to continue, or q <return> to quit---
0x08048cb8 <+68>: jmp 0x8048cc4 <phase_2+80>
0x08048cba <+70>: lea 0x20(%esp),%ebx
0x08048cbe <+74>: lea 0x30(%esp),%esi
0x08048cc2 <+78>: jmp 0x8048ca2 <phase_2+46>
0x08048cc4 <+80>: add $0x34,%esp
0x08048cc7 <+83>: pop %ebx
0x08048cc8 <+84>: pop %esi
0x08048cc9 <+85>: ret
End of assembler dump.
(gdb) i r
eax 0x804c870 134531184
ecx 0xc 12
edx 0x2 2
ebx 0x2 2
esp 0xffffd054 0xffffd054
ebp 0xffffd078 0xffffd078
esi 0xffffd114 -12012
edi 0x0 0
eip 0x8048c76 0x8048c76 <phase_2+2>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
(gdb) x/d $esp
0xffffd054: 2
(gdb)
我插入原始值分别为:1个2 3 4 5 6
read_six_numbers仅仅是检查的功能,如果你有6个数字但是有一些线,我要仔细检查,如果我理解他们是对的。例如:
cmpl $0x0,0x18(%esp)
从我所知道的检查,看看esp寄存器是否等于零。如果不是,那么炸弹就会爆炸。由于这是第一次比较,这是否意味着第一个数字应该是零?
其它线路,如:
add -0x4(%ebx),%eax
和
add $0x4,%ebx
我觉得我需要注意,因为他们改变了寄存器内的数字的值。我知道有假设是一个模式的数字,如* 3或+3等,但我认为该模式必须做4,因为无论是增加或更改值4.我设法得到官方发展援助上的代码可以帮助我们看到这里跳转的链接: http://www2.onlinedisassembler.com/odaweb/J0tDzn/0
只需点击symbols部分中的phase_2即可。我只需要知道如何得到前两个数字,从那里第三个数字应该是直接的,模式应该清楚。我很抱歉,如果这是一篇很长的文章,但我一直试图理解这段相当长的一段时间,并且试图找到放弃模式的线索。任何帮助将不胜感激!提前致谢!
由于某种原因,第一个数字不是0。当我一步一步输入0作为第一个数字时,它只是执行cmpl $ 0x0,0x18(%esp)并且说它不等于吹起炸弹,我怎么能得到0x18(%esp)的值? – Smreks
'read_six_numbers'获取地址'0x18(%esp)'作为参数,所以您输入的第一个数字应该在那里。你做错了什么。无论如何,你可以使用'x $ esp + 0x18'来检查。 – Jester
你是对的,它是0然后1,然后它增加了数字后,我只是拿了另一个炸弹,并解决了它的模式,并转移到其他阶段,谢谢你的回应! :) – Smreks