A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Segurança

Buffer overflow no Windows

Sab

5

Nov

2005


23:55

(2 votos, média 5.00 de 5) 


Como detectar um buffer overflow

Mensagem de erro
Fig. 1 - Mensagem de erro com jeitão de buffer overflow

Se você receber um simpático aviso como o mostrado na Fig.1, então você provavelmente esbarrou num tipo qualquer de buffer overflow. A mensagem parece um tanto vaga mas, se você observar alguns valores mais de perto... bingo!

Esta mensagem foi obtida alimentando o campo 'endereço' do atalho da 'discagem rápida' do 'Microsoft Netmeeting' com uma string composta por bytes 0x80. A mensagem de erro que apareceu logo a seguir mostra que EIP contém 0x80808080. Adivinhe o que isto significa? Nada mais, nada menos do que um overflow de pilha! E com um overflow destes na mão, é a coisa mais fácil fabricar uma string que contenha código malicioso e dar uma ajeitada em quatro destes bytes 0x80 para que apontem para esta string.

É bom esclarecer que uma mensagem de erro deste tipo não necessariamente indica a presença de um buffer overflow e que alguns buffer overflows são mais fáceis de serem explorados do que outros. Além disso, apesar dos heap overflows também poderem ser explorados, este texto vai tratar apenas dos stack overflows.

Como usar um buffer overflow

Quando se encontra um buffer overflow, a primeira coisa é decidir como usá-lo e quais são as ferramentas disponíveis. No caso do NetMeeting, para criar uma situação de buffer overflow, é preciso criar um arquivo com a extensão '.cnf'. Este é um arquivo criado pelo NetMeeting quando se salva um atalho de discagem rápida (SpeedDial) no HD. Arquivos CNF costumam estar em páginas da web e em emails para que as pessoas possam fazer contato.

Caso alguém queira explorar este overflow, basta iniciar o NetMeeting, procurar uma porção de usuários no servidor ILS e enviar-lhes emails com um arquivo CNF anexado. Os emails notoriamente mais chamativos são os que falam de sexo, oferecem fotos eróticas, avisam que há um prêmio à espera da pessoa e outras coisas do gênero. Além de enviar emails para usuários desavisados (ou muito curiosos smile ), também é possível fazer uma falsa conexão com um servidor ILS, criar uma conta também falsa e fornecer um endereço que, na verdade, é um exploit. Assim que algum usuário clicar no nome deste falso usuário, ele cai na armadilha.

A ferramenta disponível para explorar esta falha de segurança chama-se RUNDLL32.EXE, que é onde ocorre o overflow. Este arquivo tem tamanhos diferentes no Windows 95 e no NT, por isso é bem provável que as tabelas de importação também sejam diferentes (basta verificar com um editor hexadecimal).

Quando ocorre a falha, mesmo fechando a janela da mensagem de erro, o NetMeeting não é fechado. Isto significa que RUNDLL32 estava rodando num espaço próprio, separado do espaço de execução do NetMeeting. Isto tem duas implicações, uma boa e uma ruim. A parte boa da história é que não será preciso analisar um monte de código e que, seja lá o que for feito, não lenvantará muitas suspeitas pelo simples fato de que o processo do NetMeeting não foi encerrado. A parte ruim é que a RUNDLL32 não é carregada da mesma forma que outras DLLs ou recursos externos. Isto nos obriga a carregá-la por conta própria.

Olhando a coisa mais de perto, verifica-se que há mais alguns inconvenientes. Um executável como o RUNDLL32 tem o endereço base 0x00400000. Isto significa que praticamente todas as referências à pilha precisam ter, no mínimo, um caracter NULL. Isto é complicado porque quase sempre as operações com strings em C causam este tipo de overflow quando as strings contêm caracteres NULL. Portanto, se escrevermos o código com caracteres null, a string do exploit tem grande chance de ser estragada - ela será truncada quando for manipulada. Além do NULL, outros caracteres complicados são avanço de linha (line feed), retorno de carro (carriage return), alguns códigos de controle e, em alguns casos extremos, até letras maiúsculas ou minúsculas ou caracteres cujos valores ASCII sejam maiores ou iguais a 0x80 (um dos piores casos!). Para contornar estes problemas vamos precisar usar alguns expedientes.

Informações adicionais