2016-09-16 3 views
2

私は割り当てとして私に与えられた単純な難読化されたCプログラムの次のASMコードを持っています。ELFバイナリでasm命令を変更します

0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax 
    0x00000000004006a4 <+151>: mov %rdx,%rsi 
    0x00000000004006a7 <+154>: mov %rax,%rdi 
    0x00000000004006aa <+157>: callq 0x400713 <SECRET> <====== 
    0x00000000004006af <+162>: movl $0x0,-0x24(%rbp) 
    0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203> 
    0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax 

目的は、セグメンテーションフォルトを引き起こしている機能(プログラムバイナリにパッチを当てる)を見つけて削除することです。私はsegfaultの原因となっている機能を見つけましたが、バイナリにパッチを当てる方法はわかりません。

私の問題は、私は文句を言わないSECRET関数を呼び出すように

0x00000000004006aa <+157>: callq 0x400713 <SECRET> 

にパッチを適用する方法です。

gdbを使用して、実行時にシングルステップ実行中にプログラムカウンタを変更してSECRETをスキップ/ジャンプすると、プログラムは実行を終了し、私に必要な出力を与えます。

私が望むのは、常にデバッガを使用せずにスキップする実行可能バイナリファイルの永久に変更されたコピーです。

+0

gdbなしでプログラムを実行すると、スキップするかジャンプする方法はありますか –

+0

GDBでスキップすることはあなたの課題を解決するものではありませんが、gdbは必要な場所にジャンプできます。 gdbマニュアルを確認してください。そのデバッグセッション中に 'call'命令をNOPで上書きすることさえできます。これがバイナリの爆弾ラボの割り当てのようなものならば、実行はそのブロックに決して到達しないように異なる入力を与えるはずです。 –

+0

はい私はプログラムカウンターでそれを行うことができますが、バイナリを編集し、その関数呼び出しを削除してパッチを当てたファイルを保存する方法を探しています。 –

答えて

1

私はGDBで何ができるのか不思議でした。私はGDBを使ってアセンブリを変更することができたので、パッチを適用したプログラムは正常に動作しています。

私はnopを使ってみましたが、機能しなかったので、私は機能をジャンプするように見えました。私のパッチの仕組みは:

(gdb) set {unsigned char *}0x4006aa = 0xEB 
(gdb) set {unsigned char *}0x4006ab = 0x0C 

私はやっています。 ショートジャンプオペコードはEB XXです.XXはIP/PCからの相対ジャンプです。 この場合、12バイト先にジャンプする必要があります。また、命令は2バイトであるため、連続したメモリ位置に書き込みます。私は、新しい変更されたバイナリをハードドライブに書き出します。

私には実験の日がかかりましたが、結局私は多くのことを学びました。 :

+1

あなたはおそらく 'set {unsigned short *} 0x4006aa = 0x0CEB'を行うことができます –

+1

これは私がこれのようなことをするのは初めてでした。 –

関連する問題