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) 


Nível intermediário Um buffer overflow ocorre toda vez que determinado número de bits exceder o espaço de armazenamento que lhes foi reservado. Para os iniciantes, o texto "Buffer overflow" na seção Queijo Suíço da Informática da Aldeia é mais adequado. Para os iniciados, principalmente os programadores, este texto pode ser útil para evitar deixar brechas que permitam exploits.

Considerações iniciais

Um clássico do buffer overflow é o paper do DilDog, publicado em maio de 1998 no site do Cult of the Dead Cow, pessoal que ficou famoso com lançamento do trojan BackOrifice. A base para este texto foi este paper. O exploit usado como exemplo é praticamente inofensivo porque é encontrado no ultrapassado NetMeeting 2.1 e o overflow só acontece no Windows 95 e no antigo NT. Mas só o exemplo é descartável, o princípio e os métodos de exploração não!

Para acompanhar este texto é preciso que você conheça a arquitetura Intel e tenha uma base bastante sólida de Assembly.

Noções fundamentais

Analise o seguinte trecho de código escrito em C:

     void func(void)
     {
         int i;
         char buffer[256];   

         for(i=0; i < 512; i++)                 
             buffer[i]='A';

         return;
     }

Mesmo se você não costuma usar a linguagem C (mas tem alguma experiência de programação), é fácil perceber que o código acima têm sérios problemas. Se o buffer possui 256 posições, como é que o loop for, que vem logo a seguir, vai colocar 512 caracteres A neste buffer? A resposta é: não vai! Os primeiros 256 caracteres A preenchem o buffer e, os 256 restantes, vão parar em algum outro lugar.

O lugar para onde vão os 256 As excedentes depende do sistema operacional e da linguagem de programação mas, se não houver uma checagem automática de limites como existe na Java, garanto que os As que sobram vão causar estrago em alguma área da memória!

Logo depois da instrução que inicializou o buffer, a pilha (stack) de 32 bits de um sistema operacional como o Windows 9x/NT correndo numa plataforma Intel tem a seguinte estrutura:

     STACK
             -------------------
             Variáveis Locais
     ESP->   i
             Buffer
             -------------------
     EBP->   Valor antigo de EBP
             -------------------
             Endereço de Retorno
             -------------------

Quando o procedimento "func" retorna, ele move EBP de volta para ESP e tira o endereço de retorno da pilha com um POP. Acontece que, depois que a linha de código marcada em vermelho é executada 256 vezes, ela extrapola o tamanho do buffer (taí o overflow) e os As seguintes são escritos por cima do valor antigo de EBP. Pior do que isto, também são escritos por cima do endereço de retorno e a alteração deste endereço afeta seriamente o fluxo do programa.

Agora imagine agora que isto tenha sido proposital. Ao invés de usar caracteres A, o endereço de retorno pode ser alterado de modo que aponte para uma localização de memória da sua escolha e o código que você quer que seja executado será alcançado quando chegar a hora deste procedimento fazer o 'return'. Se o buffer for preenchido com bytes de código, você poderá redirecionar o EIP para eles no próximo RET porque a pilha é considerada como memória executável pelo Windows 9x/NT na arquitetura Intel.

Informações adicionais