Engenharia Reversa #2 — Introdução ao Olly Debug

Leonardo Marciano
9 min readJul 3, 2017

--

Você por aqui? já leu nossa primeira parte né? caso não clique aqui

Já que você esta com vontade de aprender a engenharia reversa, te dou o seguinte desafio: altere o titulo de seu editor de textos, particularmente recomendo o Atom por já ser “hackeavel” más vamos lá, caso tenha alguma duvida me envie por e-mail: marciano@programmer.net!

continuando nossa serie de engenharia reversa:

O que é Olly Debugger?

Do autor, Oleh Yuschuk, “OllyDbg é um analisador de nível de montagem de 32 bits para o Microsoft® Windows®. A ênfase na análise do código binário torna particularmente útil nos casos em que a fonte esta indisponível. “Olly também é um depurador” dinâmico “, o que significa que ele permite que o usuário mude algumas coisas como programa está executando”. Isso é muito importante ao experimentar um binário, tentando descobrir como funciona. Olly tem muitos, muitos recursos excelentes, e é por isso que é provavelmente o depurador nº1 usado para engenharia reversa (pelo menos no ring3, mas chegaremos a isso mais tarde).

Overview

Ter um visualizador é essencial para praticar engenharia reversa, más elas não são nada amigáveis, para você entender como funciona iremos fazer aqui um mega overview para você entender por completo essa incrível ferramenta que é a Olly

Caso você ainda não tenha feito download: OllyDgb Official Website

Olly abre com a janela padrão, caso a sua esteja diferente feche a janela e de um click no icone ‘C’, lembre-se de abrir algum .exe para aparecer as informações haha
Ele é dividido em 4 campos principais; Desmontagem(Dissasembly),
Registros(Register/Registers), pilha(Stack) e despejo(dump). Aqui está uma descrição de cada seção :)

1. Disassembly

Esta janela contém a principal desmontagem do código para o binário. É aqui que Olly exibe Informações do binário, incluindo os opcodes e o idioma de montagem traduzido. A primeira coluna é a endereço (na memória) das instruções. A segunda coluna é o que é chamado de opcodes — em linguagem assembly, cada instrução tem pelo menos um código associado a ele (muitos têm múltiplos). Este é o código
Que a CPU realmente quer e o único código que pode ler. Esses códigos opcionais compõem o “idioma da máquina”, o idioma do computador. Se você visse os dados brutos em um binário (usando um editor hexadecimal), você veria uma série dessas opcodes, e nada mais. Um dos principais trabalhos de Olly é “desmontar” essa máquina para o idioma ’em linguagem assembly mais legível para humanos. A terceira coluna é essa linguagem de montagem.
Concedido, a alguém que não conhece a assembly, não parece muito melhor do que os opcodes, mas como você sempre esta a estudar, acaba entendendo mais sobre a montagem e acaba entendendo mais informações sobre o que o código está fazendo.

Dissasembly

A última coluna é o comentário do Olly sobre essa linha de código. Às vezes, isso contém os nomes de chamadas de API (se Olly conseguiu descobri-las), como CreateWindow e GetDlgItemX. Olly também tenta nos ajudar a entender o código nomeando quaisquer chamadas que não fazem parte da API com nomes úteis, no caso desta imagem, “I/O Command” e “Superflous prefix”. Concedido, isso não é útil, mas Olly também nos permite transformá-los em nomes mais significativos. Você também pode colocar seus próprios comentários neste coluna; Basta clicar duas vezes na linha desta coluna e aparecer uma caixa, permitindo que você insira seu comentário.
Estes comentários serão guardados para a próxima vez automaticamente

2. Registers:

Cada CPU possui nela uma coleção de registros. Estes são nomeados como temporários(ou temps), bem como uma variável em qualquer linguagem de programação de alto nível. Aqui está uma visão mais detalhada (e rotulada) dos registros:

Não são apenas números aleatórios, são logs!

Na parte superior é o Registro de CPU atual. Os registros mudarão de cor se eles foram alterados de preto a vermelho (torna muito fácil assistir a mudanças). Você também pode clicar duas vezes em qualquer um dos registros para mudar seus conteúdos. Esses registros são usados para muitas coisas, e teremos muito a dizer sobre mais tarde

