実際に、Ubuntu 12.10 32 ビットおよび Intel x86 アーキテクチャでジャンプ指向のプログラミング例を作成して実行しようとしています。ターゲット システムで実行する最初のガジェットは、POPA 命令で始まります。Cdump.txt ファイルから objdump -D /lib/libc.so.6 > Cdump.txt を使用してオフセット アドレスを見つけました。次に、脆弱なプログラムを gdb で実行し、次のコマンドを使用してプログラムの実行可能なセグメントの範囲を見つけました。
ps ax|grep vul
21193 pts/2 S+ 0:00 gdb vul
==>「gdb vul」のプロセス番号を調べる。
grep libc /proc/21193/maps
b7a4a000-b7bed000 r-xp 00000000 08:01 656054 /lib/i386-linux-gnu/libc-2.15.so
==>実行可能プログラムがメモリのどこにロードされているかを調べる。
私は命令のアドレスの任意のシーケンスを書き、ASLR と Canary 保護をオフにしました。これは、スタックをオーバーフローさせ、スタック内の "return" の内容を変更して JOP シーケンスをトリガーする単純なコードです。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char Buff[4];
memcpy(Buff, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xd5\x7a\xbb\xb7\xd6\x7a\xbb\xb7\xd8\x7a\xbb\xb7\xdb\x7a\xbb\xb7\x9c\xf6\xff\xbf\x00\x60\xfc\xb7\xcc\xf6\xff\xbf\x24\xf7\xff\xbf\xb4\xf6\xff\xbf", 52);
return;
}
プログラムをデバッグし、スタックの内容を監視し、情報を登録します。esp が (%ebp)+8 アドレスに到達するまでは問題ありません。これは、返された後のアドレスを意味します。この 4 バイトは、edi、esi、ebp、esp、ebx、edx、ecx、eax の順にロードされる POPA 命令に従って edi をロードする必要があります。
したがって、edi はこのアドレスでロードする必要があります = 0xB7BB7AD6 スタック内の戻りコンテンツは = 0xB7BB7AD5 (POPA アドレス)
しかし、memcpy() を終了しようとすると、次のメッセージが表示されます。
Warning:
Cannot insert breakpoint 0.
Error accessing memory address 0xb7bb7ad6: Input/output error.
0xb7bb7ad5 in ?? ()
このエラーは何ですか? プログラムの制御フローをプロセスの実行可能メモリ内の別の命令に変更できないのはなぜですか?
より詳細な情報については、以下をご覧ください。
これは、スタックの上位 12 語です。
(gdb) x /12wx $esp-20
0xbffff67c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff68c: 0xb7bb7ad5 0xb7bb7ad6 0xb7bb7ad8 0xb7bb7adb
0xbffff69c: 0xbffff69c 0xb7fc6000 0xbffff6cc 0xbffff724
およびレジスタ:
(gdb) info registers
eax 0xbffff67c -1073744260
ecx 0xbffff6b4 -1073744204
edx 0xbffff6b0 -1073744208
ebx 0xb7fc6000 -1208197120
esp 0xbffff690 0xbffff690
ebp 0x90909090 0x90909090
esi 0x0 0
edi 0x0 0
eip 0xb7bb7ad5 0xb7bb7ad5
eflags 0x200283 [ CF SF IF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51