私は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
投稿したペイロードに基づいて、EIPを0xffffd4d4にジャンプさせたいようです。プログラムを実行する前に、そのアドレス(0xffffd4d4)にブレークポイントを設定します。これにより、プログラムの実行が0xffffd4d4に達したかどうかを確認できます。
シェルコードに問題があり、プログラムがシェルコードの途中でセグメンテーション違反を起こしている可能性があります。私が始めたとき、私は多くの同様の問題を抱えていました。
PS。あなたの質問では、0xd4d4ffffについて言及しました。チェックしてください。 0xd4d4ffffにジャンプする場合は、EIPを\ xd4\xd4\xff\xffではなく\ xff\xff\xd4\xd4に置き換える必要があるためです。