Exploração do Structured Exception Handler (SEH), um mecanismo de tratamento de exceções do sistema operacional Windows
Este tutorial faz parte do GUIA COMPLETO do professional em Segurança Ofensiva de Software, saiba mais.
Aula 26: Sobrescrita de SEHs
O Structured Exception Handler (Tratador Estruturado de Exceções) é um mecanismo do Windows para capturar e gerenciar exceções (erros de software).
- Estrutura na Pilha: O SEH é implementado como uma lista ligada de registros. Esses registros são anotados na pilha (Stack), localizados logo abaixo do frame da função onde o código com potencial para lançar exceções reside.
- Conteúdo do Registro: Cada registro SEH na pilha contém dois ponteiros principais:
- O endereço do tratador de exceção (o código a ser executado em caso de exceção).
- O endereço do próximo SEH na lista ligada.
- Funcionamento: Quando uma exceção é lançada, o Despachador de Exceções (código do sistema operacional) percorre essa lista de tratadores, a partir do topo da pilha, até encontrar o primeiro tratador elegível definido por um filtro.
O principal objetivo da técnica é sobrescrever os ponteiros do SEH através de um buffer overflow. Essa abordagem é usada para desviar o fluxo de execução para um código malicioso (shellcode) antes que a proteção do canário seja checada.
- Vantagem sobre o Canary: Em um buffer overflow tradicional, sobrescrever o Canary (localizado entre o buffer e os metadados da função) leva à detecção e ao lançamento de uma exceção de segurança quando a função tenta retornar. O ataque SEH Overwrite força o lançamento de uma exceção antes que a função retorne, evitando a checagem do Canary.
- A Estratégia POP POP RET: Para garantir que o ataque funcione independentemente do layout da pilha (superando a imprevisibilidade de endereços), o exploit não usa um endereço hardcoded para o shellcode. A técnica envolve:
- Sobrescrever o Endereço do Tratador: O atacante preenche o campo do endereço do tratador com o endereço de uma sequência de instruções POP POP RET encontrada em uma biblioteca do sistema.
- Sobrescrever o Próximo SEH: O campo do próximo SEH é sobrescrito com uma instrução de salto curto (JMP SHORT) que aponta para o shellcode injetado na pilha.
- O Desvio:
- O despachador de exceções salta para o endereço POP POP RET.
- O POP POP desempilha 8 bytes, posicionando o topo da pilha (ESP) exatamente sobre o campo do próximo SEH (o JMP SHORT).
- O RET (Return) retira o endereço do topo da pilha e desvia a execução para lá, que agora é a instrução JMP SHORT, saltando assim para o shellcode.
Com o tempo, o sistema operacional Windows implementou proteções para mitigar os ataques SEH Overwrite:
- SafeSEH: Exige que os módulos da aplicação sejam compilados com uma lista de tratadores seguros, validando-os na execução.
- SEHOP (SEH Overwrite Protection): Introduzido a partir do Windows Vista SP1. Adiciona um registro SEH sentinela (sentinel) inalcançável no final da lista. Durante a execução, o SEHOP checa se o último SEH é o sentinela. Se não for, indica que a lista foi corrompida, e a execução é encerrada. Foi contornado em 2009 sob certas condições.
Próxima aula, clique aqui.



