Desmontando um programa usando o OllyDBG

Postagem de conteúdo sobre engenharia reversa e cracking
Post Reply
User avatar
Victor
Membro
Membro
Posts: 6
Joined: Thu Jan 04, 2018 1:35 am

Desmontando um programa usando o OllyDBG

Post by Victor » Fri Jan 05, 2018 8:53 am

Olá membros do fórum, afim de contribuir com o conteúdo do grupo e desenvolver minha escrita e envolvimento, resolvi criar este tópico que irá abordar os passos básicos para fazer engenharia reversa em um executável usando o OllyDBG.

Primeiramente você deve ter em mãos o OllyDBG, caso não o tenha, ele está disponível aqui:http://www.ollydbg.de/odbg110.zip

Além disso irei usar um programa executável criado por mim, caso desejar acompanhar o tutorial passo-a-passo é só baixa-lo: http://www.fast-files.com/getfile.aspx?file=152282

Então vamos lá:

Introduzindo aos leitores o que é engenharia, a engenharia reversa nada mais é do que desmontar algo e tentar analisá-lo e entender sua essência, por exemplo, quando eramos crianças havia muito aqueles brinquedos de LEGO que montávamos casas, carros, bonecos e até onde a imaginação conseguia. Como analogia aos brinquedos de LEGO e a programas de computadores, a abstração é a seguinte o que fazíamos quando tinha alguma peça em LEGO já montada?

Resposta: Desmontávamos para entender como foi montada a peça.

Então é basicamente disso que à grosso modo a engenharia reversa trata...

Continuando o raciocínio, programas de computadores desenvolvidos em linguagens de alto nível são passadas para uma linguagem de baixo nível, nos casos das interpretadas para um bytecode e no caso das compiladas para linguagem de máquina. A grande questão é que quando trabalhamos com linguagens compiladas, nós transformamos todo aquele código fonte em código objeto que é o código no qual a máquina entende, que são as instruções para o processador executar, como por exemplo o código abaixo escrito em C:

Code: Select all

#include <stdio.h>

int main(void){

    printf("Ola mundo!");
    return 0;

}
E aqui é como seu programa é executado no processador. :D

Code: Select all

.LC0:
  .string "Ola mundo!"
main:
  push rbp
  mov rbp, rsp
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  pop rbp
  ret
Agora que você entende a mágica do compilador de transformar tudo para instruções de máquinas, surge um problema, e se você quiser fazer o caminho inverso? Obter o código-fonte de volta? Ai é que surge o problema, montar o programa é simples agora desmontar para o código original é complicado pela quantidade de possibilidades que um programa teria para reobter o código-fonte, com isso surgiu os descompiladores que são softwares que transformar o código objeto ou executável em Assembly que é mais compreensível a humanos.

Prosseguindo, a partir disso irei demonstrar de forma simples como é feita a descompilação de um programa em formato .exe utilizando o OllyDBG

1- Esqueleto do OllyDBG, uma visão geral sobre o software.
forumpt1.PNG

1.1- Secção das instruções
forumpt2.PNG
Neste local é encontrada os endereços virtuais das instruções, o código das instruções em hexadecimal, as instruções em seus mnemonicos e por último uma análise das instruções com APIs standards(Ex: chamadas de funções tipo printf, scanf, MessageBox, DialogBox e etc), além disso na parte inferior desta secção tem um resumo do que acontece quando o IP(Ponteiro de Instruções) está apontando em uma instrução; isso ajuda bastante a análisar o comportamento do programa.

1.2- Secção dos Registradores da CPU
forumpt3.PNG
Aqui é onde contém os registradores da CPU(Acumulador, Contador, Flags, ponteiros e etc), a cada instrução executada alguns registradores são alterados, como por exemplo operações de comparações que afetam os flags.
You do not have the required permissions to view the files attached to this post.

User avatar
Victor
Membro
Membro
Posts: 6
Joined: Thu Jan 04, 2018 1:35 am

Re: Desmontando um programa usando o OllyDBG

Post by Victor » Fri Jan 05, 2018 9:13 am

1.3- Secção da memória vista em ASC-II
forumpt4.PNG
Essa secção mostra valores na memoria em ASC-II que nos ajuda a entender como o nosso programa está alterando a memória.

1.4- Secção do Stack ou Pilha
forumpt5.PNG
Essa última secção nos mostra os dados que estão sendo inseridos e removidos do stack, o stack é de fundamental importância para o funcionamento de um programa, então é bom você entender como funciona as chamadas de funções e procedimentos.


Então pessoal, essas são as 4 secções básicas da parte principal do OllyDBG, agora que já estão cientes de +- como é a main do OllyDBG, vamos colocar a mão na massa!

Nosso objetivo é desmontar o programa e tentar entender o que está acontecendo no seu código principal, para podermos obter algo a partir disso...

Começaremos com a execução do programa, para podermos ter uma visão sobre o que ele está solicitando, em casos de suspeita de malware você não deve executa-lo de cara no seu SO, nesses casos é sugerido manipular o programa em um máquina virtual. Então vamos lá.
forumpt6.PNG
O programa é bem simples, ele apenas solicita uma autenticação genérica, uma das maneiras de contornar isso seria fazendo um bruteforce, mas demoraria muito tempo para descobrir a senha e o usuário, por isso apelamos para a engenharia reversa. ;)

Vamos desmontar o código e ver se conseguimos algo dele ou fazer algo com ele rsrs
You do not have the required permissions to view the files attached to this post.

