我正在尝试通过地址的“execl”命令将“unsigned char *”传递给另一个程序
这是第一个程序:
unsigned char myString;
...
unsigned char * myarr = malloc(80*sizeof(char));
...
//myarr is filled with some encrypted data
...
printf("\nresult:\t");
for(i=0;*(myarr+i)!=0x00;i++)
printf("%X ",*(myarr+i));
...
myString = malloc(80*sizeof(char));
myString = *myarr;
...
execl(".../Child", "Child", &myString, NULL);
关于第二个程序;
unsigned char *myString;
...
myString = (unsigned char *)argv[1];
...
unsigned char * mynewarr = malloc(80*sizeof(char));
mynewarr = myString;
...
printf("\nresult:\t");
for(i=0;*(mynewarr+i)!=0x00;i++)
printf("%X ",*(mynewarr+i));
这是我得到的结果
第一个程序
result: 20 DD 3E 99 2 94 7E C6 D DD 4 A 36 85 5B DA
第二个程序
result: 20
为什么结果不同?我究竟做错了什么?请帮助我。
我正在使用 eclipse,我在 ubuntu 13.10 中编码。
最佳答案
我道歉。我完全误解了你的问题并抢先了。
execl
的参数必须是空终止字符串,而您只是错误地传递了 myString。那就是说你在做什么有一些警告。您不能在加密数据中嵌入空值,否则它们将被(过早地)解释为字符串的结尾。正如 Zan Lynx 指出的那样,如果字符串是二进制的,您可以对其进行文本编码。您也不能传递无限长度的字符串。参数列表和环境的组合大小有多大的系统限制,如果超过 execl
将失败并返回 E2BIG。 (我最初的误解是认为你试图绕过这个限制。)
这是您的程序的最小工作示例(有些自由)。
第一个程序:
int main(int argc, char *argv[])
{
unsigned char *myString = malloc(80 * sizeof(char));
strcpy(myString, "filled with secret sauce");
printf("\nresult:\t");
for(int i = 0; *(myString + i) != '\0'; i++)
printf("%X ", *(myString + i));
printf("\n");
execl("./execpgm", "execpgm", myString, (char *) NULL);
perror("execl");
exit(1);
}
第二个程序:
int main(int argc, char *argv[])
{
unsigned char *mynewarr = malloc(80 * sizeof(unsigned char));
strncpy(mynewarr, argv[1], 80);
printf("\nresult:\t");
for (int i = 0; *(mynewarr + i) != '\0'; i++)
printf("%X ", *(mynewarr + i));
printf("\n");
exit(1);
}
再一次,我很抱歉在没有首先理解的情况下回答。
关于c - 有没有办法从c中的基地址获取完整数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20645863/