
Estouro de buffer clássico baseado em pilha no Savant Web Server 3.1 demonstrando corrupção remota de memória do início dos anos 2000 através de uma requisição HTTP maliciosa.
Clássico buffer overflow baseado em pilha no Savant Web Server 3.1 demonstrando uma corrupção de memória remota do início dos anos 2000 através de uma requisição HTTP maliciosa (uma vulnerabilidade de 2002 que exige mais de um iniciante do que a maioria dos CVEs de buffer overflow de 2025).
Este repositório faz parte do material que utilizo ao ensinar exploração de corrupção de memória (além do meu trabalho regular, também leciono em diferentes cursos de cibersegurança onde ajudo a treinar a próxima geração de engenheiros reversos). Quando abordo buffer overflows baseados em pilha em sala de aula, trabalho com casos reais em vez de exemplos de brinquedo, e este CVE é um ao qual retorno especificamente quando quero desafiar alunos que já têm alguma experiência com sobrescritas básicas de EIP.
A razão é que o ano em um identificador CVE não diz nada sobre o quão difícil é a exploração. A maioria dos alunos assume que CVEs mais antigos devem ser mais simples — um overflow direto, um JMP ESP, pronto. Este prova o contrário. Alguns CVEs que ensino de 2025 são fundamentalmente mais básicos do que este, porque a classe de vulnerabilidade é mais simples ou as restrições são menores. CVE-2002-1120 exige a compreensão de coisas que alguns exploits modernos não demandam: por que certos opcodes não podem ser usados em certas partes da requisição, como construir um salto condicional que sempre dispare quando o incondicional está bloqueado, como entregar shellcode quando ele não cabe onde você normalmente o colocaria, e como um egghunter resolve um problema de espaço que, de outra forma, tornaria o exploit impossível.
É o CVE que atribuo quando quero ver se alguém realmente entende o que está fazendo.
Esta vulnerabilidade afeta o Savant 3.1, um servidor HTTP gratuito para Windows de 2002. O que a torna digna de estudo em 2025 não é a idade, mas a combinação de restrições que ela introduz e as técnicas necessárias para contorná-las:
Cada uma dessas restrições é uma lição por si só.
Savant é um servidor HTTP gratuito e de código aberto para Windows, originalmente projetado para transformar qualquer computador desktop em um servidor web. Ele escuta na porta TCP 80 e processa requisições HTTP GET padrão. O overflow ocorre no manipulador que copia o caminho da URI para um buffer de pilha de tamanho fixo sem validar seu comprimento.
Detalhes técnicos principais:
O Savant processa requisições HTTP GET recebidas e copia o caminho da URI para um buffer de pilha de tamanho fixo sem verificar seu comprimento. Uma versão simplificada da lógica vulnerável se parece com isso:
char uri_buffer[270];
strcpy(uri_buffer, uri_path);
Enviar uma requisição GET com uma URI de aproximadamente 271 bytes sobrescreve o endereço de retorno salvo na pilha. O overflow é restrito — enviar significativamente mais do que isso causa a falha de uma forma que EIP não é mais controlado, então a janela utilizável é estreita.
A exploração é mais complexa do que uma sobrescrita padrão de EIP devido a duas propriedades adicionais do servidor: o campo do método HTTP também é copiado para a memória e executado, e o corpo da requisição HTTP é armazenado em uma região de heap separada, em vez da pilha (ambas as propriedades se tornam partes essenciais da cadeia de exploração).
A falha pode ser reproduzida enviando uma requisição GET com uma URI suficientemente longa. Nenhuma autenticação é necessária. Exemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 271
request = (
b"GET /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
Quando executado sob um depurador, a falha mostra o EIP sobrescrito com dados controlados pelo usuário:
EIP = 41414141
confirmando que o endereço de retorno salvo foi corrompido pelo overflow.
O objetivo deste repositório não é apenas demonstrar a falha, mas percorrer todo o processo de exploração passo a passo, incluindo cada restrição que torna este caso mais difícil do que uma sobrescrita padrão de EIP e cada decisão tomada para contorná-las.
Para manter o README principal limpo, as notas detalhadas de exploração, scripts e etapas do depurador estão colocadas dentro da pasta Vulnerabilidade 📂 deste repositório.
Lá você encontrará o fluxo de trabalho completo usado para explorar este CVE, incluindo: