Recentemente, tive uma tarefa no trabalho para entender um programa binário Linux. No entanto, o programa estava em formato binário.
Eu usei os comandos file
, strings
e objdump
para ter uma pequena ideia do que estava fazendo, e quais funções ele estava chamando.
Parece que o binário é compilado com informações de depuração. O que mais posso aprender sobre isso?
linux
reverse-engineering
Jeff Schaller
fonte
fonte
Respostas:
Incluindo os comandos que você já usou, tentarei ao máximo detalhar o que pode ser feito para executar algumas operações forenses em um arquivo executável.
O
strings
comando humilde pode ser útil para visualizar mensagens de erro de texto que dão dicas das funcionalidades binárias. É também uma maneira simples de detectar binários compactados, como no exemplo (freqüente nos binários de malware):file
permite ver as propriedades executáveis, a saber:Neste exemplo, "não retirado" indica que ele foi compilado com as informações de depuração incluídas.
objdump
produz a lista de desmontagem de um executável:objdump
também permite conhecer o compilador usado para compilar o executável binário:objdump
também lista funções externas dinâmicas vinculadas em tempo de execução:$ objdump -T exe_file
Você pode executar o binário em uma VM criada apenas e depois descartada apenas com a finalidade de executar o binário. Use
strace
,ltrace
,gdb
esysdig
para saber mais sobre o que o binário está fazendo no nível chamadas de sistema em tempo de execução.Também pode ser depurado passo a passo com
gdb
.Para seguir / criar despejos de grande parte de sua atividade de sistema executando-o, use sysdig como em:
Trataremos novamente da análise estática do próprio arquivo binário no restante desta resposta.
ldd exe_file
lista as bibliotecas que ele usa;size -A exe_file
readelf -x .rodata exe_file
lista cadeias estáticasreadelf -h exe_file
obtém informações do cabeçalho ELFreadelf -s exe_file
exibe símbolosnm exe_file
lista símbolos da tabela de objetos:Além de desmontar o binário
objdump
, também pode ser usado um descompilador.Para descompilar, recentemente fiz um desafio técnico em que precisava descompilar dois pequenos binários linux de 64 bits.
Eu tentei usar o Boomerang e o Snowman. O projeto Boomerang parece abandonado, e eu não fiquei impressionado com as limitações de ambos. Várias outras alternativas, de código aberto / freeware / antigo, incluindo uma recente lançada pela Avast, apenas descompilaram binários de 32 bits.
Acabei tentando a demo do Hopper no MacOS (ele também tem uma versão Linux).
O funil desmonta e descompila binários de 32 ou 64 bits para OS / X, Linux e Windows. É capaz de lidar com grandes binários quando licenciado.
Também faz gráficos de fluxo das funções da estrutura / programa e variáveis.
Também está sendo mantido e atualizado ativamente. No entanto, é comercial.
Eu gostei muito de usá-lo e da saída resultante que comprou uma licença. A licença é muito mais acessível do que os raios hexadecimais por um longo tempo.
Nos comentários desta resposta, @ d33tah e @Josh também mencionam como alternativas de código aberto o radare2 mais a interface gráfica correspondente do Cutter, semelhante ao Hopper no Linux, não pode atestar pessoalmente por ele, pois eu não os uso.
Além disso, como o binário de destino foi compilado com informações de depuração, você pode recuperar o nome original de funções e variáveis.
Mais notavelmente, você nunca receberá de volta os comentários no código-fonte, pois eles não são compilados de forma alguma em executáveis binários.
Melhorar a qualidade da fonte de saída e o entendimento do binário sempre implicará algum tempo e trabalho de detetive. Os descompiladores fazem apenas muito do trabalho.
Exemplo de saída do funil sem informações de depuração:
A interface gráfica do Hopper também é muito útil (várias funcionalidades expandidas ao mesmo tempo nesta figura):
veja também a pergunta relacionada Por que o verdadeiro e o falso são tão grandes?
fonte
strace -f
de rastrear threads / processos filhos. Há opções para dividir a saída em arquivos separados para cada PID, ou você pode apenas/12345
emless
para procurar e destacar linhas que começam com o PID você está em interessado. Se as coisas não estão muito misturados (por exemplo, shell script começando outra processos, não threads simultâneos), isso pode ser utilizável. Mas sim, é extremamente útil apenas ver quais arquivos de configuração / outros algum software confuso está tentando ler, ao tentar descobrir por que não está feliz com a maneira como você o instalou.radare2
à lista.