Aprenda a técnica Egg Hunter: como superar limites de espaço em exploits usando buscas na memória para executar shellcodes através de tags específicas
Este tutorial faz parte do GUIA COMPLETO do professional em Segurança Ofensiva de Software, saiba mais.
Aula 27: EGG HUNTER
No cenário de desenvolvimento de exploits, um dos obstáculos mais comuns enfrentados por pesquisadores de segurança é a limitação de espaço para a injeção de payloads. Quando a vulnerabilidade explorada (como um buffer overflow) oferece apenas alguns poucos bytes para a execução de código, torna-se impossível injetar um shellcode completo e funcional, como os gerados pelo Metasploit. Para contornar essa barreira, utiliza-se a técnica conhecida como Egg Hunter.
A técnica recebe esse nome em referência à tradição de "caça aos ovos" de Páscoa, comum nos Estados Unidos. No contexto da exploração, o "ovo" (egg) é uma tag. Essa tag é uma pequena string de 4 bytes, geralmente repetida (totalizando 8 bytes) que o atacante coloca no início do seu shellcode principal.
O Egg Hunter em si é um estágio inicial do payload, extremamente pequeno e otimizado, cuja única função é varrer a memória do processo em busca dessa tag. Assim que a tag é localizada, o Egg Hunter desvia o fluxo de execução para o código que vem logo após ela, permitindo a execução do shellcode completo que estava escondido em outra área da memória.
Existem diversos motivos pelos quais o espaço para exploração pode ser limitado:
- Manipulação da Pilha pela Aplicação: Mesmo que o atacante consiga injetar um código grande, a própria aplicação pode continuar executando e chamar funções que sobrescrevem partes da pilha (stack), corrompendo o shellcode antes que ele seja executado.
- Restrição de Caracteres: Filtros de entrada que barram caracteres específicos podem forçar o payload a crescer demais para evitar esses bytes proibidos, impedindo que ele caiba no espaço disponível.
- Arquitetura da Função: Algumas funções vulneráveis possuem buffers naturalmente pequenos que não comportam um payload de estágio único.
- Injeção do Shellcode (Ovo): O atacante envia o shellcode completo (com a tag identificadora no início) através de qualquer entrada aceita pela aplicação (ex: um pacote de dados anterior ou outra variável). Ele não precisa saber exatamente onde esse código ficará, apenas garantir que ele esteja presente na memória.
- Exploração e Execução do Hunter: O atacante explora a falha enviando o Egg Hunter (o código de busca). Este código varre a memória de forma seletiva para evitar travamentos.
- O Hunter consulta o sistema sobre a acessibilidade de um endereço.
- Se o sistema retornar um erro de acesso, o Hunter pula para a próxima página de memória.
- Se o acesso for permitido, ele compara o conteúdo do endereço com a tag escolhida.
- Ao encontrar a tag, ele salta para o endereço e inicia a execução do payload principal.
![]() |
| Figura 1: Aplicação vulnerável |
Utilizando a aplicação que desenvolvemos um exploit que explora a vulnerabilidade de Buffer Overflow anteriormente, vamos agora construir um exploit que utilize um Egg Hunter (Figura 1).
![]() |
| Figura 2: Gerando Egghunter e TAG |
Primeiramente vamos gerar o código do Egghunter definindo sua tag com o seguinte comando utilizando o Mona no Immunity (Figura 2): !mona egg -t LTAG
![]() |
| Figura 3: Desenvolvimento código |
Reutilizando o código do exploit que desenvolvemos em aulas anteriores, foi adicionado a tag e o código do Egghunter (Figura 3).
![]() |
| Figura 4: Breaking point |
Vamos analisar o crash. No Immunity adicione um breaking point no endereço referente a instrução "JMP ESP" para acompanhar o fluxo do código (Figura 4).
![]() |
| Figura 5: Estado da aplicação após jump esp |
Observa-se que nSEH e SEH foram sobrescritos com “B” (Figura 5). Portanto optarei por colocar o código do EggHunter entre o lixo e a sobrescrita do EIP.
![]() |
| Figura 6: Jump -50 bytes |
Portanto será feito um jump back de 50 bytes (Figura 6).
![]() |
| Figura 7: Código final do exploit |
| Junk … | EggHunter | … Junk | EIP | JumpBack 50 | Egg | Shellcode |
|------←←←←←←←------|
Entre o início do lixo (junk) e a sobrescrita do EIP são 4116 bytes. Então o Egghunter foi adicionado a -50 bytes da sobrescrita do EIP e os bytes restante até a sobrescrita foram preenchidos com lixo. Após a sobrescrita do EIP foi adicionado a instrução que realiza um jump back de 50 bytes, em seguida adicionado nossa TAG (egg) e por fim o shellcode, um payload do tipo messagebox para Windows (Figura 7).
![]() |
| Figura 8: Breakpoint instrução “jmp esp” |
![]() |
| Figura 9: Jump back 50 bytes |
![]() |
| Figura 10: Egghunter |
![]() |
| Figura 12: Preparar arquivo para comparar shellcode |
![]() |
| Figura 13: Verificado integridade do shellcode |














