【发布时间】:2019-06-20 03:12:15
【问题描述】:
在下面的代码中,我想在不修改主函数的情况下更改主函数的参数。
最近看了AFL fuzzing工具的代码,对于forkserver,不明白怎么给目标程序传参数,所以写了这个简单的程序。
我曾尝试使用管道重定向stdin并将参数写入stdin,但不起作用。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
__attribute__((constructor))
void __start() {
static unsigned char tmp[4];
int count = 0;
pid_t pid;
int status;
while(count < 3){
pid = fork();
if(pid < 0) _exit(1);
if(!pid){
//how to pass "hello" to main without modfiying main function.
return;
}
count++;
if(count == 3) _exit(1);
}
//_exit(0);
}
int main(int argc, char** argv){
for(int i = 0; i < argc; i++){
printf("%d %s\n", i, argv[i]);
}
return 0;
}
如果 argv 中为“hello”,则 argc 应为 2,输出应为“1 hello”。
【问题讨论】:
-
简单的解决方案:在你分叉后调用
execvp(或其他一些exec*)。您不需要在分叉后将标准输入重定向到标准输入,但您可能希望将其重定向到 其他东西,因为具有相同标准输入的多个分叉子代不起作用并且多个分叉子代共享相同的stdout和/或stderr往往会导致不可读的交错输出。 -
系统调用exexvp(或其他exec*)用于执行程序。在我的程序中,__start函数在main之前运行,所以当我们想多次运行实际程序--main()时,不需要像afl-fuzz的forkserver那样多次加载和初始化。跨度>
-
谢谢! @MichaelBurr 这两个链接很有用。虽然我们可以在没有 argc 的情况下解析 argv,但一些实际程序也需要 argc 来解析 argv。如果我想把 start 函数打成二进制文件,但是像上面的 main 函数一样需要 argc,那么如何在 start 中动态改变 main 的 argc 和 argv 呢?
-
从您准备将
__start添加到您的二进制文件的事实来看,我假设当您说“不修改主文件”时,您仍然准备修改二进制文件。这是真的吗?
标签: c compiler-construction main