web-dev-qa-db-ja.com

悪用:EIPは実行可能ですがスタックへのジャンプを拒否します

私はBOFに悪用可能な program をCで記述しました。

TL; DR-私のペイロード(NOPスレッド+シェルコード+戻りアドレス)がEIPをオーバーライドしますが、EIPを設定して自分のアドレスを指すことができませんペイロード。ただし、EIPをスタックアドレス範囲外のどこにでも設定できます。 Stackは実行可能のようで、私が慣れ親しんでいるプロテクションはオフになっています。

_ragg2_ De bruijinパターンを使用してペイロードを送信し、EIPをオーバーライドするオフセットを見つけました。次に、NOPスレッド、次にシェルコードでペイロードを作成し、EIPをオーバーライドするオフセットで、NOPスレッドの中央のアドレスを書き込みました。

したがって、ペイロードは次のようになります。NOP-sled + Shellcode + Address somewhere at the middle of my NOP-Sled (Little Endian).

何か奇妙なことが起こり、プログラムを悪用することができませんでした。segfaultの後、EIPはペイロードの最後に使用したアドレスになく、EIPはその後600アドレスのようでした。しかし、ペイロードの最後のアドレスを「AABB」(0x42424141)、または0xd4d4fdff(0xd4d4の代わりに)などの他の何かに変更した場合ffffこれは私のシェルコード、リトルエンディアンの真ん中のアドレスです)正常に動作し、EIPは指定したアドレスにありました。

nx保護がオフ、ASLRが無効、Selinuxが無効、メモリページは実行可能で、ELCはGCCで_"-fno-stack-protector -z execstack"_を使用してコンパイルされているようです。

Gdbでもデバッガの外でも試してみました。

何が問題になるのでしょうか?なぜスタック上のアドレスへのジャンプを拒否するのですか?

バイナリに関する情報:

_havecode true
pic      false
canary   false
nx       false
crypto   false
va       true
intrp    /lib/ld-linux.so.2
bintype  elf
class    ELF32
lang     c
Arch     x86
bits     32
machine  Intel 80386
os       linux
minopsz  1
maxopsz  16
pcalign  0
subsys   linux
endian   little
stripped false
static   false
linenum  true
lsyms    true
relocs   true
rpath    NONE
binsz    6162
_

スタックに関する情報:

_sys 132K 0xfffdd000 - 0xffffe000 s -rwx [stack] [stack] ; map._stack_._rwx
_

EDIT:コマンドとシェルコード自体を含む詳細については、こちらをご覧ください: http://Pastebin.com/HYbByNSE

8
api pota

投稿したペイロードに基づいて、EIPを0xffffd4d4にジャンプさせたいようです。プログラムを実行する前に、そのアドレス(0xffffd4d4)にブレークポイントを設定します。これにより、プログラムの実行が0xffffd4d4に達したかどうかを確認できます。

シェルコードに問題があり、プログラムがシェルコードの途中でセグメンテーション違反を起こしている可能性があります。私が始めたとき、私は多くの同様の問題を抱えていました。

PS。あなたの質問では、0xd4d4ffffについて言及しました。チェックしてください。 0xd4d4ffffにジャンプする場合は、EIPを\ xd4\xd4\xff\xffではなく\ xff\xff\xd4\xd4に置き換える必要があるためです。

2