User avatar
Victor
Membro
Membro
Posts: 6
Joined: Thu Jan 04, 2018 1:35 am

Re: Desmontando um programa usando o OllyDBG

Post by Victor » Fri Jan 05, 2018 10:58 am

Para abrir o código no OllyDBG, basta você apertar F3 e setar a path onde se encontra o arquivo, feito isso seu programa será mostrado na tela principal.

Agora o que fazemos é clicar com o botão direito na secção das instruções , ir em view e selecionar o module 'crackexe', para podermos analisar o codigo main.

Agora você apertará F9 e surgirá umas infos referente as funções e procedimentos que eu citei anteriormente
forumpt7.PNG
Agora o que faremos é descer a fim de obter algo a respeito do nosso código, alguma coisa parecida com o que é demonstrado no console.
forumpt8.PNG
Aqui está o código que encontrei a respeito do programa. Normalmente temos 2 jeitos de obter algo, analisando a memoria afim de buscar strings e valores que são manipulados durante a execução do código,e, manipular o fluxo de código para alcançar partes inacessíveis com a execução normal do programa.

Vou fazer um quick resuminho das instruções em asm básicas:
MOV EAX,10h // atribui o valor hexadecmal 10 ao registrador EAX, como se fosse uma variavel EAX = 0x10
ADD EAX,10h // faz a soma de EAX + 10h e atribui o valor a EAX
SUB EAX,10h // mesmo procedimento da soma, mas ao inves de somar subtrai
PUSH EBX // insere o valor contido no registrador EBX ao stack
POP EDX // remove o valor contido no stack e atribui a EDX
CALL proc // chama uma função ou procedimento
JMP label // muda o fluxo do código para um endereço do código especifico
CMP EAX,ECX // compara os 2 registradores e modifica os flags
JNZ label // muda o fluxo do código para um endereço do código especifico, se a zero flag for setada


Prosseguindo,se analisarmos bem o código vemos que bem no inicio temos chamadas a printfs e scanfs, que são as funções que solicitam as entradas do usuário, agora vamo colocar um breakpoint(F2) aonde tem a primeira chamada printf, para irmos acompanhando o desenvolvimento do código passo-a-passo, agora que você setou o breakpoint e só executar o código que ele irá parar bem no seu breakpoint. para executar é so apertar F9.
forumpt9.PNG
Agora para irmos passo-a-passo devemos ir apertando F8, que o código irá executar instrução-a-instrução. Depois que executei passo a passo, meu Instruction pointer parou na linha da chamada da função scanf, a qual modifica o stack colocando os dados que você inseriu nele.

Image
Se você analisar a secção do stack, verá que tem uma linha com o login que você inseriu, é assim que variaveis locais se comportam, elas são endereços do stack, no meu exemplo foi jogado o endereço de memoria da string em ASC-II "Victor" que está na memoria. O mesmo procedimento ocorre nas linhas subsequentes à estas. Agora analisando a parte que contem as chamadas a strcmp, ocorre o seguinte 2 endereços de strings são jogados no stack e na função strcmp ela irá comparar as 2 e verificar se são iguais, se forem ela retorna 0 caso contrario retorna algo diferente de 0, outra observação importante é que os retornos das funções são jogados no registrador acumulador(EAX), então depois que a primeira strcmp é executada o acumulador EAX irá conter o valor de retorno dela.

Image
Observe que EAX contem FFFFFFFF logo a função retornou uma valor diferente de 0, que significa que as strings são distintas. Além disso é interessante notar no stack que estou comparando oque inseri "victor" com "VICTOR", logo isso é um dos nomes de usuarios para poder autenticar de forma adequada, agora oque em seguida a instrução TEST faz é idêntica ao AND, com diferença que ela não modifica o conteudo dos registradores, nesse caso estamos fazendo FFFFFFFF AND FFFFFFFF resultando em FFFFFFFF e consequentemente não disparando a flag Zero que é usada para o jump seguinte. Resumo do que a função faz, ela compara as strings e se forem distintas ela pula para o endereço 4013DD que é quando o nosso programa mostra que a senha é invalida.

Agora com toda essa lógica em mão, uma simples alteração de uma instrução alteraria o fluxo do código para a parte adequada toda vez que você digitar o login errado, a unica coisa que você deve fazer é modificar o primeiro jump.

Code: Select all

JNZ SHORT 004013DD
JZ SHORT 004013DD // SÓ APAGAR O 'N' DO JUMP
agora quando você executar o código ele irá joga-lo para a parte da senha correta, para testar você só precisa reiniciar o programa no OllyDBG, alterar a instrução do JNZ e depois executar o código.

Por enquanto é isso pessoal, depois dou uma continuada no topico e mostro outra maneira de obter acesso ao programa.
You do not have the required permissions to view the files attached to this post.
Last edited by Victor on Mon Jan 15, 2018 6:50 pm, edited 4 times in total.

User avatar
Kodo no Kami
Admin
Admin
Posts: 688
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

Re: Desmontando um programa usando o OllyDBG

Post by Kodo no Kami » Sun Jan 07, 2018 4:07 am

show mano muito bom mesmo mano parabens pelo tuto \o
Image

que desagradavel ~ mirai kuriyama

tinoco
Membro
Membro
Posts: 1
Joined: Thu Dec 07, 2017 8:23 pm

Re: Desmontando um programa usando o OllyDBG

Post by tinoco » Mon Jan 15, 2018 6:18 pm

Show de bola!

Post Reply

Return to “Engenharia Reversa / Cracking”