LinuxでASLRが有効になっている場合、ユーザースタックアドレスが存在するアドレスの範囲はありますか?ヒープ、命令アドレス(テキストセクション)はどうですか?一般的に、アドレスを見て、それがデータ用かコード用かを判断することは可能ですか?
返却後にEIPを確認し、EIPがデータ領域を指しているかどうかを確認するピンツールを作成しようとしています。このシステムでNXが有効になっていないとします。
はい、範囲があり、実行中のプロセスに対してその範囲を簡単に決定できます。特定のプロセスの_/proc/<pid>/maps
_を読み取り、そのメモリレイアウトと各アドレス範囲のメモリのタイプを確認します。これは proc(5)
で説明されています。組み込みデバイスのサンプル:
root @ UP-7197:〜#cat /proc/self/maps 00400000-0044b000 r-xp 00000000 1f:02 944 /bin/busybox 0045b000-0045c000 rw- p 0004b000 1f:02 944 /bin/busybox 77450000-77472000 r-xp 00000000 1f:02 802 /lib/libgcc_s.so.1 77472000-77473000 rw-p 00012000 1f:02 802 /lib/libgcc_s.so.1 77474000-77506000 r-xp 00000000 1f:02 891 /lib/libc.so 77513000-77514000 r--p 00000000 00:00 0 [vvar] 77514000-77515000 r-xp 00000000 00:00 0 [vdso] 77515000-77517000 rw-p 00091000 1f:02 891 /lib/libc.so 77517000-77519000 rwxp 00000000 00:00 0 7fc55000-7fc76000 rw-p 00000000 00:00 0 [スタック]
構文は説明されています スタックオーバーフローでオーバー 。
はい、完全に信頼できるとは限りませんが、一般的に、異なるセクションの開始と終了を推測することが可能です。プロセスがメモリ内でどのように構造化されるかについては、 ELF形式 を参照してください。