Controle do EIP
Substitua o endereço de retorno
Controle do EIP é uma aula grátis de Ethical Hacking Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ethical Hacking Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ethical Hacking Academy inclui 4 aulas no total.
O objetivo
Você tem o deslocamento, portanto pode colocar quaisquer quatro bytes no EIP. A pergunta agora é: que endereço deve colocar ali?
Você quer que o EIP aponte para o seu código de shell. Mas não pode simplesmente codificar o endereço da pilha; precisa de um salto confiável.
Por que não codificar o endereço da pilha?
O endereço da pilha onde o seu código de shell está localizado pode mudar entre execuções e sistemas. Até pequenas alterações no ambiente podem deslocá-lo.
Em vez disso, você usa uma instrução estável já existente na memória, que redireciona a execução para onde o ESP aponta no momento.
O truque do JMP ESP
Se o ESP apontar para o seu código de shell no momento da falha, você poderá definir o EIP como o endereço de uma instrução JMP ESP. Quando o EIP carregar esse endereço, a CPU executará jmp esp e saltará para o seu código de shell.
Essa indireção torna o exploit confiável, independentemente do endereço exato da pilha.
jmp esp ; opcode FF E4Encontrando um JMP ESP
Procure os bytes de código de operação FF E4 nos módulos carregados, de preferência em módulos sem ASLR. O endereço-base do módulo permanece constante, portanto esse gadget é confiável.
Ferramentas como mona.py encontram automaticamente instruções adequadas.
!mona jmp -r esp -cpb "\x00"Evitando caracteres inválidos
Alguns valores de byte corrompem a entrada antes que ela chegue intacta ao buffer. O exemplo clássico é o byte nulo 0x00, que termina strings C. Outros exemplos incluem 0x0a (nova linha) e 0x0d (retorno de carro).
O endereço de JMP ESP não pode conter nenhum desses caracteres inválidos.
Identificando caracteres inválidos
Para descobrir quais bytes são inválidos, envie todos os valores de byte de 0x00 a 0xff no buffer e inspecione a memória no depurador. Bytes alterados ou ausentes são caracteres inválidos.
Você excluirá esses caracteres tanto do endereço de retorno quanto do código de shell.
!mona bytearray -cpb "\x00"Montando a sobrescrita do EIP
Agora monte a entrada: preenchimento até o deslocamento e, em seguida, o endereço de JMP ESP na ordem little-endian.
Se o JMP ESP estiver em 0x625011AF, os bytes escritos serão invertidos.
buf = "A"*offset + "\xaf\x11\x50\x62" # 0x625011AF, little-endianVerificando o salto
Defina um ponto de interrupção no endereço de JMP ESP no depurador e execute o exploit. Quando o EIP chegar a esse endereço e avançar para o ESP, você terá confirmado um redirecionamento confiável.
Neste ponto, o EIP aponta para onde o seu código de shell será colocado.
Abrindo espaço para o código de shell
Depois do endereço de retorno, o buffer restante (para onde o ESP aponta) conterá o seu código de shell. Se o espaço for limitado, talvez seja necessário usar um salto curto ou realocar o código.
Uma trilha de NOPs (uma sequência de bytes sem operação 0x90) antes do código de shell cria uma margem, permitindo que o salto pouse em qualquer ponto da trilha.
buf = "A"*offset + ret + "\x90"*16 + shellcodeJuntando tudo
A estrutura completa do exploit agora está clara:
- Preenchimento até o deslocamento.
- O endereço de JMP ESP (sem caracteres inválidos, em little-endian).
- Uma trilha de NOPs.
- O código de shell.
Falta apenas uma etapa para obter um shell.
Alternativas ao JMP ESP
JMP ESP é o redirecionamento clássico, mas não é o único. Se outro registrador apontar para o seu buffer, você poderá usar jmp eax, call esp ou um gadget push esp; ret.
O princípio é o mesmo: encontrar uma instrução estável que transfira o controle para onde o seu código de shell está localizado.
Verificação rápida
Lembre-se de por que JMP ESP é preferível a um endereço de pilha codificado.
Recapitulação
Agora você controla o fluxo de execução:
- Sobrescreva o EIP com o endereço de um gadget JMP ESP, em vez de usar um endereço de pilha frágil.
- Encontre o gadget em um módulo sem ASLR, evitando caracteres inválidos como
0x00. - Escreva o endereço em formato little-endian e adicione uma trilha de NOPs antes do código de shell.
Em seguida, você gerará o código de shell e obterá um shell.
Perguntas Frequentes
A aula “Controle do EIP” é grátis?
Sim — o texto completo de “Controle do EIP” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ethical Hacking Academy, atualize para CoddyKit PRO. O curso de Ethical Hacking Academy inclui 4 aulas no total.
O que vou aprender em “Controle do EIP”?
Substitua o endereço de retorno Você pratica Ethical Hacking Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Ethical Hacking Academy?
Nenhuma experiência prévia é necessária. Ethical Hacking Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Controle do EIP”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Ethical Hacking Academy?
Sim. Cada aula de Ethical Hacking Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.