Sagen wir, ich habe zwei Programme - input.c & output.c Alles, was ich tun möchte, ist einige Nutzlast/Zeichen im "Halbpyramide" -Format in ein anderes mit execl() -Funktion zu senden .C - Junk Zeichen am Ausgang
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;
}
kommentiert Passagen sind nur für Debugging-Zwecke. Denn wie Sie sehen können (während Sie es versuchen), wenn Sie es nur drucken möchten, funktioniert alles einwandfrei.
output.c (oder wenn Sie wollen '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;
}
Wenn ich kompilieren input.c wie:
gcc input.c -o input
& output.c :
gcc output.c -o output
Ok. Jetzt ist alles vorbereitet. Sagen wir mal, ich möchte eine Nutzlast senden - Länge 6
./input 6 ./output
aber alles, was ich auf die Produktion bekommen, ist nur diese (oder einfach mit einem anderen Dschunken Zeichen):
Output: A
Output: 0A
Output: 0,A
Output: 0,�A
Output: 0,�8A
Output: 0,�8�A
ich so viele versucht Dinge, aber alle von ihnen scheiterten und die Ausgabe war immer noch die gleiche, wie Sie oben sehen können.
Ich wäre sehr dankbar, wenn mir jemand helfen könnte und mir vielleicht zeigen könnte, wo das Problem ist. Kann es Probleme geben, die Funktionen fork() und execl() zusammen zu verwenden?
Du bist ein Mann! Ja, es funktioniert wie ein Charme . vielen Dank für Ihre Hilfe. und ja, wenn es für Sie nicht Problem ist, würde ich für einige detailliertere Erklärung dankbar sein, denn ich glaube nicht, dass ich es auf 100% zu verstehen und ich will nicht etwas tun ähnlicher Fehler in der Zukunft. – Yeez
Ok, ich füge ein paar Erklärungen hinzu. Es war ein guter "Refresh h "Training für mich. – Amessihel
Hehe, ich bin froh, dass es so war. Wie auch immer, jetzt überprüfe ich es noch einmal und ich habe eine zusätzliche Frage - wenn du antworten kannst. Falls ich strncpy durch strcpy ersetze und "./input 80 ./output" mache, warum sehe ich dann irgendwo auf der Ausgabe "Segmentation fault"? Ich bin nur Neugierig. – Yeez