2017-07-06 6 views
-2

このアセンブリコードに問題があり、2桁の答えが分かります。私が知っていることは、入力がスペースで区切られた2桁であると仮定され、最後の比較に基づいて、最後の桁は0x6b(10進数で107)に等しくなければならないということだけです。 Func4はeax値に何かをして107にしますが、私は本当にわかりません。入力として2つの数字が使われますか?どんな助けもありがとう。バイナリボムフェーズ4、func4コールへのステップ

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 <[email protected]> 
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 
+0

gdbを使用してアセンブリ命令を実行するのはなぜですか? gdb tuiモードを使用してビューを登録すると、アセンブリ命令をステップ実行しながらレジスタを調べるのに役立ちます。 – AmeyaVS

+1

あなたの質問は何ですか? –

+0

@AmeyaVS、私は何度も試しましたが、%eaxの値がfunc4の中でどうなっているのか分かりません。 – user181421

答えて

0

これに対する答えは、我々は第二数である0x6bに相当しなければならないことがわかりますメインコードの最後の比較文のオフに基づいて33 107ですそれ以外の場合は107で爆発する。最初の数を得るために、私は単にfunc4のダンプコードを調べて、バイナリ検索を行っていることを見ました。最初の数字の値が2つの比較に基づいて19と35の間でなければならないことをメインコードから知っているので、27を最初の推測として選んで27より高い必要があることがわかります。コード全体のさまざまな段階のレジスタが助けになりました!

関連する問題