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.
Nos próximos artigos de engenharia reversa serão abordados outros pormenores e técnicas do tema.
Pedro Tavares is a professional in the field of information security working as an Ethical Hacker/Pentester, Malware Researcher and also a Security Evangelist. He is also a founding member at CSIRT.UBI and Editor-in-Chief of the security computer blog seguranca-informatica.pt.
In recent years he has invested in the field of information security, exploring and analyzing a wide range of topics, such as pentesting (Kali Linux), malware, exploitation, hacking, IoT and security in Active Directory networks. He is also Freelance Writer (Infosec. Resources Institute and Cyber Defense Magazine) and developer of the 0xSI_f33d – a feed that compiles phishing and malware campaigns targeting Portuguese citizens.
Read more here.