【发布时间】:2017-07-06 02:38:26
【问题描述】:
所以我在使用这个汇编代码时遇到了一些问题,并找出答案是哪两个数字。我所知道的是输入应该是由空格分隔的两位数字,并且根据最后一个比较,最后一个数字应该等于 0x6b,即十进制的 107。 Func4 对 eax 值做了一些处理,使其变为 107,但我不太确定。那么哪两个数字将作为输入呢?任何帮助将不胜感激。
0x000000000040135a <+0>: sub $0x18,%rsp
0x000000000040135e <+4>: lea 0x8(%rsp),%rcx
0x0000000000401363 <+9>: lea 0xc(%rsp),%rdx
0x0000000000401368 <+14>: mov $0x402e78,%esi
0x000000000040136d <+19>: mov $0x0,%eax
0x0000000000401372 <+24>: callq 0x400d60 <__isoc99_sscanf@plt>
0x0000000000401377 <+29>: cmp $0x2,%eax
0x000000000040137a <+32>: jne 0x40138a <phase_4+48>
0x000000000040137c <+34>: mov 0xc(%rsp),%eax
0x0000000000401380 <+38>: cmp $0x13,%eax
0x0000000000401383 <+41>: jle 0x40138a <phase_4+48>
0x0000000000401385 <+43>: cmp $0x23,%eax
0x0000000000401388 <+46>: jle 0x401395 <phase_4+59>
0x000000000040138a <+48>: mov $0x0,%eax
0x000000000040138f <+53>: callq *0x20340b(%rip) <explode_bomb>
0x0000000000401395 <+59>: mov $0x23,%edx
0x000000000040139a <+64>: mov $0x0,%esi
0x000000000040139f <+69>: mov 0xc(%rsp),%edi
0x00000000004013a3 <+73>: callq 0x4010bc <func4>
0x00000000004013a8 <+78>: cmp $0x6b,%eax
0x00000000004013ab <+81>: jne 0x4013b4 <phase_4+90>
0x00000000004013ad <+83>: cmpl $0x6b,0x8(%rsp)
0x00000000004013b2 <+88>: je 0x4013bf <phase_4+101>
0x00000000004013b4 <+90>: mov $0x0,%eax
0x00000000004013b9 <+95>: callq *0x2033e1(%rip) <explode_bomb>
0x00000000004013bf <+101>: add $0x18,%rsp
0x00000000004013c3 <+105>: retq
进入func4
0x00000000004010bc <+0>: push %rbx
0x00000000004010bd <+1>: mov %edx,%eax
0x00000000004010bf <+3>: sub %esi,%eax
0x00000000004010c1 <+5>: mov %eax,%ebx
0x00000000004010c3 <+7>: shr $0x1f,%ebx
0x00000000004010c6 <+10>: lea (%rbx,%rax,1),%eax
0x00000000004010c9 <+13>: sar %eax
0x00000000004010cb <+15>: lea (%rax,%rsi,1),%ebx
0x00000000004010ce <+18>: cmp %edi,%ebx
0x00000000004010d0 <+20>: jle 0x4010de <func4+34>
0x00000000004010d2 <+22>: lea -0x1(%rbx),%edx
0x00000000004010d5 <+25>: callq 0x4010bc <func4>
0x00000000004010da <+30>: add %eax,%ebx
0x00000000004010dc <+32>: jmp 0x4010ec <func4+48>
0x00000000004010de <+34>: cmp %edi,%ebx
0x00000000004010e0 <+36>: jge 0x4010ec <func4+48>
0x00000000004010e2 <+38>: lea 0x1(%rbx),%esi
0x00000000004010e5 <+41>: callq 0x4010bc <func4>
0x00000000004010ea <+46>: add %eax,%ebx
0x00000000004010ec <+48>: mov %ebx,%eax
0x00000000004010ee <+50>: pop %rbx
0x00000000004010ef <+51>: retq
【问题讨论】:
-
为什么不使用 gdb 单步执行汇编指令呢?使用 gdb tui 模式和寄存器视图有助于在单步执行汇编指令时查看寄存器。
-
您的问题到底是什么?
-
@AmeyaVS,我已经尝试了很多次,但就是看不到 func4 中 %eax 中的值会发生什么。
-
@Cody Gray,我正在尝试找出作为输入的两个数字。
-
汇编代码中有没有100%看不懂的行?我们或许可以将您指向 CSAPP 的相应部分或手册。