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.
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
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.
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
Postar um comentário