Assembly 二进制炸弹阶段4,进入func4调用
因此,我在汇编代码方面遇到了一些问题,并找出了两位数字的答案。我只知道输入应该是两个用空格分隔的数字,根据最后一次比较,最后一个数字应该等于0x6b,这是十进制的107。Func4对eax值做了一些修改,使其为107,但我不是很确定。那么,哪两个数字将作为输入?。任何帮助都将不胜感激Assembly 二进制炸弹阶段4,进入func4调用,assembly,gdb,x86-64,Assembly,Gdb,X86 64,因此,我在汇编代码方面遇到了一些问题,并找出了两位数字的答案。我只知道输入应该是两个用空格分隔的数字,根据最后一次比较,最后一个数字应该等于0x6b,这是十进制的107。Func4对eax值做了一些修改,使其为107,但我不是很确定。那么,哪两个数字将作为输入?。任何帮助都将不胜感激 0x000000000040135a <+0>: sub $0x18,%rsp 0x000000000040135e <+4>: lea 0x8(%rsp),%rcx
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
进入功能4
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
答案是33107。根据主代码中的最后一个比较语句,我们可以看到第二个数字必须等于0x6b,即十进制的107,否则它将爆炸。为了得到第一个数字,我只检查了func4的转储代码,发现它正在进行二进制搜索。由于我们从主代码中知道,根据两次比较,第一个数字的值必须介于19和35之间,因此我们可以选择27作为第一个猜测,并看到该数字需要高于27。在代码的不同阶段浏览寄存器有帮助 为什么不使用gdb逐步完成组装说明?使用gdb tui模式和寄存器视图在逐步执行汇编指令时帮助查看寄存器。您的问题到底是什么?@AmeyaVS,我已经尝试了很多次,但就是看不到func4中%eax中的值会发生什么。@Cody Gray,我试图找出作为输入的两个数字。在汇编代码中有没有一行是你100%不理解的?我们可以为您指出CSAPP的相应部分或手册。