如果这个汇编代码将打印1,2,6,24,120,720作为六个数字,我感到非常困惑。我试图在GDB中多次尝试,并且我看到eax值从1,2,3和6起波动,然后由于某种原因,它不会循环两次以上。我真的坚持这一点,任何帮助,将不胜感激。这与其他二元弹阶段2的帖子无关,因为这个不同。二进制炸弹阶段2
0x000000000040129f : push %rbp
0x00000000004012a0 : push %rbx
0x00000000004012a1 : sub $0x28,%rsp
0x00000000004012a5 : mov %rsp,%rsi
0x00000000004012a8 : callq 0x40185a
0x00000000004012ad : cmpl $0x1,(%rsp)
0x00000000004012b1 : je 0x4012be
0x00000000004012b3 : mov $0x0,%eax
0x00000000004012b8 : callq *0x2034e2(%rip) #
0x00000000004012be : mov %rsp,%rbx
0x00000000004012c1 : mov $0x1,%ebp
0x00000000004012c6 : mov (%rbx),%eax
0x00000000004012c8 : lea (%rax,%rax,2),%eax
0x00000000004012cb : mov %eax,%edx
0x00000000004012cd : xor 0x4(%rbx),%edx
0x00000000004012d0 : mov %ebp,%ecx
0x00000000004012d2 : sar %cl,%eax
0x00000000004012d4 : cmp %eax,%edx
0x00000000004012d6 : je 0x4012e3
0x00000000004012d8 : mov $0x0,%eax
0x00000000004012dd : callq *0x2034bd(%rip)
0x00000000004012e3 : add $0x1,%ebp
0x00000000004012e6 : add $0x4,%rbx
0x00000000004012ea : cmp $0x6,%ebp
0x00000000004012ed : jne 0x4012c6
0x00000000004012ef : add $0x28,%rsp
0x00000000004012f3 : pop %rbx
0x00000000004012f4 : pop %rbp
0x00000000004012f5 : 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
eflags 0x202 [ IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
+0
'read_six_numbers'返回什么?该功能如何工作?这是你已经知道的一件事吗?紧接着的指令是将堆栈顶部的值与1进行比较。如果该值不是* 1,则跳转到“+ 31”。你应该能够从那里一行一行地追踪代码。 –
+0
[理解炸弹实验室]可能的副本(https://stackoverflow.com/questions/26435018/understanding-bomb-lab) –
+0
@Bo persson它不是一回事。 Cody什么意思是什么read_six_numbers返回?它只是要求六个数字,第一个必须是1,然后如果是,那么它跳到31。问题是,当我试图在第二次迭代中追踪它时,它不会满足最后跳跃的条件,并且最终会在gdb中发生爆炸。 –