Desafio de hackers - localizando vulnerabilidade no código
Meu amigo recentemente concluiu um desafio de hackers e o enviou para mim (binário e de origem). Eu queria perguntar aqui antes de pedir dicas, pois quero fazer isso pessoalmente :)
Eu tenho passado por isso, mas estou lutando para encontrar a vulnerabilidade.
#include <alloca.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static void usage(const char *argv0) {
printf("Build your own string!\n");
printf("\n");
printf("Usage:\n");
printf(" %s length command...\n", argv0);
printf("\n");
printf("Each command consist of a single character followed by it's index.\n");
printf("\n");
printf("Example:\n");
printf(" %s 11 h0 e1 l2 l3 o4 w6 o7 r8 l9 d10\n", argv0);
exit(1);
}
int main(int argc, char **argv) {
char *buffer;
unsigned short buffersize, i, index, length;
if (argc < 2) usage(argv[0]);
length = atoi(argv[1]);
if (length <= 0) {
fprintf(stderr, "bad length\n");
return 1;
}
buffersize = length + 1;
buffer = alloca(buffersize);
memset(buffer, ' ', buffersize);
buffer[buffersize - 1] = 0;
for (i = 2; i < argc; i++) {
if (strlen(argv[i]) < 2) {
fprintf(stderr, "bad command \"%s\"\n", argv[i]);
return 1;
}
index = atoi(argv[i] + 1);
if (index >= length) {
fprintf(stderr, "bad index in command \"%s\"\n", argv[i]);
return 1;
}
buffer[index] = argv[i][0];
}
printf("%s\n", buffer);
return 0;
}
Eu acho que a vulnerabilidade está no int curto e no uso de alloca.
Entrando./app 65535 65535
pode causar um segfault, mas na verdade não posso substituir nada, já que o buffer só será definido para no máximo 65535 ou será executado em loop. Isso me faz pensar que não posso substituir o EIP para injetar código de shell.
Alguém pode me ajudar com onde procurar?
Obrigado!