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!

questionAnswers(1)

yourAnswerToTheQuestion