我有如下的组装说明
=> 0x00000000004011ed <+53>: cmp $0x35,%ecx
0x00000000004011f0 <+56>: je 0x4011f7 <phase_5+63>
0x00000000004011f2 <+58>: callq 0x40171e <explode_bomb>
0x00000000004011f7 <+63>: pop %rbx
0x00000000004011f8 <+64>: retq
据我所知,将$ 35与$ ecx中的值进行比较,因此我显示 gdb寄存器中的内容是什么。
(gdb) i r
rax 0x605106 6312198
rbx 0x605100 6312192
rcx 0x23 35
rdx 0xa 10
rsi 0x4 4
rdi 0x605106 6312198
rbp 0x402500 0x402500 <__libc_csu_init>
rsp 0x7fffffffea10 0x7fffffffea10
r8 0x616aa7 6384295
r9 0x7ffff7fc6700 140737353901824
r10 0x7ffff7fc6700 140737353901824
r11 0x246 582
r12 0x400d00 4197632
r13 0x7fffffffeb00 140737488349952
r14 0x0 0
r15 0x0 0
rip 0x4011ed 0x4011ed <phase_5+53>
eflags 0x246 [ PF ZF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
它是35,所以跳转指令应跳转到phase_5 + 63, 并跳过explode_bomb调用,但事实并非如此。
=> 0x00000000004011f0 <+56>: je 0x4011f7 <phase_5+63>
0x00000000004011f2 <+58>: callq 0x40171e <explode_bomb>
0x00000000004011f7 <+63>: pop %rbx
0x00000000004011f8 <+64>: retq
End of assembler dump.
=> 0x00000000004011f2 <+58>: callq 0x40171e <explode_bomb>
0x00000000004011f7 <+63>: pop %rbx
0x00000000004011f8 <+64>: retq
End of assembler dump.
(gdb)
它实际上去调用explode_bomb函数。 所以我很困惑。谢谢。