A seção do meio são bandeiras, usadas pela CPU para marcar o código que algo aconteceu (dois números são iguais, um número é maior do que outro, etc.). Clique duas vezes em uma das bandeiras, ira ver mais a fundo sobre ela!
Estes também desempenharão um papel importante na nossa jornada.

A seção inferior é o FPU ou os registros da Unidade de Ponto Flutuante. Estes são usados sempre que a CPU executa qualquer aritmética envolvendo pontos decimais. Estes raramente são usados por inversores, principalmente quando chegamos em criptografia.

3. The Stack

A pilha(ou Stack) é uma seção de memória reservada para o binário como uma lista de dados “temporária”. Esses dados incluem ponteiros para endereços na memória, strings, marcadores e, o mais importante, retornam endereços para o código para retornar ao chamar uma função. Quando um método em um programa chama outro método, o controle precisa ser deslocado para este novo método para que ele possa retomar. A CPU deve acompanhar a localização desse novo método.
Chamado de modo que quando este novo método for feito, a CPU pode retornar para onde foi chamado e continuar executando o código após a chamada. O Stack é onde a CPU irá segurar este endereço de retorno.

Uma coisa a saber sobre o stack é que é uma estrutura de dados “First In, Last Out”. A metáfora normalmente usada é uma dessas pilhas de pratos em uma lanchonete que é carregada de mola. Quando você empurra um prato para na parte superior, todas as placas embaixo são empurradas para baixo. Quando você remove (‘pop’) um prato fora do topo, todas as placas que estavam embaixo elevavam um nível. Veremos isso em ação no próximo tutorial, então não se preocupe se é um pouco nebuloso.

Nesta imagem, a primeira coluna é o endereço de cada membro de dados, a segunda coluna é o hex, 32-bit representação dos dados, e a última coluna é o comentário de Olly sobre esse item de dados, se pode enquadrá-los fora. Se você notar a primeira linha, você verá um comentário “RETURN to kernel …”. Este é um endereço que a CPU colocou na pilha quando a função atual é feita, de modo que ele saiba para onde retornar.

No Olly, você pode clicar com o botão direito na pilha e escolher ‘modificar’ para alterar o conteúdo.

4. The Dump(Dump, não Trump!)

vários nadas?

No início deste tutorial, quando conversamos sobre os “opcodes” em bruto que a CPU lê dentro de um binário, eu mencionei que você poderia ver esses dados brutos em um visualizador hexadecimal. Bem, em Olly, você não precisa. O dump é um visualizador hexadecimal embutido que permite ver os dados binários em bruto, apenas na memória ao invés de ativar
disco. Normalmente, ele mostra duas visualizações dos mesmos dados; Hexadecimal e ASCII. Estes são representados por duas colunas da direita na imagem anterior (a primeira coluna é o endereço na memória que os dados
Reside.)

Olly permite que essas representações de dados sejam alteradas, e veremos isso mais tarde nos tutoriais

Toolbar(ou toolbox)

Infelizmente, a barra de ferramentas do Olly deixa um pouco a desejar (especialmente porque o inglês não é a primeira língua do autor) Eu rotinei os ícones da barra de ferramentas da mão esquerda para ajudar:

Estes são os seus principais controles para executar código. Tenha em mente que, especialmente quando você começa a usar Olly, todos esses botões também estão acessíveis a partir do menu suspenso “Debug”, então, se você não sabe o que é algo, consegue olhar para lá.

Vou fazer algumas observações sobre alguns dos ícones. “Re-load” é basicamente para reiniciar o aplicativo e pausá-lo no ponto de entrada. Todos os patches (ver mais tarde) serão removidos, alguns pontos de interrupção serão desativados, e o aplicativo ainda não terá executado nenhum código, bem, a maior parte do tempo de qualquer maneira. “Run” e “Pause” fazem exatamente isso.

“Step In” significa executar uma linha de código e depois pausar novamente, chamar uma chamada de função se houver uma.

