
Neste artigo, vamos entender como descompilar arquivos ELF no Cutter usando o exemplo de tarefas leves. Introdução às
partes reversas: Parte 1: descompilação C, C ++ e DotNet - Fundamentos reversos
Parte 2: MIPS Reverse e Golang - Fundamentos reversos
Informação organizacional
, - , :
, , , .
, , Telegram . , , .
. , - , .
- PWN;
- (Crypto);
- c (Network);
- (Reverse Engineering);
- (Stegano);
- WEB-.
, , , .
, , Telegram . , , .
. , - , .
Instruções falsas

Esta é a oitava tarefa nesta categoria, e estamos sendo informados de que existem instruções falsas. Vamos começar examinando as informações do arquivo.

Abro o programa no Cutter - uma GUI para radare2 com um descompilador ghidra embutido que tem a capacidade de emular e, mais recentemente, depurar. E imediatamente obtemos uma lista interessante de funções.

Vamos passar para a função principal e descompilá-la.

No início, o canário é inicializado e o número de argumentos é verificado. Depois disso, bytes 0x1f são alocados, onde a string constante especificada é copiada, o endereço é salvo na variável iVar3 e, em seguida, bytes individuais dessa string são alterados. Em seguida, as transformações ocorrem com a string s1, que não é do nosso interesse. A função WPA também é inicializada, e a senha inserida é gravada no endereço auStack50 e passada junto com a string iVar3 convertida para a função WPA, após o que o valor canário é verificado e o programa encerrado.
Vamos passar para o recurso WPA.

A linha anteriormente inserida no programa é alterada novamente, após o que as duas linhas são comparadas. Se forem iguais, a função blowfish () será chamada, o que nos mostrará a senha correta para alteração, caso contrário, a função RS4 () será chamada.

Visto que ocorre a descriptografia dos valores inseridos anteriormente, podemos depurar o programa e alterar o resultado da comparação. Vamos ver onde as strings são comparadas e definir um ponto de interrupção.

Agora vamos começar a depurar - F9, e inserir os argumentos do programa.

Clique no botão mais adiante na barra de navegação até chegarmos ao nosso breakpoint. O resultado da comparação de strings usando a função strcmp () será escrito no registrador EAX, que será verificado. Como as strings não são iguais, este registro contém o valor 1.

Vamos alterá-lo para 0 para alterar a ramificação do comportamento do programa e continuar executando. Após o preenchimento no console do Cutter, veremos a resposta correta, que deverá ser enviada no site.

Ptrace

Baixe o programa e confira.

Nada extravagante, você precisa encontrar uma senha. Mas há um pouco de proteção contra depuração (ptrace) e transições que precisam ser editadas manualmente. É assim que o gráfico mostra no IDA Pro.

Também faremos essa tarefa no Cutter, ele corrigirá automaticamente todas as transições.

Vamos prosseguir para a descompilação da função principal.

E a senha correta são as 4 letras correspondentes da string especificada no início.

ARM ELF

Este é um binar para a arquitetura ARM, nós o jogamos no Cutter e selecionamos a função principal. No gráfico de funções, vemos com o que estamos lidando e, provavelmente, esta é uma comparação símbolo por símbolo.

Abrimos o descompilador e analisamos o programa.

Em primeiro lugar, a presença do argumento do programa e seu comprimento são verificados, deve ser igual a 6.

Portanto, a variável var_14h atua como um índice e assume o valor 0. E então ocorrem várias comparações, as quais consideraremos como condições:
str [0] == str [5]
str [0] + 1 == str [1]
str [3] + 1 == str [0]
str [2] + 4 == str [5]
str [4] + 2 == str [2]
0 == str [3] ^ 0x72
Vamos implementar o algoritmo e obter a senha.

E obtemos a senha necessária. É tudo por agora.
Você pode se juntar a nós emTelegram . Lá você pode encontrar materiais interessantes, cursos que vazaram e software. Vamos reunir uma comunidade, na qual haverá pessoas versadas em várias áreas de TI, para que possamos sempre ajudar uns aos outros em quaisquer questões de TI e segurança da informação.