Questão:
Reconstruir tabela de símbolos
allbabel
2014-06-05 19:22:49 UTC
view on stackexchange narkive permalink

Eu gostaria de carregar uma função que descompilei no IDA Pro. Tudo o que tenho é o nome da função IDA Pro sub_xxxx () e obviamente o endereço. Eu tinha pensado em usar dlopen para carregar o binário, mas obviamente não tenho um símbolo para carregar porque o binário foi removido. Eu poderia de alguma forma chamar a função sem uma tabela de símbolos? Ou eu tenho que reconstruir a tabela de símbolos do binário para usar dlsym para localizar e carregar o símbolo?

Dois respostas:
Peter Andersson
2014-06-05 20:21:23 UTC
view on stackexchange narkive permalink

Você pode chamar uma função em qualquer endereço. Portanto, carregue a biblioteca dinâmica em seu espaço de endereço de processo, descubra a base da biblioteca recém-carregada e pegue o deslocamento da base da biblioteca da função que você não deseja chamar e adicione-a.

Então, se o IDA diz que a base do binário é 0x4000 e sua função está no endereço 0x4100 , então você tem um deslocamento de 0x100 . Então, se você carregar sua biblioteca, ela acaba sendo carregada no endereço 0x8000 , você faz um ponteiro de função (com a assinatura correta, é claro) apontando para o endereço 0x8000 + 0x100 e chama isto. Dependendo de sua plataforma, a base que você obtém para sua biblioteca dinâmica do carregador de plataforma pode ser ainda mais deslocada dos shows de base reais do IDA.

Outra opção é, claro, adicionar uma nova definição de exportação para seu sub_xxx () função para a biblioteca dinâmica e fazer o carregador realmente lidar com quaisquer relocações. Será muito mais confiável, permitirá que você atribua um nome lógico à função, para que possa lidar com futuras atualizações da biblioteca onde o endereço da função muda, simplesmente adicionando novamente sua nova exportação à nova versão. Use algo como BinDiff para encontrar a nova localização da função.

A terceira opção popular é usar algo semelhante às assinaturas FLIRT de IDAs para escaneie a biblioteca dinâmica carregada para a função diretamente na memória. Geralmente é chamado de verificação de assinatura e aqui está uma explicação mais completa do conceito na plataforma Windows. Muito simplificado, é uma técnica para encontrar uma função baseada no padrão extraído do prólogo da função.

No seu caso, você controla o aplicativo pelo que posso ver e desejo chamar em uma biblioteca dinâmica que não tem a fonte para. Nesse caso, eu provavelmente escolheria a segunda opção ou a primeira se você souber que a biblioteca nunca mudará.

Eu gosto da primeira opção, estou pensando em usar dlopen para abrir a biblioteca, mas então como obtenho o endereço da biblioteca carregada no código? Eu poderia olhar / proc / maps etc, mas seria bom pegá-lo no código.
@allbabel Eu mesmo não fiz isso, mas você poderia usar `library = dlopen (" path ", RTLD_NOW)`, então `address = dlsym (library," some_known_exported_function ")`. Em seguida, pegue o deslocamento de sua função da função exportada conhecida e adicione-o ao valor retornado por `dlsym`?
user5843
2014-06-13 20:13:31 UTC
view on stackexchange narkive permalink

Não sei exatamente o seu caso. Mas se o binário for apenas removido (ou sstrip for usado) e sua função for apenas uma chamada para um símbolo externo de uma biblioteca dinâmica, você pode querer dar uma olhada neste pequeno script Python IDA meu: http: //h4des.org/blog/index.php?/archives/343-Restoring-external-symbol-calls-in-IDA-when-ELF-sections-are-deleted.html

Este script usa uma biblioteca de analisador ELF que escrevi (chamada ZwoELF) que tenta usar apenas informações que o carregador ELF está usando para contornar problemas que quase todas as ferramentas / estruturas de análise que testei têm, porque dependem de dados opcionais como seções ELF.



Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...