A plataforma de análise binária da Universidade Carnegie Mellon (CMU BAP) é um conjunto de serviços públicos e bibliotecas que permite a análise de programas binários. O BAP suporta X86, X86-64, ARM, MIPS, POWERPC e novas arquiteturas podem ser adicionadas usando plugins. O BAP inclui várias análises, intérprete padrão, intérprete de microexecução e um executor simbólico. O BAP possui sua própria linguagem específica de domínio, Primus Lisp, usada para implementar análises, especificando condições de verificação, funções de modelagem (escrita de stubs) e até interface com o solucionador SMT. O repositório do kit de ferramentas inclui vários exemplos de ferramentas de análise de programas que podem ser implementadas com o BAP e podem ser usadas como ponto de partida (além do tutorial) para implementar análises personalizadas. O BAP pode ser usado como uma estrutura com um único utilitário BAP que é estendido com plugins ou pode ser usado como uma biblioteca incorporada em um aplicativo de usuário, que pode ser escrito no OCAML ou, em qualquer outro idioma, usando ligações C. Também fornecemos algum suporte mínimo para o Python para facilitar o início do aprendizado do BAP.
O BAP foi desenvolvido na CMU, Cylab e é patrocinado por subsídios do Departamento de Defesa dos Estados Unidos, Siemens, Boeing, Forallsecure e do governo da Coréia, consulte os patrocinadores para obter mais informações. O BAP é usado em várias instituições e serve como espinha dorsal para muitos projetos interessantes, alguns são destacados abaixo:
Fornecemos pacotes binários embalados para derivados de Debian e Red Hat. Para outras distribuições, fornecemos arquivos TGZ. Para instalar o BAP em um derivado do Debian:
wget https://github.com/BinaryAnalysisPlatform/bap/releases/download/v2.5.0/{bap,libbap,libbap-dev}_2.5.0.deb
sudo dpkg -i {bap,libbap,libbap-dev}_2.5.0.debNossos pacotes binários não incluem o ambiente de desenvolvimento da OCAML. Se você vai escrever uma análise no OCAML, precisará instalar o BAP a partir do código -fonte usando o OPAM ou clonando e construindo este repositório diretamente. O método Opam é o recomendado. Depois de instalado, os três comandos a seguir devem instalar a plataforma em um comutador recém -criado.
opam init --comp=4.14.1 # inits opam and install the OCaml compiler
opam install bap # installs bap and its dependencies
eval $( opam env ) ` # activates opam environmentOu, se você já tem um interruptor onde deseja instalar o bap, basta fazer
opam install bap
O comando opam install bap também tentará instalar as dependências do sistema do BAP usando o gerenciador de pacotes do sistema operacional. Se falhar devido a uma dependência do sistema ausente, tente instalá -lo manualmente e repita o comando opam install bap . Se ainda não funcionar, não hesite em passar pelo nosso bate -papo e procurar ajuda por lá. É tripulado com pessoas amigáveis que ficarão felizes em ajudar.
A instrução acima lhe dará o último lançamento estável do BAP. Se você estiver interessado em nossos lançamentos de rolamento, que são atualizados automaticamente toda vez que um compromisso com a filial mestre acontece, você pode criar um novo Switch que use nosso repositório de teste
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap Após a adição, o repositório bap terá precedência sobre o repositório estável e você receberá os pacotes BAP recém -escolhidos diretamente da fazenda.
Se você deseja construir o BAP manualmente ou apenas quiser enfrentar o BAP Internals, poderá clonar esse repositório e construí -lo manualmente. Sugerimos que você comece com um ambiente novo sem que o BAP seja instalado, para evitar confrontos, ou melhor até usar um interruptor local, por exemplo,
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installO snippet acima clonará BAP, criará um novo interruptor local, instalará as dependências necessárias, incluindo o sistema e, finalmente, construirá e instalar BAP com Dune. Como alternativa, se você já possui um interruptor onde deseja construir e instalar o BAP, pode usar
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
Para instalar o BAP e suas dependências no comutador atualmente selecionado.
O BAP, como Docker ou Git, é acionado por um único utilitário de linha de comando chamado BAP. Basta digitar bap no seu shell e ele imprimirá uma mensagem que mostra recursos de BAP. O comando disassemble aceitará um programa binário, desmontará-o, levantá-lo para a representação agnóstica da arquitetura intermediária, criará um gráfico de fluxo de controle e, finalmente, aplicará análises encenadas definidas pelo usuário em uma forma de desmontagem passes. Finalmente, a opção --dump ( -d em abreviação) produzirá o programa resultante no formato especificado. Este é o comando padrão, então você nem precisa especificá -lo, por exemplo, o seguinte desmontará e despejará o binário /bin/echo em sua máquina:
bap /bin/echo -d Observe que, diferentemente objdump , este comando criará o gráfico de fluxo de controle de um programa. Se você deseja apenas despejar cada instrução de um binário após o outro (o chamado modo de desmontagem linear de varredura), então você pode usar o comando objdump , por exemplo,
bap objdump /bin/echo --show-{insn=asm,bil} Se sua entrada for um bolhas de código da máquina, não um executável, você pode usar o carregador raw , por exemplo,
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} O carregador bruto leva alguns parâmetros, como compensações, comprimentos e endereços básicos, o que o torna uma faca suíça que você pode usar como abridor de lata para formatos que não são conhecidos pelo BAP. O carregador bruto funciona para todos os comandos que abrem arquivos, por exemplo, se o carregador raw for usado junto com o comando de disassemble , o BAP ainda identificará automaticamente a função inicia e construirá um CFG adequado, sem saber onde o código está no binário,
bap /bin/echo --loader=raw --raw-base=0x400000 -d Se você deseja jogar manualmente com bytes, por exemplo, digite a instrução que codifica manualmente e veja como o BAP o desmonta e que semântica ele tem, mc é o comando que você está procurando. É nomeado para o utilitário correspondente no LLVM e significa código de máquina e possui a mesma interface que o comando objdump , exceto que ele leva uma codificação ASCII de instrução em vez de um arquivo binário, por exemplo,
bap mc --show-{insn=asm,bil} -- 48 83 ec 08ou
bap mc --show-{insn=asm,bil} "x48x83xecx08"
Ele reconhece alguns formatos de entrada (incluindo llvm-mc está usando para sua opção -show-encoding ). Consulte a documentação para obter informações mais detalhadas.
O BAP é uma estrutura baseada em plug-in e, se você deseja desenvolver uma nova análise, pode escrever um plug-in, construí-lo, instalar e funcionará com o restante do BAP sem qualquer recompilação. Existem muitos pontos de extensão que você pode usar para adicionar novas análises, alterar existentes ou até criar seus próprios aplicativos. Começaremos com um exemplo simples, que registra um passe de desmontagem para o comando de desmontagem. Suponha que queremos escrever uma análise que estima a proporção de instruções de salto e o número total de instruções no binário. Começaremos criando um arquivo vazio chamado jmp.ml em uma pasta vazia (o nome da pasta não importa). Em seguida, usando nosso editor de texto favorito, colocaremos o seguinte código nele:
open Core_kernel
open Bap_main
open Bap.Std
let counter = object
inherit [ int * int ] Term. visitor
method ! enter_term _ _ (jmps,total) = jmps,total + 1
method ! enter_jmp _ (jmps,total) = jmps + 1 ,total
end
let main proj =
let jmps,total = counter#run ( Project. program proj) ( 0 , 0 ) in
printf " ratio = %d/%d = %g n " jmps total ( float jmps /. float total)
let () = Extension. declare @@ fun _ctxt ->
Project. register_pass' main;
Ok ()Agora podemos construir, instalar e executar nossa análise usando os seguintes comandos:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
Vamos passar brevemente pelo código. O counter é um visitante que tem o estado que consiste em um par de contadores. O primeiro contador acompanha o número de termos JMP e o segundo contador é incrementado toda vez que inserimos qualquer termo. A função main apenas executa o contador e imprime a saída. Declaramos nossa extensão Use a extensão. Uma extensão é apenas uma função que recebe o contexto (que pode ser usado para obter parâmetros de configuração). Nesta função, registramos nossa função main como uma passagem usando a função Project.register_pass .
Um exemplo um pouco mais complexo, bem como um exemplo que usa Python, pode ser encontrado em nosso tutorial.
Você também pode criar e instalar plug -ins BAP usando Dune. Para isso, você precisa definir uma biblioteca e usar a estrofe plugin que usa esta biblioteca. Abaixo está o arquivo dune do modelo,
(library
(name FOO)
(public_name OUR-FOO.plugin)
(libraries bap bap-main))
(plugin
(name FOO)
(package OUR-FOO)
(libraries OUR-FOO.plugin)
(site (bap-common plugins)))
O Eveything que é capitalizado no snippet acima é um espaço reservado que você deve substituir por nomes públicos e privados apropriados para o seu plug -in. Observe que a extensão .plugin não é necessária, mas é percorrente como uma boa convenção.
O BAP também envia um baptop de Utilitário Toplevel Interativo. Este é um utilitário semelhante ao shell que avalia interativamente as expressões de OCAML e imprime seus valores. Ele carregará bibliotecas BAP e inicializará todos os plugins para você, para que você possa explorar interativamente o vasto mundo do BAP. O utilitário baptop também pode servir como um intérprete não interativo, para que você possa executar seus scripts de OCAML, por exemplo, baptop myscript.ml ou você pode até especificá-lo usando SHA-Bang na parte superior do seu arquivo, por exemplo, #!/usr/bin/env baptop . Construímos baptop usando Utop, mas você pode usar facilmente qualquer outro Toplevel Ocaml, incluindo o próprio ocaml , basta carregar a biblioteca bap.top , por exemplo, para baunilha ocaml Toplevel use as seguintes diretivas
#use " topfind " ;;
#require " bap.top " ;;Entendemos que o BAP é enorme e é fácil se perder. Estamos trabalhando constantemente para melhorar a documentação, garantindo que todas as funções na API BAP sejam completamente documentadas. Porém, escrever diretrizes de nível superior na forma de manuais ou tutoriais é muito mais difícil e demorado, especialmente considerando o quão diferentes os objetivos de nossos colegas pesquisadores e usuários. Portanto, empregamos uma abordagem de cadeia versária e preferimos responder a perguntas reais em vez de tentar prematuramente abordar todas as perguntas possíveis. Ficaremos felizes em vê -lo em seu bate -papo que apresenta pesquisados, indexados pelo Google, Archive.
Estamos escrevendo, ocasionalmente, para o nosso blog e wiki e estamos incentivando todos a contribuir com os dois. Você também pode postar suas perguntas no Stackoverflow ou discutir o BAP na placa OCAML. Também temos um canal de discórdia fofo, que tem muito menos tráfego que o nosso Gitter.
O BAP é construído pela comunidade e somos bem -vindos todas as contribuições de autores que estão dispostos a compartilhá -los sob a licença do MIT. Se você não acha que sua análise ou ferramenta se adapta a esse repositório (por exemplo, ele tem um uso limitado, não totalmente pronto, não atende aos nossos padrões, etc.), você pode considerar contribuir com nosso repositório de plugins bap que é uma coleção de plug-ins úteis que não são maduros o suficiente para serem incluídos na distribuição principal. Como alternativa, você pode considerar estender nosso kit de ferramentas com sua ferramenta.
Obviamente, não há necessidade de enviar seu trabalho a um de nossos repositórios. O BAP é uma estrutura baseada em plug-in e seu código pode ser hospedado em qualquer lugar e ter qualquer licença (incluindo proprietário). Se você deseja disponibilizar seu trabalho para a comunidade, seria uma boa ideia lançá -lo via Opam.
Forallsecure
Boeing
Projeto Darpa Vet
Siemens AG
Instituto de Promoção de Tecnologia de Informação e Comunicação (IITP) financiado pelo governo da Coréia (MSIT) (No.2015-0-00565, Desenvolvimento de tecnologias de descoberta de vulnerabilidades para segurança de software da IoT)
Entre em contato conosco se você deseja se tornar um patrocinador ou estiver buscando uma colaboração mais profunda.