Messagem oculta - Engenharia Reversa

Bom pessoal esse e meu primeiro post sobre engenharia reversa. se você esta aprendendo (assim como eu ) então veio no lugar certo. vamos fazer analise de um programa feito em assembly usando o Ollydbg.

O que e DEBUG? Depuração (em inglês: debugging, debug) é o processo de encontrar e reduzir defeitos num aplicativo de software ou mesmo em hardware.

O que e Ollydbg? Esse sera o programa que nos usaremos para debugar nosso programinha, um debug de programa nos permite ver um código que e mas fácil de se entender, por se mas parecido com a linguagem Humana, melhor de que vermos um monte de 0s e 1s.


Bom então mãos na massa, ou quero dizer mãos no teclado e mouse.Vamos abri o ollydbg. Ao abrir você vera uma tela semelhante a essa.


Agora vamos abrir no programa  Cyber.exe  no nosso ollydbg para analisar seu código e descobrir onde esta a mensagem secreta.. Vá em "File->Open" e selecione "Cyber.exe".

figura

Agora podemos ver muitas linhas de código. parece ser muito complicado de se entender, mas não  e bem assim, você precisa saber o que cada linha faz, a parti dai você saberá  o que o programa faz. para isso voce vei aqui para aprender certo? então vamos la.

         Offset              mnemonicos
1    00401000 >/$  SUB EAX,EAX #retorna 0
2    00401002 |.      CMP EAX,0 #compara se EAX e igual a 0
3    00401005 |.      JE SHORT Cyber.00401015 #Pula para o endereço(offset) 00401015 se for zero
4    00401007 |.      LEA EAX,DWORD PTR DS:[40302F] #Pega o valor [40302F] e coloca em EAX
5    0040100D |.     LEA EBX,DWORD PTR DS:[40302F] #Pega o valor [40302F] e coloca em EBX
6    00401013 |.      JMP SHORT Cyber.00401021 #Pula para o endereço 00401021
7    00401015 |>     LEA EAX,DWORD PTR DS:[403000] #Pega o valor do enderelo Xxxxxx e coloca no Registrador XXX
8    0040101B |.      LEA EBX,DWORD PTR DS:[403009] #Pega o valor do enderelo Xxxxxx e coloca no Registrador XXX
9    00401021 |>     PUSH 0 ; /Style = MB_OK|MB_APPLMODAL #coloca na pilha o valor '0' que o tipo de Estilo
10  00401023 |.      PUSH EAX ; |Title #coloca na pinha EAX, que esta com o TITULO do Programa
11  00401024 |.      PUSH EBX ; |Text #coloca na pinha EBX, que esta com nossa messagem
12  00401025 |.      PUSH 0 ; |hOwner = NULL #coloca na pinha o valor NuLL(nulo)
13  00401027 |.      CALL <JMP.&user32.MessageBoxA> ;  #Agora vai chamar todos os valores da pilha e mostras nessa funçao MessageBoxA
14  0040102C |.     PUSH 0 ; /ExitCode = 0 #coloca na pilha o valor 0
15  0040102E \.     CALL <JMP.&kernel32.ExitProcess> ;  #Chama a funçao de saida do processo(PROGRAMA)
16  00401033         INT3
17  00401034 .-     JMP DWORD PTR DS:[<&kernel32.ExitProcess>; kernel32.ExitProcess
18  0040103A $-   JMP DWORD PTR DS:[<&user32.MessageBoxA>] ; user32.MessageBoxA



EXPLICAÇAO:

1. SUB EAX,EAX   (SUB e igual A Subtrai um valor de dois registradores, entao a linha 'SUB EAX,EAX' esta subtraido
 o valor de EAX com EAX, dessa forma esta também zerando os registradores e RETORNANDO 0).

2. CMP EAX,0     (CMP e igual a comparar, CMP esta comparando se EAX tem o valor '0' dentro de si, e retorna True(verdadeiro) ).

3.JE SHORT Cyber.00401015 (JE e igual se e igual(Jamp igual), Se a comaraçao da linha de cima retorna '0'"True", Pula para o endereço(offset) 00401015).

4. LEA EAX,DWORD PTR DS:[40302F] e LEA EBX,DWORD PTR DS:[40302F] (LEA e igual a Pega. ela vai pegar um valor de um registrador ou de endereço e vai por no registrador XXX).

5 .JMP SHORT Cyber.00401021 (JMP e igual Pulo direto. este linha e igual ao item 3 (JE), vai fazer um pulo pro endereço XXXXXX sem precisa de algum resultado (True),0 ).

6. LEA EAX,DWORD PTR DS:[403000] e LEA EBX,DWORD PTR DS:[403009] e a mesma coisa do item 4. 

7. PUSH 0, PUSH EAX e PUSH EAX (PUSH e igual a Empurrar. Então essas linhas estão empurrando os valores na pinha, que ainda vamos aprender).

8. CALL <JMP.&user32.MessageBoxA> e CALL <JMP.&kernel32.ExitProcess> (CALL e igual Chamar. Essa linhas de comando estao Chamando funçoes.)


COMO RESOLVER: Bom pessoal analise outra vez os código assembly e tente achar a linha onde se faz uma comparação. HUM COMPARAÇÃO! tente mata a charada agora.se na conseguir leia o texto a baixo.


Existem #3 forma de fazer o programa mostrar a mensagem. se alguém souber  outras formas comente e colocaremos com seu nome aqui.
#1 É dar um espaço na linha onde desejamos mundificar (na linha 3 ) e dar um NOP (Not Operation) e pronto, quando o programa chegar nessa parte do código, ele não fara nada porque simplesmente não tem nada só um NOP que não faz nada,OK?
#2 Outra forma e analisar a parte onde estamos quero modificar e entender o que esta fazendo,  para alterar onde se faz a verificação para validar o programa em nosso caso se mudarmo na linha 2 o 0 e colocarmos 1 mudaria tudo. Tente fazer isso. 
#3 Outra forma no nosso programa de mostra nossa mensagem e da um espaço e por no lugar de JE, um JMP e offset 401015 para 401007 que pula para próxima linha simplesmente.


Agora vamos testar?Clique com o botão direito sobre qualquer linha, vá em "Copy To Executable->All Modifications" e em seguida "Copy All". Uma nova janela se abrirá. Clique novamente com o botão direito sobre ela, selecione "Save File" e salve seu arquivo alterado.
Pronto, agora execute o seu arquivo recém salvo e você vai ver que a mensagem secreta era "Parabéns, você o encontrou!".
Espero ter dado o ponta pé inicial para aqueles que não sabiam por onde começar ou não sabiam o significado das instruções básicas do Assembly.

Comentários

Postagens mais visitadas deste blog

Ollydbg em Portugues

Ofuscando Código de Malware e software