Caracteres C-Junk na saída
entrada.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;
}
As passagens comentadas são apenas para depuração. Porque como você pode ver (enquanto tenta), quando você quer apenas imprimi-lo, tudo funciona corretamente.
saída.c (ou se queres um alvo.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;
}
Quando Eu compile a entrada.C como:
gcc input.c -o input
& saída.c:
gcc output.c -o output
Está bem. Agora, está tudo preparado. Digamos que gostaria de enviar uma carga de 6.
./input 6 ./output
mas tudo o que consigo na saída é apenas isto (ou simplesmente com outros personagens de junks):
Output: A
Output: 0A
Output: 0,A
Output: 0,�A
Output: 0,�8A
Output: 0,�8�A
tentei tantas coisas, mas todas falharam e a saída ainda era a mesma, como podem ver acima.
Ficaria muito grato se alguém me pudesse ajudar e, possivelmente, mostrar-me onde está o problema. Pode ser um problema no uso do fork() e execl () funciona em conjunto?2 answers
payload
no código do bloco infantil...
Aqui está uma solução (não posso testá-la agora):
while(i < length)
{
pid = fork();
payload[i] = 'A';
payload[i + 1] = '\0';
if(pid != 0)
{
waitpid(-1, &status, 0);
//exit(0);
}
if(pid == 0)
{
execl(target, target, payload, NULL);
//printf("%s\n", payload);
}
++i;
}
[sentença não relacionada removida]
Edite (explicações adicionais): payload
a actualização deve estar em tanto o código dos pais como o código dos filhos. Se não percebes porquê, posso dar-te mais explicações.
EDIT2 (conforme solicitado). Quer actualizar a carga útil para o próximo processo de criança bifurcada. No seu código, todo o código infantil é substituído por execl()
em target
Código. Então o fork()
é executado apenas pelo primeiro processo pai (O raiz).
// block only executed by the first parent.
if(pid != 0)
{
waitpid(-1, &status, 0);
}
Portanto, você deve atualizá-lo em um lugar acessível tanto pelo pai quanto pela criança : depois do fork()
, antes do bloco if(pid == 0)
.
No seu código, você aumenta i
no bloco comum, mas o os pais payload
nunca são actualizados. Assim, no bloco infantil, pouco antes do execl()
, a sua adição 'A\0'
no final de uma cadeia Cnão-inicializada.
payload
, e executa exec (isto é, executa output
, que então morre. Ou seja, sua mudança de carga permanece na criança, e não afeta o processo pai. Só o ++i
faz, e é por isso que estás a ver dados não iniciados.
Mova a mudança de carga antes da bifurcação (ou pelo menos fora do bloco só para crianças), para que também esteja no Pai.