NENote of Exploiting


2006-11-13 : Hello Payload1

 ペイロード作成メモ。 このペイロードはコマンドライン上に「hello world!」と表示するものである。NASMアセンブリ言語を使用しているが、正常に動作しなかった。

[SC] hello.asm


global _start
_start:

BITS 32

jmp short two
one:
pop ecx

mov al, 4
mov bl, 1
mov dl, 12
int 0x80
mov al, 1
xor ebx, ebx
int 0x80

two:
call one
db 'hello world!'

Exemplification

 最初に、ソースコードからオブジェクトファイルを生成する。次のように"nasm"アセンブラを利用した。

defolos@glazheim:~$ nasm -f elf hello.asm

 次に、オブジェクトファイルから実行可能ファイルを生成するために、次にのようにldリンカを利用した。

defolos@glazheim:~$ ld hello.o

 これで「a.out」と名付けられた実行可能ファイルが得られた。このファイル名はldリンカのデフォルトの名前である。これを実行するが、このようなコードはペイロード専用に作られている。そのため、コマンドラインからの実行では多くの場合正常に動作しない。幸運にもこのコードは正常に動作した。

defolos@glazheim:~$ ./a.out
hello world!defolos@glazheim:~$ 

 次に、「hello.asm」からバイナリコードを生成する。バイナリコードはペイロードとして実行可能な形式である。nasmアセンブラを用いてアセンブルし、バイナリとして画面に表示するために「hexedit」と呼ばれる16進数エディタを実行する。

defolos@glazheim:~$ nasm hello.asm
defolos@glazheim:~$ hexedit hello

 命令の記述は次のように、すべて16進数で行われる。


eb 0f 59 b0 04 b3 01 b2
0c cd 80 b0 01 31 db cd
80 e8 ec ff ff ff 68 65
6c 6c 6f 20 77 6f 72 6c
64 21

 このコードを利用するために次のようにC言語のExploit([SC] exploit.c)に埋め込む。


char shellcode[]=
"\xeb\x0f"
"\x59\xb0\x04\xb3"
"\x01\xb2\x0c\xcd"
"\x80\xb0\x01\x31"
"\xdb\xcd\x80\xe8"
"\xec\xff\xff\xff"
"\x68\x65\x6c\x6c"
"\x6f\x20\x77\x6f"
"\x72\x6c\x64\x21"
;

Issues

 このコードは正常に動作しなかった。このコードはコマンドラインに「hello world!」と表示する変わりに、scanf関数の入力待ち受け状態になった。この動作はシェルコードのエラーの振る舞いとして頻出のものである。

 考えられる原因として、16進数で表示されたコードをコピーする際にミスが生じたというケースが考えられる。。

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