Caríssimos leitores, o presente tutorial é uma extensão do anterior publicado na secção de “Engenharia Reversa” deste blog, pode ser consultado no seguinte link:
Ganhou o título de extensão porque, em termos de complexidade e similaridade, é bastante próximo ao anterior.
Questão: “Então mas o porquê deste tutorial?“
Neste blog e no mundo da engenharia reversa, é muito comum o uso de dois disassamblers / debuggers de código, nomeadamente o IDA Pro e o Ollydbg.
A principal diferença entre estes dois softwares é o grau de complexidade que um possuí em relação ao outro. O IDA Pro é um software bastante completo, mas apresenta um grau de dificuldade bastante superior ao OllyDbg. Aquando a criação de artigos e tutoriais de engenharia reversa, é dada a preferência ao Olly por ser um software de análise não tão detalhada, mas pelo contrário, mais simplista.
O tutorial anterior foi construído tomando como base o software de debugging OllyDbg. Querendo mostrar aos leitores as potencialidades do IDA Pro, foi idealizado o seguinte tutorial.
Cenário: É disponibilizada uma aplicação (.exe), que é ramificada de duas formas. Se o utilizador ao iniciá-la introduzir a password correta, uma mensagem de sucesso é apresentada, caso contrário, sucessivas mensagens de tratamentos de erros e proteção são mostradas na janela.
-Ferramentas de Trabalho
-Aplicação (crack-me.exe) : Esta é a aplicação de trabalho. É necessário fazer download da respetiva. (O link é disponibilizado no final do artigo.)
-IDA Pro : Esta ferramenta é um debugger que será necessário para interpretar o executável e efetuar alterações no código assembly do mesmo. É uma ferramenta bastante completa de disassembling e debugging.
-Código-fonte da aplicação / executável
Como mencionado no artigo anterior (link), por forma a motivar e deixar claras as instruções assembly apresentadas, o código-fonte da aplicação é disponibilizado. Com isso, existe a possibilidade de comparação entre código-fonte e instruções assembly. Convém lembrar que, o artigo sobre “Introdução ao Assembly” disponível no blog, é imprescindível para este e os restantes tutoriais do tema. (O link para o tutorial de assembly é o seguinte: http://infptavares.blogspot.pt/2013/12/introducao-ao-assembly.html .)
O código-fonte relativo à aplicação em estudo é apresentado em seguida.
Como é possível perceber, o código-fonte apresentado é evidente. Ele é muito parecido ao tutorial anterior, como já referido algumas vezes. Neste são capturados os valores introduzidos na consola (linha de comandos) pelo utilizador. Existem duas combinações possíveis, a correta e a não correta.
1. :> crack-me.exe teste (Password Errada.)
2. :> crack-me.exe 1337 (Password Correta.)
De seguida é exibida uma imagem que retrata estes casos.
A password correta é 1337. À partida, o utilizador não sabe a password correta para obter a mensagem de sucesso “Password Correta! Parabens!“. Existe a necessidade de crackar a aplicação. Em seguida, são devidamente comentados e efetuados todos os passos necessários para obtenção da password correta.
Passo 1: Carregar o executável (aplicação) no IDA Pro.
Para iniciar qualquer processo de debugging, basta arrastar o executável a analisar para dentro do IDA Pro, tal como o próprio software aconselha. As imagens abaixo ilustram esse processo.
Após o drag and drop do executável, ele é carregado em memória e no debugger.
Passo 2: Disassembled Code
De seguida, é necessário procurar no IDA Pro o separador IDA ViewA (por defeito este é selecionado), e maximizar a janela, como apresenta a imagem abaixo.
É possível fazer drag and drop do fluxo apresentado, por forma a navegar no diagrama. Caso o executável possua muitos blocos, é possível fazer uma mini navegação através do Graph overview, posicionado no canto inferior direito, como mostra a imagem acima.
Uma das vantagens evidentes deste software em relação ao OllyDbg é sem dúvida a estruturação do executável por blocos num fluxo, pois torna evidente os saltos (JUMPS) entre blocos.
Este software é bastante user friendly, visto que se houver a necessidade de ajustar o fluxograma à janela, basta utilizar as ferramentas de ajuda. A imagem abaixo, ilustra o uso do Fit Window, por forma a centrar o fluxograma.
É possível observar na imagem em seguida que existem 6 blocos de código distintos, foram assinalados com 6 labels diferentes, nomeadamente de A-F. Estas labels têm uma correspondência no código. Será visto mais abaixo.
Para analisar em detalhe cada bloco é possível usar a ajuda disponibilizada pelo IDA Pro. Como já visto, é possível dar um clique com o botão direito do rato no separador “ViewA” e clicar em “Zoom 100%“. A imagem seguinte é representativa desse processo.
Posto isto, e fazendo drag and drop no fluxograma para o bloco assinalado com a label A, é possível encontrar as instruções assembly iniciais. A imagem a seguir apresenta as instruções relativas ao bloco inicial.
Não existe a necessidade de perceber todas as instruções, visto que apenas duas delas são importantes, nomeadamente as duas últimas.
cmp [ebp+arg_0] , 2
jz short loc_4113C2
Como visto nos artigos anteriores de engenharia reversa, a instrução cmp (comparar) faz uma comparação entre duas variáveis. Neste caso, é verificado se o valor de entrada no parametro argc é igual a 2. Em seguida, é feito um salto para outro bloco do fluxograma, dependendo do valor da flag.
Passo 3: Código-Fonte
Voltando a observar o código-fonte do executável, é possível perceber onde estas instruções assemlby encaixam no código.
Qualquer operação de jump salta para um offset, dependendo do tipo de instrução e do valor das flags. Neste caso jz short loc_4113C2 faz um salto para o loc_4113C2. Este offset está representado a laranja e corresponde ao bloco da direita. Na imagem a seguir é possível observar a representação mencionada..
Fazendo uma análise pormenorizada, o bloco da esquerda é o bloco mau, e o da direita o bloco bom. Isto é, caso o parâmetro argc seja diferente de 2, o programa irá cair sempre no bloco da esquerda, e automaticamente o programa é terminado. Caso argc=2, então o fluxo do programa é enviado para o bloco da direita.O processo é o mesmo, neste é feita uma comparação com o valor de entrada, se for igual a “1337“. Dependo da flag é realizado um determinado jump.
Este procedimento é exatamente igual à análise feita no tutorial anterior. Pode ser visto no link a seguir.
Segundo a lógica, não é desejado efetuar o jump do bloco marcado com a label C.
Para crackar este executável, apenas bastava substituir o endereço (offset) loc_401319 por loc_4012D5. Esta alteração já foi feita e está refletida na imagem acima.
Como referenciado no artigo do OllyDbg (mencionado acima), uma das principais técnicas é efetuar a procura por Strings de referência, neste caso nem existe essa necessidade, pois o IDA Pro é extremamente eficaz na divisão de blocos e torna-se fácil fazer a associação e descobrir a password para cracking do executável.
Os casos de interesse estão marcados a laranja. É possível analisar 3 instruções muito importantes.
mov [esp+18h+var_14] , offset a1337 ; “1337”
test eax , eax
jnz short loc_401306
Inicialmente é colocado o valor “1337” numa variável, através da instrução mov. Mais abaixo, é feita a comparação através da instrução test. A instrução jnz faz o salto se a comparação não for zero, o que quer dizer que, se a password introduzida pelo utilizador for diferente de 1337, então não é atingido o bloco desejado!
É fácil perceber que a password com privilégios é 1337.
Antes de fazer o teste via linha de comandos, é feita a comparação de cada bloco de código com o código-fonte do executável.
Verificando a comparação entre o código assembly do executável e o próprio código-fonte, é fácil de perceber toda a sua correspondência.
Passo4 : Crack
Neste ponto, apenas falta verificar se a password com acesso privilegiado é mesmo 1337.
Não houve enganos.
Espero que não haja dúvidas. Até ao próximo tutorial.
Deixo os ficheiros para download.
Nos próximos artigos de engenharia reversa serão abordados outros pormenores e técnicas do tema.
Boa Continuação!
—