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) 


Construindo o exploit

Agora que temos o controle da máquina, está na hora de botar a mão na massa. Acontece que há uma limitação no tamanho do código. Você vai notar que, após cerca de 763 caracteres, somos jogados para um lugar completamente diferente do pretendido. Este é mais um overflow, diferente do primeiro, e a Microsoft vai ter que consertar dois bugs tongue

Vamos ficar apenas com o primeiro overflow. Com os primeiros 256 caracteres varridos do mapa, sobram cerca de 500 bytes para albergar nosso código. Aqui está o que é preciso ser considerado:

  • Comprimento máximo do exploit: 500 bytes.
  • Não conhecemos a versão do sistema operacional.
  • Não sabemos onde estão localizadas funções que podem ser úteis.

A coisa está complicada, mas vamos analisá-la sob um ponto de vista de não-exploit. Um pequeno executável, compilado para Windows, roda tanto no Win95 quanto no WinNT. Quando um processo de saída (ExitProcess) é chamado, dependendo do sistema operacional, esta função está em lugares diferentes na KERNEL32.DLL. Como achá-la? Existe uma função na API do Windows, chamada "GetProcAddress", que serve para determinar a localização de funções. Fornecendo o nome e o manipulador (handle) de uma função, ela retorna o endereço de memória da mesma. Meio caminho andado, mas... qual é o endereço da GetProcAddress? Não temos outra saída a não ser chamá-la para descobrir. E como isto é feito? Através das tabelas de importação.

Tabelas de importação são estruturas do formato PE (o formato dos executáveis) que especificam o endereço de certas funções. Você pode usar o DUMPBIN (ou programas semelhantes) para obter estas tabelas. Tanto as DLLs quanto os EXEs possuem tabelas de importação. Como estamos lidando com apenas uma versão da MSCONF.DLL e sabemos que ela está na memória então, se GetProcAddress estiver na sua tabela de importação, o endereço da GetProcAddress será colocado pelo sistema operacional num determinado local do espaço de tabela da MSCONFIG.DLL.

Então, é só fazer um dump:

     Microsoft (R) COFF Binary File Dumper Version 5.10.7303
     Copyright (C) Microsoft Corp 1992-1997. All rights reserved.


     Dump of file msconf.dll

     File Type: DLL

       Section contains the following imports:

         KERNEL32.dll

                      23F   Sleep
                      183   IsBadReadPtr
                      17E   InterlockedIncrement
                      .
                      .
                      .
                       1E   CompareStringA
                       98   FreeLibrary
                      116   GetProcAddress
                      190   LoadLibraryA
                       4C   DeleteCriticalSection
                       51   DisableThreadLibraryCalls
                      .
                      .
                      .

É isso aí! GetProcAddress e LoadLibraryA! A LoadLibrary pode ser usada para obter os manipuladores (handles) das DLLs carregadas e para carregar DLLs que não foram carregadas. Sua tarefa básica é retornar o endereço base de DLLs. Isto é importante porque o endereço base da KERNEL32.DLL é diferente no Win95 e no NT.

Informações adicionais