二元炸弹阶段2

时间:2017-07-02 04:08:25

标签: unix assembly

如果这个汇编代码将打印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

1 个答案:

答案 0 :(得分:0)

所以你已经确定:

  • 第一个数字是1
  • 有一个循环遍历数字
  • 有条件必须为真

让我们看看循环。很明显,ebp是计数器,而rbx是指向数字的指针。

现在,条件。两个操作数如何设置?对于eax,我们可以看到它是从(%rbx)加载的,这是当前的数字,然后对其执行一些操作。我们并不关心什么,因为第一个数字是已知的,因此我们无法改变结果。

另一个操作数是edx。这也是以某种方式从当前数字计算出来的,但也是xor - 使用下一个数字(xor 0x4(%rbx),%edx行)。

有了所有这些信息,请先输入1 0 0 0 0 0作为第一个猜测。请注意xor 0eax保持不变。让程序运行直到比较并检查edx1中的内容。它将是3eax,不幸的是它们并不相同。如上所述,我们无法更改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 。现在,重新启动程序并输入此数字代替第一个零占位符。让循环运行一次迭代并重复该过程以获得其余数字。