5

バグを含む実行可能ファイル(C ++、i386、MacOS / X Tigerでコンパイルされています)があります。バグの修正は簡単です。コード内にfork()を呼び出す場所がありますが、そうすべきではありません。修正は簡単で、実行可能ファイルを最初から再コンパイルするのは現時点では難しいため(質問しないでください)、実行可能ファイル/バイナリファイルに直接パッチを適用したいと思います。

そのための最初のステップとして、実行可能ファイルで「otool -tV MyExecutableName」を実行しました。これは、逆アセンブリの出力で見つかりました。

./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d        subl    $0x10,%esp
0002ce10        calll   0x0051adac
0002ce15        movzbl  0x14(%ebp),%esi
0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34
[... many more lines omitted ...]

したがって、私がやりたいのは、行0002ce19のオペコードを置き換えることです。これにより、_forkを呼び出す代わりに、無条件に失敗のケースにジャンプします(つまり、fork()が-1を返したかのように動作するはずです)。

残念ながら、私は分解/バイナリパッチの完全な初心者なので、これを行う方法がわかりません。特に、私の質問は次のとおりです。

1)必要なものを取得するには、場所0002ce19から0002xe1dにどのバイトを書き込む必要がありますか?「jmp0x0002cf02」と同等のアセンブルされたものになると思いますが、これらのバイトが何であるかをどのように把握できますか?

2)「otool-tV」によって出力されたオフセットは、実行可能ファイルの__TEXTセグメントにオフセットされているように見えます。印刷されたオフセットとファイルの先頭の間のバイトデルタを把握して、ファイル内の正しいバイトを編集/パッチできるようにするにはどうすればよいですか?

あなたが与えることができるアドバイスをありがとう!

4

3 に答える 3

3

私はMacOS/Xに精通していませんが、いくつかのヒントを与えることができます。

これを修正する適切な方法は、逆アセンブラを使用してファイルにパッチを適用することです。

0002ce19        calll   0x00850ac9

で置き換えることができます

0002ce19        movl   eax, -1 ; mov eax, 0xFFFFFFFF

表示されるオフセットは相対的なものであるため、ファイル内でそれらを見つけることはできません。
たとえば、jll 0x0002cf02実際にはjll 0x000000DF

私が正しければ、以下のコードブロック

0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34

このアセンブルされた形式(20バイト)になります:

0x  E8   AB3C8200
    83F8 00
    0F8C DF000000
    0F84 0B000000

そのシーケンスがファイル内で一意である場合、逆アセンブラを使用できない場合は、E8AB3C8200をに変更してみてください。B8FFFFFFFF

于 2009-10-30T05:52:07.057 に答える
2

おそらく最も簡単なmov $-1, %eaxのは、電話の代わりにすることです。.sファイルに入れてコンパイルし、結果をダンプして、パッチの場所より短い場合はnopsで埋めることで、対応するバイトを見つけることができます。ぴったり合う「b8ffffffff」が表示されます。

オフセットを__TEXT実行して探すことで、の始まりを見つけることができます。otool -l

于 2009-10-30T06:14:27.173 に答える
1

otxHexFiendがあなたの友達になります。otxを使用すると、ファイル相対オフセットを使用して分解できます。HexFiendを使用すると、ジャンプを修正できます。0x90はNOPの(x86)オペコードであるため、9090909090はfork()呼び出しの適切な代替であることに注意してください。(戻り値が生成されないことに注意してください。そのため、奇妙なことがeaxになってしまう可能性があります。)

于 2009-10-30T06:07:34.247 に答える