0

CSAPPのbuflabからの問題。スタックを破壊するのに十分な長さのエクスプロイトコードを入力するように求められます。フェーズ2では、最初にglobal_valueという名前のグローバル変数の値を変更してから、 bangという名前の関数を呼び出す必要があります。ただし、bangのアドレスをスタックにプッシュしてから戻る場合にのみ機能します。

#codes before set the value of global_value
movl $0x12345678,%eax         /* 0x12345678 is the address of bang */
push %eax
ret

私が次のような直接ジャンプを使用する場合

#codes before set the value of global_value
jmp 0x12345678

その後、gdbを使用した0x5abcdefgのような場所で完全に迷子になりました。誰でも助けることができますか?これはモードのアドレス指定と関係がありますか?

4

1 に答える 1

0

jmp 0x12345678本当に何であるかをどうやって知っていますjmp 0x12345678か?

イミディエートオペランドからジャンプアドレスを取得するすべての非ファージャンプは、命令の直後の命令の位置を基準にしていjmpます。

したがって、メモリに次のようなものがある場合:

Address    Contents
0x55555555 E9 78 56 34 12

次に、これは0x55555555 + 5(jmp命令長)+ 0x12345678=0x6789ABD2へのジャンプです。

OTOH、あなたがこれを持っているなら:

Address    Contents
0x55555555 E9 1E 01 DF BC

次に、これは0x55555555 + 5(jmp命令長)+ 0xBCDF011E=0x12345678へのジャンプです。

于 2013-03-24T06:57:29.430 に答える