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 livreInicialmente, 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