Допустим, у меня есть две программы - input.c и output.c. Все, что я хочу сделать, это отправить некоторую полезную нагрузку/символы в формате "половина пирамиды" в другую с помощью функции execl().
input.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
& output.c:
gcc output.c -o output
Ok. Теперь все подготовлено. Скажем, я хочу отправить полезную нагрузку - длина 6
./input 6 ./output
но все, что я получаю на выходе, это только это (или просто с другими символами джонки):
Output: A
Output: 0A
Output: 0,A
Output: 0,�A
Output: 0,�8A
Output: 0,�8�A
Я пробовал так много вещей, но все они потерпели неудачу, а результат был таким же, как вы можете видеть выше.
Я был бы очень признателен, если бы кто-нибудь мог мне помочь и, возможно, показать мне, где проблема. Может быть проблема в совместном использовании функций fork() и execl()?