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...

Oficina

kiTo KGNmeAGAiN (C-1)

Seg

28

Ago

2006


10:20

(7 votos, média 5.00 de 5) 


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

vovo

mfx broker как вывести средстваКупить веерную кистьалександр лобановский супермаркет классcpm системаdoctor2.ru новости харьков кернесfbconsult отзывы

Informações adicionais