我试图通过地址“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进行编码。
答案 0 :(得分:2)
我道歉。我完全误解了你的问题然后跳了起来。
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);
}
同样,我很抱歉在没有先了解的情况下回答。
答案 1 :(得分:1)
您可以通过将完整的字符串写入新进程的命令行或写入临时文件并传递该文件名来解决此问题。
你说这是加密数据。这意味着它可能包含零。这意味着只需将字符串写入命令行就行了。虽然你可以用转义格式编写它,比如'\ 0'代表null,然后'\\'代表反斜杠,或者你可以使用BASE64编码。
但是编写指针不起作用,因为当exec运行时,内存空间被清除。