2016-12-03 1 views
-1

ここでは、コードが何をしているのか、私はそれを解決する方法を理解しています:まず、文字列を見つけて、その文字列をリバースエンジニアリングする必要があります。私が見つけたバイトのルックアップテーブル。私はこれらの "オフセット"の値が60まで加算されなければならないことを知っています。< + 53>を参照してください。二進の爆弾をデフラグする:phase_5

x/s 0x4011feを使用してこの6文字の文字列を検索しようとしましたが、他のコマンド(x/6cなど)を調べても、正しいものが得られません。正しい出力を得るために私が変えることができるものがあるので、私はこの段階を解消し続けることができますか?

私はこの文字列を見つけたら、この必要な出力文字列を見て、予想される出力に到達するのに必要な入力文字列を見つけます。私は考えている - 各文字の16進数を見て、それらを私のテーブル(最下位)と比較して、対応するcharをasciiテーブルを使って見つける。私はこれが正しいアプローチ、おかげであるかどうかだけ疑問に思っています。

ルックアップテーブル:

(gdb) x/16xw 0x402780 
<array.3600>: 0x00000002 0x0000000a 0x00000006 0x00000001 
<array.3600>: 0x0000000c 0x00000010 0x00000009 0x00000003 
<array.3600>: 0x00000004 0x00000007 0x0000000e 0x00000005 
<array.3600>: 0x0000000b 0x00000008 0x0000000f 0x0000000d 

phase_5の分解:

0x00000000004011bf <+0>: push %rbx 
0x00000000004011c0 <+1>: mov %rdi,%rbx 
0x00000000004011c3 <+4>: callq 0x401414 <string_length> 
0x00000000004011c8 <+9>: cmp $0x6,%eax //6 letter string! 
0x00000000004011cb <+12>: je  0x4011d2 <phase_5+19> //if 6, jump over the explode 
0x00000000004011cd <+14>: callq 0x401706 <explode_bomb> 
0x00000000004011d2 <+19>: mov %rbx,%rax 
0x00000000004011d5 <+22>: lea 0x6(%rbx),%rdi 
0x00000000004011d9 <+26>: mov $0x0,%ecx 
0x00000000004011de <+31>: movzbl (%rax),%edx 
0x00000000004011e1 <+34>: and $0xf,%edx //”and” each letter 
0x00000000004011e4 <+37>: add 0x402780(,%rdx,4),%ecx 
0x00000000004011eb <+44>: add $0x1,%rax 
0x00000000004011ef <+48>: cmp %rdi,%rax //compare, and then loop again. 
0x00000000004011f2 <+51>: jne 0x4011de <phase_5+31> //loop! 
0x00000000004011f4 <+53>: cmp $0x3c,%ecx //final compare, and then done! (0x3c = 60) 
0x00000000004011f7 <+56>: je  0x4011fe <phase_5+63> //jump over explode, and finish! 
0x00000000004011f9 <+58>: callq 0x401706 <explode_bomb> 
0x00000000004011fe <+63>: pop %rbx 
0x00000000004011ff <+64>: retq 
End of assembler dump. 
+2

私は、少なくともいくつかのフィードバックを与えなくても、ダウン投票した人を好きになったことはありません。私は下降投票しませんでしたが、他の人があなたに説明の礼儀をしていないので、あなたは宿題に関する質問を掲示しました。「何をすべきかわからない、答えは何ですか?あなたはあなたの目標が何かを投稿し、正しい方向にナッジを求める場合は、はるかに良い運を持っています...私はstackoverflow.comはそのための場所だとは思わないが。 –

+0

さらに、人々が宿題を投稿して肯定的な回答を得ているのを見たとき、一般的に著者は自分が試したことを概説しているので、著者の宿題をしているように感じることはありません。 –

+0

@BrianVandenbergについてごめんね、本当にありがとうございました!私は私の質問を編集しました、うまくいけばそれは今より良いです。私は数日間されているので、主に調べる文字列を見つける方法に立ち往生しています。私は、私が正しく考えているという確認を得るために私の思考プロセスを説明しようとしました、私はそれをより明確にしようとします。再度、感謝します! – Mary

答えて

1

あまり考えた後、私は成功した答えを発見しました。比較する文字列がないことが判明し、0x3cの値のみが返されます。アセンブリコードを読むことについて、考え過ぎることは私にとっては一般的なものではないようです。

本質的に、私は最大で0x3cまでの配列から6つの数字を選ぶ必要がありました。その後、適切なインデックスを持つ印刷可能な6文字または数字を下位4ビットとして選択します。したがって、最も簡単な選択肢は0xaで、これは1のインデックスを持ちます(0xa = 10なので、6つの値を取るのは簡単です)。

コメントありがとうございます。

関連する問題