如果这个汇编代码将打印1,2,6,24,120,720作为六个数字,我会非常困惑。我试图在GDB中经历多次,我看到eax值从1,2,3和6波动,然后由于某种原因它不会循环超过两次。我真的坚持这个,任何帮助将不胜感激。这与其他二元炸弹第2阶段的帖子无关,因为这个不同。
0x000000000040129f <+0>: push %rbp
0x00000000004012a0 <+1>: push %rbx
0x00000000004012a1 <+2>: sub $0x28,%rsp
0x00000000004012a5 <+6>: mov %rsp,%rsi
0x00000000004012a8 <+9>: callq 0x40185a <read_six_numbers>
0x00000000004012ad <+14>: cmpl $0x1,(%rsp)
0x00000000004012b1 <+18>: je 0x4012be <phase_2+31>
0x00000000004012b3 <+20>: mov $0x0,%eax
0x00000000004012b8 <+25>: callq *0x2034e2(%rip) # <explode>
0x00000000004012be <+31>: mov %rsp,%rbx
0x00000000004012c1 <+34>: mov $0x1,%ebp
0x00000000004012c6 <+39>: mov (%rbx),%eax
0x00000000004012c8 <+41>: lea (%rax,%rax,2),%eax
0x00000000004012cb <+44>: mov %eax,%edx
0x00000000004012cd <+46>: xor 0x4(%rbx),%edx
0x00000000004012d0 <+49>: mov %ebp,%ecx
0x00000000004012d2 <+51>: sar %cl,%eax
0x00000000004012d4 <+53>: cmp %eax,%edx
0x00000000004012d6 <+55>: je 0x4012e3 <phase_2+68>
0x00000000004012d8 <+57>: mov $0x0,%eax
0x00000000004012dd <+62>: callq *0x2034bd(%rip) <explode>
0x00000000004012e3 <+68>: add $0x1,%ebp
0x00000000004012e6 <+71>: add $0x4,%rbx
0x00000000004012ea <+75>: cmp $0x6,%ebp
0x00000000004012ed <+78>: jne 0x4012c6 <phase_2+39>
0x00000000004012ef <+80>: add $0x28,%rsp
0x00000000004012f3 <+84>: pop %rbx
0x00000000004012f4 <+85>: pop %rbp
0x00000000004012f5 <+86>: retq
这是我在寄存器的第二次迭代中得到的。现在不会有另一个迭代,因为rax和rdx不相等,所以不会执行最后一次跳转。这让我感到困惑,因为我认为它应该能够循环回到6个数字出现。
rax 0x1 1
rbx 0x7fffffffe1f4 140737488347636
rcx 0x2 2
rdx 0x5 5
rsi 0x402e7d 4206205
rdi 0x7fffffffdb21 140737488345889
rbp 0x2 0x2
rsp 0x7fffffffe1f0 0x7fffffffe1f0
r8 0x3e9258ee40 268743274048
r9 0x100 256
r10 0xb 11
r11 0xb 11
r12 0x400e30 4197936
r13 0x7fffffffe320 140737488347936
r14 0x0 0
r15 0x0 0
rip 0x4012d8 0x4012d8 <phase_2+57>
eflags 0x202 [ IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
答案 0 :(得分:0)
所以你已经确定:
让我们看看循环。很明显,ebp
是计数器,而rbx
是指向数字的指针。
现在,条件。两个操作数如何设置?对于eax
,我们可以看到它是从(%rbx)
加载的,这是当前的数字,然后对其执行一些操作。我们并不关心什么,因为第一个数字是已知的,因此我们无法改变结果。
另一个操作数是edx
。这也是以某种方式从当前数字计算出来的,但也是xor
- 使用下一个数字(xor 0x4(%rbx),%edx
行)。
有了所有这些信息,请先输入1 0 0 0 0 0
作为第一个猜测。请注意xor
0
与eax
保持不变。让程序运行直到比较并检查edx
和1
中的内容。它将是3
和eax
,不幸的是它们并不相同。如上所述,我们无法更改edx
,但我们可以通过使用带有下一个数字的xor来更改xor
。由于eax ^ edx
的工作原理,p $eax ^ $edx
将是我们的下一个数字。您可以让gdb将其打印为07-02 12:47:13.101 13850-20562/nodomain.myapplication D/URL ERRORhttp://10.0.0.2/testdb/connection.php
07-02 12:47:13.339 13850-20562/nodomain.myapplication I/URL IS OK: [ 07-02 12:47:13.339 13850:20562 I/ ]Status : 200
07-02 12:47:13.344 13850-20562/nodomain.myapplication D/URL ERRORhttp://localhost/myPage.php
。现在,重新启动程序并输入此数字代替第一个零占位符。让循环运行一次迭代并重复该过程以获得其余数字。