gpt4 book ai didi

c - 如何在运行主函数之前更改其参数

转载 作者:行者123 更新时间:2023-11-30 14:38:20 25 4
gpt4 key购买 nike

在下面的代码中,我想在不修改main函数的情况下更改main函数的参数。

最近读了AFL fuzzing工具的代码,对于forkserver,我不明白如何将参数传递给目标程序,所以写了这个简单的程序。

我尝试使用管道重定向标准输入并将参数写入标准输入,但它不起作用。

#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”。

最佳答案

修改 C 运行时环境的 int argc参数计数器之前 C int main(int argc, char **argv)方法被调用。 。 。 - - - = = = (; 令人讨厌的黑客;) = = = - - - 。 。 .

<小时/>

我正在使用:

  • 目前可用于 OS X High Sierra 的最新 C++ 编译器,
  • 使用当前标准方式安装 brew .

重现下面的结果 argc.cpp代码 list ,或者:

<小时/>

argc.cpp:

    #include <stdio.h>

__attribute__((constructor)) void start(int argc, char **argv)
{
int * pc = (int *) argv - 2; // NASTY HACK TO GET C RUNTIME argc * ;)
printf("argc = %d \n", *pc); // the original argc, on most systems ;)
int NUMBER_OF_PARAMETERS_NEEDED_FOR_FUZZING = 1; // Replace this line
// with the simple/complex logic needed for fuzz testing (fuzzing)
if(!(argc > NUMBER_OF_PARAMETERS_NEEDED_FOR_FUZZING)){
argc = NUMBER_OF_PARAMETERS_NEEDED_FOR_FUZZING + 1;
*pc = argc; // NASTY HACK TO OVERWRITE C RUNTIME argc ;)
}
// *pc = 2; // uncomment this to see that you can also reduce argc
argv[1] = "hello"; // Example setting of a fuzzy argument
// Add more lines, a loop, etc... here to set more fuzzy arguments
for (int i = 0; i < argc; i++) {
printf("%s: argv[%d] = '%s'\n", __FUNCTION__, i, argv[i]);
}
printf("argc = %d \n", argc); // the possibly modified argc
}

int main(int argc, char **argv)
{
for (int i = 0; i < argc; i++) {
printf("%s: argv[%d] = '%s'\n", __FUNCTION__, i, argv[i]);
}
printf("argc = %d \n", argc); // the possibly modified argc
return 0;
}
<小时/>

Mac 操作系统终端:

<小时/>

编译:

    $ /usr/local/bin/c++-9 argc.cpp -o argc
<小时/>

正在运行 0参数,原始 int argc = 1 :

    $ ./argc
argc = 1
start: argv[0] = './argc'
start: argv[1] = 'hello'
argc = 2
main: argv[0] = './argc'
main: argv[1] = 'hello'
argc = 2
<小时/>

正在运行 3参数,原始 int argc = 4 :

    $ ./argc 1 2 3
argc = 4
start: argv[0] = './argc'
start: argv[1] = 'hello'
start: argv[2] = '2'
start: argv[3] = '3'
argc = 4
main: argv[0] = './argc'
main: argv[1] = 'hello'
main: argv[2] = '2'
main: argv[3] = '3'
argc = 4
<小时/>

运行,演示 argc还原能力,

  • 取消第 13 行注释并重新编译后(硬编码 argc = 2 ):
        *pc = 2; // uncomment this to see that you can also reduce argc

3相同参数,如上所述,原始 int argc = 4 :

    $ ./argc 1 2 3
argc = 4
start: argv[0] = './argc'
start: argv[1] = 'hello'
start: argv[2] = '2'
start: argv[3] = '3'
argc = 4
main: argv[0] = './argc'
main: argv[1] = 'hello'
argc = 2
<小时/>

如果C 运行时环境在您的系统上初始化,类似于列表:

您可能需要:

  • 通过将本地 C 运行时环境与上面的 GNU 示例进行比较来研究差异,和/或
  • 实验性地修改我的代码,直到它适合您。例如:在 argv 的位置之前以及!之后!遍历 int 指针看看你在那里发现了什么......

如果您发现破解当前的C 运行时环境太困难,请尝试:

<小时/>

以下是此黑客的工作方式/原因:

  1. C Runtime Environment适用于您的设置的功能(有多种可能性)保存 int argc, char **argv, char **envp某些内存位置中的参数 - 幸运的是,在我的设置中,这些参数是相邻的。
  2. 在我的64 bit上系统,由于内存对齐规则int argc地址只是 1 个额外的 sizeof(int)位于 char **argv 指向的内存之前,这就是 - 2 的原因在:int * pc = (int *) argv - 2;线路不是 - 1 .
<小时/>
╦ ╦  ╔═╗  ╔═╗  ╔═╗  ╦ ╦       ╦ ╦  ╔═╗  ╔═╗  ╦╔═  ╦  ╔╗╔  ╔═╗ ╦ ╦ ╦
╠═╣ ╠═╣ ╠═╝ ╠═╝ ╚╦╝ ─── ╠═╣ ╠═╣ ║ ╠╩╗ ║ ║║║ ║ ╦ ║ ║ ║
╩ ╩ ╩ ╩ ╩ ╩ ╩ ╩ ╩ ╩ ╩ ╚═╝ ╩ ╩ ╩ ╝╚╝ ╚═╝ o o o

关于c - 如何在运行主函数之前更改其参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56678458/

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