2

課題として与えられた単純な難読化された C プログラムからの次の 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 の原因となっている関数を特定しましたが、バイナリにパッチを適用する方法がわかりません。

私の問題は、パッチを適用する方法です

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

SECRET 関数を呼び出さないようにします。

実行時gdbにシングル ステップでプログラム カウンターを変更して SECRET をスキップ/ジャンプすると、プログラムは実行を終了し、必要な出力が得られます。

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

4

1 に答える 1

1

GDB で他に何ができるか興味がありました。GDB を使用してアセンブリを変更することができ、パッチを適用したプログラムは正常に動作しています。

nop を使用してみましたが、うまくいかなかったので、ジャンプ機能を調べました。私のパッチの仕組みは次のとおりです。

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

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

実験には 1 日かかりましたが、最終的には多くのことを学びました。:D

于 2016-09-17T22:53:36.497 に答える