Oficina
kiTo KGNmeAGAiN (C-1)
Seg 28 Ago 2006 10:20 |
- Detalhes
- Categoria: Pilotando o rato C-1
- Atualização: Quarta, 22 Abril 2009 11:09
- Autor: vovó Vicki
- Acessos: 11875
O hash MD5
:confused: Em alguns passos da execução surgiram algumas dúvidas. Chegou a hora de descobrir do que se trata e dar créditos ao PEiD que nos informou a existência de MD5. Repetindo o trecho do código
... 00401166 |. E8 3D060000 CALL kiToKGNm.004017A8 ; inicializa dwords para o MD5 0040116B |. FF35 A0314000 PUSH DWORD PTR DS:[4031A0] 00401171 |. 68 D4324000 PUSH kiToKGNm.004032D4 00401176 |. E8 6D060000 CALL kiToKGNm.004017E8 0040117B |. E8 C8060000 CALL kiToKGNm.00401848 ; hash MD5 da Base64 do nome + stringona ...
A primeira chamada inicializa dwords para o MD5. Depois é criado o hash MD5 do nome codificado + stringona através da chamada à subrotina localizada em 00401848. Lembra do endereço 004033F0 que eu pedi para anotar? Chegou a hora de usá-lo. Procure este endereço no painel inferior esquerdo do OllyDbg. Um pouco mais acima você pode ver a string que servirá de base para criar o hash.
Reinicie o programa com Ctrl+F2, clique no botão [Register] para parar no breakpoint. Pilote as instruções com F7 / F8 até chegar na chamada para o cálculo do hash. Entre na rotina co cálculo, faça o passo a passo com F7, sempre observando o painel da memória do OllyDbg até que os endereços de 004033F0 a 004033FF estejam preenchidos com valores. Na minha máquina, o resultado foi o seguinte:
004033B0 64 47 56 7A 64 47 55 3D dGVzdGU= 004033B8 4E 54 45 30 4D 44 41 34 NTE0MDA4 004033C0 4D 6A 68 4F 56 45 55 77 MjhOVEUw 004033C8 54 55 52 42 4E 45 3D 3D TURBNE== 004033D0 80 00 00 00 00 00 00 00 €....... 004033D8 00 00 00 00 00 00 00 00 ........ 004033E0 00 00 00 00 00 00 00 00 ........ 004033E8 00 01 00 00 00 00 00 00 ....... 004033F0 46 3D 7A C4 11 DC 27 5B F=zÄÜ'[ 004033F8 21 02 07 2B 4A EE BE 22 !+Jî¾" 00403400 20 00 00 00 20 00 00 00 ... ...
Agora rode o MD5-Checker (ou qualquer outro aplicativo que calcule MD5), coloque na área de texto identificada por String - ASCII o mesmo texto recebido pela rotina analisada (de acordo com este exemplo, dGVzdGU=NTE0MDA4MjhOVEUwTURBNE==), clique no botão [Generate] e anote o resultado obtido (no meu caso foi 463D7AC411DC275B2102072B4AEEBE22). Compare este resultado com o mostrado na memória pelo OllyDbg. É isso aí!
Continuando a linha de execução depois da chamada à rotina do MD5 temos:
... 00401180 |. 33DB XOR EBX,EBX 00401182 |. 0318 ADD EBX,DWORD PTR DS:[EAX] ; o endereço é 004033F0 00401184 |. 0358 04 ADD EBX,DWORD PTR DS:[EAX+4] ; o endereço é 004033F4 00401187 |. 0358 08 ADD EBX,DWORD PTR DS:[EAX+8] ; o endereço é 004033F8 0040118A |. 0358 0C ADD EBX,DWORD PTR DS:[EAX+C] ; o endereço é 004033FF 0040118D |. 53 PUSH EBX ; /<%X> 0040118E |. 68 00304000 PUSH kiToKGNm.00403000 ; |Format = "%X" 00401193 |. 68 38334000 PUSH kiToKGNm.00403338 ; |s = kiToKGNm.00403338 00401198 |. E8 5D080000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA 0040119D |. 83C4 0C ADD ESP,0C 004011A0 |. C605 3C334000 >MOV BYTE PTR DS:[40333C],2D ...
O que ocorre é que o registrador EBX é zerado, soma-se a ele o valor do dword em 004033F0, ou seja, EBX = C4 7A 3D 46 (não se esqueça de que é um valor hexadecimal). Observe que os bytes são colocados no registrador na ordem inversa em que aparecem na memória.
Na instrução seguinte o próximo dword é adicionado, ou seja EBX = C47A3D46 + 5B27DC11 = 01 1FA21957. Note que o número de bytes ficou muito grande para caber no registrador, por isso a sobra 01 não entra e EBX mostra 1FA21957.A próxima soma é EBX = 1FA21957 + 2B070221 = 4AA91B78 e a última é EBX = 4AA91B78 + 22BEEE4A = 6D6809C2.
Este resultado é transformado numa string e o quinto caracter é substituído por "-" resultando em 6D68-9C2, a senha para o nome "teste" no meu sistema.
Finalmentes
É isto aí, pessoal. Espero que este artigo tenha mostrado como usar a engenharia reversa para recuperar a lógica e os dados de um executável cujo código fonte desconhecemos ou perdemos. A todos um grande abraço e até a próxima
- << Anterior
- Próximo