“Step Over” faz o mesmo, mas salta por uma chamada para outra função. “Animate” é exatamente como Step In and Over, exceto que ele faz o suficiente para que você possa assistir. Você não vai usar isso, mas às vezes
é divertido assistir código executar, especialmente se for um binário polimórfico e você pode assistir a mudança de código.

Em seguida, os ícones das janelas (ainda mais crípticos) são:

Pense na função em inglês, será a primeira letra!

Cada um desses ícones abre uma janela, algumas das quais você usará com freqüência, algumas raras. Vendo como são letras intuitivas, você também pode fazer como eu fiz e apenas começar a clicar nelas até encontrar o que
você quer. Cada um deles também está acessível no menu “Visualizar”.

1. (M)emory

A janela de memória exibe todos os blocos de memória que o programa alocou. Inclui as seções principais do aplicativo em execução (neste caso, os itens “Showstr” na coluna Proprietário. Você também pode ver muitas outras seções abaixo da lista, estas são as DLLs que o programa carregou na memória e planeja sobre Usando. Se você clicar duas vezes em qualquer uma dessas linhas, uma janela será aberta mostrando uma desmontagem (ou despejo hexadecimal) dessa seção. Esta janela também mostra o tipo de bloco, os direitos de acesso, o tamanho eo endereço de memória onde o A seção está carregada.

2. (/)Patches

Esta janela exibe todos os “patches” que você fez, ou seja. Qualquer alteração no código original. Observe que o estado é definido como ativo; Se você carregar novamente o aplicativo (clicando no ícone de recarregamento), esses patches se tornarão desativados. Para reativá-los (ou desativá-los) basta clicar no patch desejado e apertar a barra de espaço. Isso liga / desliga o patch. Observe também que nas colunas “Velho” e “Novo” mostra as instruções originais, bem como as instruções alteradas.

3. (B)reakpoints

Esta janela mostra onde todos os pontos de interrupção atuais estão configurados. Esta janela será sua melhor amiga haha

3. (K)all Stack

(Meeh, eu me pergunto por que os iniciantes têm dificuldade em se lembrar desses ícones …)

Esta janela é diferente da “Pilha(ou Stack)” ver mais cedo. Mostra muito mais informações sobre as chamadas que estão sendo feitas no código, os valores enviados para essas funções e muito mais. Veremos mais isso em breve.

The Context Menu

Para o último item deste tutorial, queria apresentá-lo rapidamente no menu do botão direito do mouse no Olly onde muita ação acontece, então você deve, pelo menos, estar familiarizado com isso. Clicando com o botão direito em qualquer lugar na seção de desmontagem lhe resulta em:

Eu só examinarei os itens mais populares agora. À medida que você ganha experiência, você acabará usando alguns das opções menos usadas.
“Binary” permite a edição dos dados binários em um nível byte by byte. É aqui que você pode mudar uma cadeia “Não registada” enterrada num binário para “Registrado”. “Ponto de interrupção” permite que você defina um ponto de interrupção. Existem vários tipos de pontos de interrupção e os iremos no próximo tutorial. “Search For” é um Sub-menu bastante grande, e é onde você pesquisa o binário para dados, como cordas, chamadas de função etc.
A “Analyse” obriga Olly a reanalisar a seção de código que você está visualizando atualmente. Às vezes, Olly recebe confundido se você está observando código ou dados (lembre-se, eles são apenas números), então isso força Olly para considerar onde você está no código e tentar adivinhar o que esta seção deve se parecer.

Observe também que o meu menu ficará diferente do seu, pois tenho alguns plugins instalados e eles adicionam algumas funcionalidades. Não se preocupe, iremos passar por tudo isso nos futuros tutos…

Você já viu o meu post anterior? não?!?! corre lá! é só clicar aqui

Te vejo na próxima!

Leonardo Marciano

CEO at evStarts, evSecurity

fb.com/LeonardoSummitz | marciano@programmer.net

Creditos:

Leonardo Marciano

Tuts4

R4nd0m

--

--

Leonardo Marciano

Nós sempre nos definimos pela capacidade de superar o impossível. Steemit: @lstark