CMU BAP (Carnegie Mellon University Binary Analysis Platform)는 이진 프로그램을 분석 할 수있는 유틸리티 및 라이브러리 제품군입니다. BAP는 X86, X86-64, ARM, MIPS, PowerPC 및 새로운 아키텍처를 플러그인을 사용하여 추가 할 수 있습니다. BAP에는 다양한 분석, 표준 통역사, 미세 실행 통역사 및 상징적 집행 인이 포함됩니다. BAP는 자체 도메인 별 언어 인 Primus LISP를 특징으로하며 분석을 구현하고 검증 조건을 지정, 모델링 기능 (스터브 작성) 및 SMT 솔버와 인터페이스하는 데 사용됩니다. 툴킷 리포지토리에는 BAP를 사용하여 구현할 수 있으며 사용자 정의 분석을 구현하기위한 시작점 (튜토리얼 외에)으로 사용할 수있는 다양한 프로그램 분석 도구의 예가 포함되어 있습니다. BAP는 플러그인으로 확장 된 단일 BAP 유틸리티가있는 프레임 워크로 사용될 수 있거나 사용자 애플리케이션에 포함 된 라이브러리로 사용될 수 있으며, OCAML 또는 다른 언어로 C 바인딩을 사용하여 작성할 수 있습니다. 또한 BAP 학습을보다 쉽게 시작할 수 있도록 Python에 대한 최소한의 지원을 제공합니다.
BAP는 CMU, Cylab에서 개발되었으며 미국 국방부, Boeing, Foralsecure 및 한국 정부의 보조금으로 후원합니다. 자세한 내용은 후원자를 참조하십시오. BAP는 다양한 기관에서 사용되며 많은 흥미로운 프로젝트의 백본 역할을하며 일부는 다음과 같습니다.
우리는 데비안 및 레드 모자 파생 상품을 위해 포장 된 이진 패키지를 제공합니다. 다른 배포판의 경우 TGZ 아카이브를 제공합니다. 데비안 파생물에 BAP를 설치하려면 :
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.deb이진 패키지에는 OCAML 개발 환경이 포함되어 있지 않습니다. OCAML에 분석을 작성하려면 OPAM을 사용하여 소스 코드에서 BAP를 설치 하거나이 저장소를 직접 클로닝하고 구축해야합니다. OPAM 방법은 권장되는 방법입니다. 설치되면 다음 세 가지 명령이 새로 생성 된 스위치에 플랫폼을 설치해야합니다.
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 environment또는 BAP를 설치하려는 스위치가 이미 있으면
opam install bap
opam install bap 명령은 운영 체제 패키지 관리자를 사용하여 BAP의 시스템 종속성을 설치하려고합니다. 누락 된 시스템 종속성으로 인해 실패한 경우 수동으로 설치 한 다음 opam install bap 명령을 반복하십시오. 여전히 작동하지 않는다면 주저하지 말고 대화를 나누고 도움을 구하십시오. 기꺼이 도와 드리겠습니다.
위의 지침은 BAP의 최신 안정적인 릴리스를 제공합니다. 마스터 브랜치에 커밋 될 때마다 자동으로 업데이트되는 롤링 릴리스에 관심이 있다면 테스트 저장소를 사용하는 새 스위치를 만들 수 있습니다.
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap 추가 된 후 bap 저장소는 안정적인 저장소보다 우선하며 농장에서 갓 선택한 BAP 패키지를 얻을 수 있습니다.
BAP를 수동으로 구축하려고하거나 BAP 내부를 사용하여 해결하려면이 저장소를 복제하고 수동으로 빌드 할 수 있습니다. BAP가 설치되지 않은 신선한 환경으로 시작하거나 충돌을 방지하거나 로컬 스위치를 사용하는 것이 더 좋습니다.
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune install위의 스 니펫은 BAP를 복제하고, 신선한 로컬 스위치를 만들고, 시스템을 포함하여 필요한 종속성을 설치하고, 마지막으로 Dune과 함께 BAP를 빌드 및 설치합니다. 또는 BAP를 빌드하고 설치하려는 스위치가 이미있는 경우 사용할 수 있습니다.
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
BAP 및 그 종속성을 현재 선택한 스위치에 설치합니다.
Docker 또는 Git과 같은 BAP는 BAP라는 단일 명령 줄 유틸리티에 의해 구동됩니다. 쉘에 bap 입력하면 BAP 기능을 보여주는 메시지를 인쇄합니다. disassemble 명령은 바이너리 프로그램을 취하고 분해하고 중간 아키텍처 불가지론 표현으로 들어 올리며 제어 흐름 그래프를 구축 한 다음 결국 분해하는 패스 형태로 단계별 사용자 정의 분석을 적용합니다. 마지막으로 --dump 옵션 ( -d in short)은 결과 프로그램을 지정된 형식으로 출력합니다. 이것은 기본 명령이므로 다음을 지정할 필요조차 없습니다. 예를 들어 다음은 시스템에 /bin/echo 바이너리를 분해하고 버립니다.
bap /bin/echo -d objdump 와 달리이 명령은 프로그램의 제어 흐름 그래프를 작성합니다. 바이너리 명령의 각 명령어를 차례로 덤프하려면 (소위 선형 스위프 디스 어셈블러 모드) objdump 명령 (예 :)을 사용할 수 있습니다.
bap objdump /bin/echo --show-{insn=asm,bil} 입력이 실행 파일이 아닌 기계 코드 덩어리 인 경우 raw 로더 (예 :)를 사용할 수 있습니다.
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} 원시 로더는 오프셋, 길이 및 기본 주소와 같은 몇 가지 매개 변수를 사용하여 BAP로 알려지지 않은 형식의 캔 오프너로 사용할 수있는 스위스 나이프가됩니다. 원시 로더는 파일을 열 수있는 모든 명령에 대해 작동합니다. 예를 들어, raw 로더가 disassemble 명령과 함께 사용되면 BAP는 여전히 코드가 바이너리의 위치를 모르고 기능을 자동으로 식별하고 적절한 CFG를 구축합니다.
bap /bin/echo --loader=raw --raw-base=0x400000 -d 바이트로 수동으로 재생하려면 수동으로 인코딩하는 명령어를 입력하고 BAP가 어떻게 분해되는지와 어떤 의미를 가지고 있는지 확인하면 mc 찾고있는 명령입니다. LLVM의 해당 유틸리티의 이름을 따서 기계 코드를 나타냅니다. 이진 파일 대신 ascii를 인코딩하는 것을 제외하고는 objdump 명령과 동일한 인터페이스를 가지고 있습니다 (예 : 이진 파일).
bap mc --show-{insn=asm,bil} -- 48 83 ec 08또는
bap mc --show-{insn=asm,bil} "x48x83xecx08"
몇 가지 입력 형식 ( llvm-mc 포함 -show-encoding 옵션에 사용 중)을 인식합니다. 자세한 내용은 문서를 참조하십시오.
BAP는 플러그인 기반 프레임 워크이며 새로운 분석을 개발하려면 플러그인을 작성하고 빌드하고 설치할 수 있으며 다시 컴파일하지 않고 나머지 BAP에서 작동합니다. 새로운 분석을 추가하거나 기존 변경 또는 자체 애플리케이션을 구축하는 데 사용할 수있는 많은 확장 지점이 있습니다. 분해 패스를 분해 명령에 등록하는 간단한 예로 시작합니다. 바이너리의 총 지침 수에 대한 점프 지침의 비율을 추정하는 분석을 작성하고 싶다고 가정 해 봅시다. 빈 폴더에서 jmp.ml 이라는 빈 파일을 만들기 시작합니다 (폴더 이름은 중요하지 않음). 다음으로, 좋아하는 텍스트 편집기를 사용하여 다음 코드를 넣을 것입니다.
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 ()이제 다음 명령을 사용하여 분석을 구축, 설치 및 실행할 수 있습니다.
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
코드를 간단히 살펴 보겠습니다. counter 객체는 한 쌍의 카운터로 구성된 상태를 가진 방문자입니다. 첫 번째 카운터는 JMP 용어 수를 추적하며, 두 번째 카운터는 모든 용어를 입력 할 때마다 증가합니다. main 기능은 카운터를 실행하고 출력을 인쇄합니다. 우리는 확장자를 사용하여 확장자를 사용한다고 선언합니다. 확장자는 컨텍스트 (구성 매개 변수를 얻는 데 사용될 수 있음)를 수신하는 함수 일뿐입니다. 이 기능에서는 Project.register_pass 함수를 사용하여 main 기능을 패스로 등록합니다.
파이썬을 사용하는 예제뿐만 아니라 조금 더 복잡한 예는 튜토리얼에서 찾을 수 있습니다.
Dune을 사용하여 BAP 플러그인을 빌드하고 설치할 수도 있습니다. 이를 위해서는 라이브러리를 정의 하고이 라이브러리를 사용하는 plugin 스탠자를 사용해야합니다. 아래는 템플릿 dune 파일입니다.
(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)))
위의 스 니펫에서 자본화 된 eveything은 플러그인의 적절한 개인 및 공개 이름으로 대체 해야하는 자리 표시 자입니다. .plugin 확장은 필요하지 않지만 좋은 협약으로 인식됩니다.
Bap은 또한 대화식 Toplevel 유틸리티 baptop 배송합니다. 이것은 대화식으로 OCAML 표현식을 평가하고 그 값을 인쇄하는 쉘과 같은 유틸리티입니다. BAP 라이브러리를로드하고 모든 플러그인을 초기화하므로 광대 한 BAP 세계를 대화식으로 탐색 할 수 있습니다. baptop 유틸리티는 비inCAML 스크립트 (예 : baptop myscript.ml 를 실행하거나 파일 상단에 SHA-BANG을 사용하여 지정할 수도 있습니다 (예 : #!/usr/bin/env baptop . 우리는 Utop을 사용하여 baptop 만들었지 만 ocaml 자체를 포함한 다른 OCAML Toplevel을 쉽게 사용할 수 있습니다. 바닐라 ocaml TOPLEVEL을 위해 bap.top 라이브러리를로드하십시오.
#use " topfind " ;;
#require " bap.top " ;;우리는 BAP가 거대하고 길을 잃기 쉽다는 것을 이해합니다. 우리는 BAP API의 모든 단일 기능이 철저히 문서화되도록 문서화를 지속적으로 진행하고 있습니다. 그러나 매뉴얼 또는 튜토리얼 형태로 상위 수준의 지침을 작성하는 것은 특히 동료 연구자와 사용자의 목표가 얼마나 다른지를 감안할 때 훨씬 어렵고 시간이 많이 걸립니다. 따라서 우리는 후진 체인 접근 방식을 사용하며 가능한 모든 질문을 조기에 다루기보다는 실제 질문에 대답하는 것을 선호합니다. Google, Archive가 색인으로 검색 가능한 기능을 갖춘 채팅에서 기꺼이 보게되어 기쁩니다.
우리는 때때로 우리의 블로그와 위키에 글을 쓰고 있으며 모든 사람들이 둘 다 그들 모두에게 기여하도록 격려하고 있습니다. StackoverFlow에 질문을 게시하거나 OCAML 보드에서 BAP에 대해 논의 할 수도 있습니다. 우리는 또한 귀여운 discord 채널을 가지고 있으며, 이는 Gitter보다 트래픽이 훨씬 적습니다.
BAP는 커뮤니티에 의해 구축되었으며 MIT 라이센스에 따라 기꺼이 공유 할 저자의 모든 기여를 환영합니다. 분석이나 도구 가이 저장소에 적합하다고 생각하지 않는다면 (예 : 완전히 준비되지 않고, 표준을 충족시키지 못하고, 표준 등을 충족하지 않음), 주 분포에 포함되지 않을 정도로 성숙하지 않은 유용한 BAP 플러그인 모음 인 BAP-Plugins 저장소에 기여하는 것을 고려할 수 있습니다. 또는 도구로 툴킷을 확장하는 것을 고려할 수 있습니다.
물론, 귀하의 작업을 저장소 중 하나에 제출할 필요가 없습니다. BAP는 플러그인 기반 프레임 워크이며 코드는 어디에서나 호스팅되며 라이센스가있을 수 있습니다 (독점 포함). 커뮤니티에서 작업을 이용할 수있게하려면 OPAM을 통해 출시하는 것이 좋습니다.
전분을 위해
보잉
DARPA 수의사 프로젝트
지멘스 AG
Institute for Information & Communications Technology Promotion (IITP) 보조금 한국 정부 (MSIT)가 자금을 지원하는 보조금 (No.2015-0-00565, IoT 소프트웨어 보안을위한 취약성 발견 기술 개발)
스폰서가 되려면 저희에게 연락하거나 더 심층적 인 협력을 찾고 있다면 문의하십시오.