假设我有两个程序 - input.c 和 output.c 我想要做的就是使用 execl() 函数将一些“半金字塔”格式的有效负载/字符发送到另一个程序中。
输入.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define SIZE 1024
int length;
int main(int argc, char *argv[])
{
pid_t pid;
char *target;
//char payload[length+1];
char payload[SIZE + 1];
int status;
int i = 0;
if(argc < 2)
{
printf("Usage %s <length> <target>\n", argv[0]);
exit(EXIT_FAILURE);
}
length = atoi(argv[1]);
target = argv[2];
while(i < length)
{
pid = fork();
if(pid != 0)
{
waitpid(-1, &status, 0);
//exit(0);
}
if(pid == 0)
{
payload[i] = 'A';
payload[i + 1] = '\0';
execl(target, target, payload, NULL);
//printf("%s\n", payload);
}
++i;
}
return 0;
}
注释段落仅用于调试目的。因为正如您所见(尝试时),当您只想打印它时,一切正常。
output.c(或者如果你想要' target.c ')
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buffer[30];
strncpy(buffer, argv[1], sizeof(buffer));
printf("Output: %s\n", buffer);
return 0;
}
当我像这样编译 input.c 时:
gcc input.c -o input
&输出.c:
gcc output.c -o output
好的。现在,一切都准备好了。假设,我想发送一个有效载荷 - 长度为 6
./input 6 ./output
但我得到的只是这个(或者只是用另一个垃圾字符):
Output: A
Output: 0A
Output: 0,A
Output: 0,�A
Output: 0,�8A
Output: 0,�8�A
我尝试了很多东西,但都失败了,输出仍然相同,如您在上面看到的。
如果有人可以帮助我并可能告诉我问题出在哪里,我将不胜感激。一起使用 fork() 和 execl() 函数会有问题吗?