Utilize um estouro de pilha para gravar dados arbitrários

Eu tenho tentado aprender o básico de um ataque de estouro de pilha. Estou interessado principalmente em usar uma corrupção ou modificação dos metadados do chunk para a base do ataque, mas também estou aberto a outras sugestões. Eu sei que meu objetivo de explorar deve substituir oprintf() ponteiro de função com ochallenge() ponteiro de função, mas não consigo descobrir como conseguir essa gravação. Eu tenho o seguinte pedaço de código que eu quero explorar, que está usandomalloc a partir deglibc 2.11.2 :

void challenge()
{
        puts("you win\n");
}

int main(int argc, char **argv)
{
        char *inputA, *inputB, *inputC;

        inputA = malloc(32);
        inputB = malloc(32);
        inputC = malloc(32);

        strcpy(inputA, argv[1]);
        strcpy(inputB, argv[2]);
        strcpy(inputC, argv[3]);

        free(inputC);
        free(inputB);
        free(inputA);

        printf("execute challenge to win\n");
}

Obviamente, conseguir uma substituição real dos metadados de um pedaço alocado é trivial. No entanto, não consegui encontrar uma maneira de explorar esse código usando nenhuma das técnicas padrão. Eu li e tentei implementar as técnicas de:

O jornal: w00w00 emHeap Overflows Embora o artigo seja muito claro, ounlink a técnica está obsoleta há algum tempMalloc Maleficarum.txtEste documento expande as técnicas de exploração a partir dos dias w00w00 e explica as versões mais recentes da glibc. No entanto, não achei que, dadas as 5 técnicas detalhadas no artigo, o código acima corresponda a qualquer um dos pré-requisitos para essas técnicaEntendendo a pilha quebrando-a (pdf) O pdf fornece uma boa revisão de como o heap funciona, mas concentra-se em técnicas duplas livre

Inicialmente, tentei explorar esse código manipulando o valor do tamanho do chunk para inputC, de modo que ele apontasse de volta para a cabeça do chunk inputC. Quando isso não funcionou, tentei apontar novamente para o pedaço de inputB. Foi quando percebi que a nova glibc realiza uma verificação de sanidade no valor do tamanh

Como um usuário pode criar uma exploração para tirar proveito de um livre, assumindo que ele tem a capacidade de editar os metadados do pedaço alocado para valores arbitrários e utilizá-lo para substituir um valor no GOT ou gravar em qualquer outro endereço arbitrári

ota: Quando eu escrevo 'endereço arbitrário', entendo que as páginas da memória podem ser apenas de leitura ou protegidas, quero dizer um endereço no qual posso assumir que posso escreve

questionAnswers(6)

yourAnswerToTheQuestion