La plataforma de análisis binario de la Universidad Carnegie Mellon (CMU BAP) es un conjunto de servicios públicos y bibliotecas que permite el análisis de programas binarios. BAP admite X86, X86-64, ARM, MIPS, PowerPC y nuevas arquitecturas se pueden agregar utilizando complementos. BAP incluye varios análisis, intérprete estándar, intérprete de microexecución y un ejecutor simbólico. BAP presenta su propio lenguaje específico de dominio, Primus LISP, que se utiliza para implementar análisis, especificar condiciones de verificación, modelar funciones (redacción de trozos) e incluso interactuar con el solucionador SMT. El repositorio del kit de herramientas incluye varios ejemplos de herramientas de análisis de programas que podrían implementarse con BAP y que pueden usarse como punto de partida (además del tutorial) para implementar análisis personalizados. BAP se puede usar como un marco con una sola utilidad BAP que se extiende con complementos o se puede usar como una biblioteca integrada en una aplicación de usuario, que podría escribirse en OCAML o, en cualquier otro idioma, utilizando enlaces C. También brindamos un apoyo mínimo para Python para que sea más fácil comenzar a aprender BAP.
BAP se desarrolló en CMU, Cylab y está patrocinado por subvenciones del Departamento de Defensa de los Estados Unidos, Siemens, Boeing, ForalSegure y el gobierno de Corea, ver patrocinadores para obtener más información. BAP se usa en varias instituciones y sirve como columna vertebral para muchos proyectos interesantes, algunos se destacan a continuación:
Proporcionamos paquetes binarios empacados para derivados de hat Debian y Red. Para otras distribuciones proporcionamos archivos TGZ. Para instalar BAP en un derivado de 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.debNuestros paquetes binarios no incluyen el entorno de desarrollo OCAML. Si va a escribir un análisis en OCAML, debe instalar BAP del código fuente utilizando OPAM o clonando y construyendo este repositorio directamente. El método OPAM es el recomendado. Una vez que se instale, los siguientes tres comandos deben instalar la plataforma en un interruptor recién creado.
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 environmentO, si ya tiene un interruptor donde desea instalar BAP, simplemente haga
opam install bap
El comando opam install bap también intentará instalar las dependencias del sistema de BAP utilizando el Administrador de paquetes de su sistema operativo. Si falla debido a una dependencia del sistema faltante, intente instalarla manualmente y luego repita el comando opam install bap . Si todavía no funciona, no dude en pasar por nuestro chat y buscar ayuda allí. Está tripulado con personas amigables que estarán felices de ayudar.
La instrucción anterior le dará la última versión estable de BAP. Si está interesado en nuestras versiones de rodaje, que se actualizan automáticamente cada vez que se produce una compromiso con la rama maestra, puede crear un nuevo interruptor que utilice nuestro repositorio de pruebas
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap Después de agregarlo, el repositorio bap tendrá prioridad sobre el repositorio estable y obtendrá los paquetes BAP recién elegidos directamente de la granja.
Si desea construir BAP manualmente o simplemente desea abordar con BAP -THERALS, puede clonar este repositorio y construirlo manualmente. Sugerimos que comience con un entorno fresco sin que se instale bap, para evitar enfrentamientos, o incluso mejor usar un interruptor local, por ejemplo,
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installEl fragmento de arriba clonará BAP, creará un interruptor local fresco, instalará las dependencias necesarias, incluida la del sistema y, finalmente, construirá e instalará BAP con Dune. Alternativamente, si ya tiene un interruptor donde desea construir e instalar BAP, puede usar
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
Para instalar BAP y sus dependencias en el interruptor seleccionado actualmente.
BAP, como Docker o Git, está impulsado por una sola utilidad de línea de comandos llamada BAP. Simplemente escriba bap en su shell e imprimirá un mensaje que muestra las capacidades BAP. El comando disassemble tomará un programa binario, lo desmontará, lo elevará a la representación agnóstica de la arquitectura intermedia, construirá un gráfico de flujo de control y finalmente aplicará un análisis escenificado definido por el usuario en una forma de pases desmontables. Finalmente, la opción --dump ( -d en resumen) generará el programa resultante en el formato especificado. Este es el comando predeterminado, por lo que ni siquiera necesita especificarlo, por ejemplo, lo siguiente se desmontará y descargará el binario /bin/echo en su máquina:
bap /bin/echo -d Tenga en cuenta que, a diferencia de objdump , este comando construirá el gráfico de flujo de control de un programa. Si solo desea volcar cada instrucción de uno binario tras otro (el llamado modo de desonometría lineal de barrido), puede usar el comando objdump , por ejemplo,
bap objdump /bin/echo --show-{insn=asm,bil} Si su entrada es una gota de código de máquina, no un ejecutable, entonces puede usar el cargador raw , por ejemplo,
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} El cargador sin procesar toma algunos parámetros, como compensaciones, longitudes y direcciones base, lo que lo convierte en una navaja suiza que puede usar como un abridor de lata para formatos que no se sabe que BAP. El cargador sin procesar funciona para todos los comandos que abren archivos, por ejemplo, si el cargador raw se usa junto con el comando disassemble , BAP aún identificará automáticamente los inicios de función y construirá un CFG adecuado sin siquiera saber dónde está el código en el binario,
bap /bin/echo --loader=raw --raw-base=0x400000 -d Si desea jugar manualmente con bytes, por ejemplo, escriba las instrucciones que codifica manualmente y vea cómo BAP lo desmonta y qué semántica tiene, entonces mc es el comando que está buscando. Se llama por la utilidad correspondiente en LLVM y representa el código de la máquina y tiene la misma interfaz que el comando objdump excepto que toma una codificación ASCII de instrucción en lugar de un archivo binario, por ejemplo,
bap mc --show-{insn=asm,bil} -- 48 83 ec 08o
bap mc --show-{insn=asm,bil} "x48x83xecx08"
Reconoce algunos formatos de entrada (incluido llvm-mc está utilizando para su opción -show-encoding ). Consulte la documentación para obtener información más detallada.
BAP es un marco basado en complementos y si desea desarrollar un nuevo análisis, puede escribir un complemento, construirlo, instalar y funcionará con el resto del BAP sin ninguna recompilación. Hay muchos puntos de extensión que podría usar para agregar un nuevo análisis, cambiar existente o incluso construir sus propias aplicaciones. Comenzaremos con un ejemplo simple, que registra un pase desarmado al comando de disco. Supongamos que queremos escribir un análisis que estima la relación de instrucciones de salto para el número total de instrucciones en el binario. Comenzaremos creando un archivo vacío llamado jmp.ml en una carpeta vacía (el nombre de la carpeta no importa). A continuación, utilizando nuestro editor de texto favorito, pondremos el siguiente código:
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 ()Ahora podemos construir, instalar y ejecutar nuestro análisis utilizando los siguientes comandos:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
Pasemos brevemente el código. El objeto counter es un visitante que tiene el estado que consiste en un par de contadores. El primer contador realiza un seguimiento del número de términos JMP, y el segundo contador se incrementa cada vez que ingresamos a cualquier término. La función main solo ejecuta el contador e imprime la salida. Declaramos nuestra extensión Use la función extensión. Declare desde la biblioteca BAP_MAIN. Una extensión es solo una función que recibe el contexto (que podría usarse para obtener parámetros de configuración). En esta función, registramos nuestra función main como un pase utilizando la función Project.register_pass .
Un ejemplo un poco más complejo, así como un ejemplo que usa Python, se puede encontrar en nuestro tutorial.
También puede construir e instalar complementos BAP usando Dune. Para eso, debe definir una biblioteca y usar la estrofa plugin que usa esta biblioteca. A continuación se muestra el archivo dune de la plantilla,
(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)))
En mayúscula en el fragmento anterior es un marcador de posición que sustituirá con los nombres privados y públicos apropiados para su complemento. Observe que la extensión .plugin no es necesaria, pero se percibe como una buena convención.
BAP también envía una baptop interactiva de utilidad toplevel. Esta es una utilidad similar a la concha que evalúa interactivamente las expresiones OCAML e imprime sus valores. Cargará bibliotecas BAP e inicializará todos los complementos para usted, por lo que puede explorar interactivamente el vasto mundo de BAP. La utilidad baptop también puede servir como un intérprete no interactivo, para que pueda ejecutar sus scripts Ocaml, por ejemplo, baptop myscript.ml o incluso puede especificarlo usando SHA-Bang en la parte superior de su archivo, EG, #!/usr/bin/env baptop . Construimos baptop usando Utop, pero puede usar fácilmente cualquier otro Toplevel Ocaml, incluida ocaml , solo cargue la biblioteca bap.top , por ejemplo, para Vanilla ocaml Toplevel Utilice las siguientes directivas
#use " topfind " ;;
#require " bap.top " ;;Entendemos que BAP es enorme y es fácil perderse. Estamos trabajando constantemente en mejorar la documentación, asegurando que cada función en la API BAP esté bien documentada. Pero escribir directrices de nivel superior en forma de manuales o tutoriales es mucho más difícil y mucho tiempo, especialmente dados lo diferentes que son los objetivos de nuestros compañeros investigadores y usuarios. Por lo tanto, empleamos un enfoque de cadena hacia atrás y preferimos responder preguntas reales en lugar de tratar prematuramente de abordar todas las preguntas posibles. Estaremos encantados de verlo en su chat que se pueda buscar, indexado por Google, Archive.
Estamos escribiendo, ocasionalmente, a nuestro blog y wiki y estamos alentando a todos a contribuir a ambos. También puede publicar sus preguntas en StackOverflow o discutir BAP en la Junta OCAML. También tenemos un lindo canal de discordia, que tiene mucho menos tráfico que nuestro Gitter.
BAP es construido por la comunidad y somos bienvenidos todas las contribuciones de los autores que están dispuestos a compartirlos bajo la licencia MIT. Si no cree que su análisis o herramienta se adapte a este repositorio (por ejemplo, tiene un uso limitado, no completamente listo, no cumple con nuestros estándares, etc.), entonces puede considerar contribuir a nuestro repositorio de plugins BAP que es una colección de complementos BAP útiles que no son lo suficientemente maduros como para ser incluidos en la distribución principal. Alternativamente, puede considerar extender nuestro kit de herramientas con su herramienta.
Por supuesto, no hay necesidad de enviar su trabajo a uno de nuestros repositorios. BAP es un marco basado en complementos y su código podría alojarse en cualquier lugar y tener cualquier licencia (incluida la propietaria). Si desea que su trabajo esté disponible para la comunidad, sería una buena idea lanzarlo a través de OPAM.
Prefabricado
Boeing
Proyecto VET de DARPA
Siemens AG
Subvención del Instituto para la Información y la Tecnología de las Comunicaciones (IITP) financiada por el gobierno de Corea (MSIT) (No.2015-0-00565, Desarrollo de tecnologías de descubrimiento de vulnerabilidad para la seguridad del software IoT)
Por favor, contáctenos si desea convertirse en patrocinador o está buscando una colaboración más profunda.