
B2R2는 F#으로 작성된 완전 관리형 바이너리 분석 프레임워크입니다. 리버스 엔지니어링, 프로그램 분석, 바이너리 수준 검사를 위한 풍부한 알고리즘, 함수, 도구 세트를 제공합니다.

B2R2는 F#으로 작성된 완전 관리형 바이너리 분석 프레임워크입니다. 리버스 엔지니어링, 프로그램 분석, 바이너리 수준 검사를 위한 다양한 알고리즘, 함수 및 도구를 제공합니다.
B2R2라는 이름은 스타워즈의 상징적인 로봇인 R2-D2에서 영감을 받았습니다. 원래 B2-R2라는 이름이었으나, .NET 식별자와 네임스페이스는 하이픈을 허용하지 않기 때문에 나중에 하이픈이 없는 B2R2 형태를 채택했습니다. 이 이름은 프로젝트의 목적을 반영합니다. "B"와 "2"는 바이너리 및 2상태 계산을 나타내고, "R"은 리버싱(Reversing)을 의미합니다. 요약하자면, B2R2는 바이너리 리버싱을 위해 만들어졌습니다.
B2R2는 분석에 친화적입니다: 패턴 매칭, 대수 데이터 타입, 표현력이 풍부한 함수형 추상화와 같은 기능 덕분에 프로그램 분석기 구축에 적합한 언어인 F#으로 작성되었습니다.
B2R2는 빠릅니다: 핵심 바이너리 분석 엔진은 효율성을 위해 설계되었으며, 함수형 우선 스타일로 작성되었습니다. 이는 명령어 리프팅 및 CFG 복구와 같은 일반적인 분석 작업에서 순수 병렬성에 자연스럽게 적합합니다.
B2R2는 사용하기 쉽습니다: 완전 관리형 라이브러리로서 복잡한 네이티브 종속성 설정을 피할 수 있습니다. .NET SDK를 설치하기만 하면 바로 사용할 수 있습니다. 기본 지원 덕분에 API를 더 쉽게 탐색할 수 있습니다.
B2R2는 OS에 독립적입니다: Linux, macOS, Windows 및 .NET이 지원하는 다른 모든 플랫폼에서 작동합니다.
B2R2는 상호 운용 가능합니다: 단일 프로그래밍 언어에 국한되지 않습니다. 원칙적으로 B2R2 API는 CLI 지원 언어에서 사용할 수 있습니다.
B2R2는 명령어 파싱, 바이너리 디스어셈블리, 어셈블리, 제어 흐름 복구 및 바이너리 분석을 위한 기타 핵심 구성 요소를 지원합니다. 또한 플랫폼에 구애받지 않는 상태에서 readelf 및 objdump와 유사한 여러 사용자 대상 명령줄 도구를 포함합니다. B2R2는 현재 ELF, PE, Mach-O 및 WebAssembly의 네 가지 바이너리 파일 형식을 지원합니다.
아래 표는 B2R2에서 현재 지원하는 기능을 요약한 것입니다. 일부 영역은 아직 개발 중이며, 기여를 환영합니다. 풀 리퀘스트를 열기 전에 기여 가이드라인을 반드시 읽어주시기 바랍니다.
| CPU | 문서 | 명령어 파싱 | 디스어셈블 | 리프팅 | CFG 복구 | 어셈블리 |
|---|---|---|---|---|---|---|
| x86 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: |
| x86-64 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: |
| ARMv7 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| ARMv8 (AArch64) | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| MIPS32 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| MIPS64 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| EVM | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :new_moon: |
| TMS320C6000 | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |
B2R2는 의도적으로 종속성 풋프린트를 작게 유지하여 빌드를 단순하게 하고, 핵심이 바이너리 분석을 위한 효율적인 알고리즘 및 데이터 구조에 집중할 수 있도록 합니다. 코어 라이브러리에는 외부 종속성이 없으며, 대부분의 외부 라이브러리는 선택 사항이며 특정 구성 요소나 도구에서만 사용됩니다. 다음은 프로젝트에서 사용하는 외부 라이브러리 목록입니다.
문서는 fsdocs로 생성되며, https://b2r2.org/B2R2/에서 확인할 수 있습니다.
B2R2 API를 사용해 보겠습니다.
먼저 DIRNAME이라는 빈 디렉터리를 만듭니다:
mkdir DIRNAME
cd DIRNAME
그런 다음 dotnet 명령줄 도구로 빈 콘솔 프로젝트를 만듭니다:
$ dotnet new console -lang F#
프로젝트에 NuGet 패키지 B2R2.FrontEnd.API를 추가합니다:
$ dotnet add package B2R2.FrontEnd.API
즐겨 사용하는 편집기로 Program.fs 파일을 다음과 같이 수정합니다:
open B2R2
open B2R2.FrontEnd
[<EntryPoint>]
let main argv =
let isa = ISA "amd64"
let bytes = [| 0x65uy; 0xffuy; 0x15uy; 0x10uy; 0x00uy; 0x00uy; 0x00uy |]
let hdl = BinHandle(bytes, isa)
let lifter = hdl.NewLiftingUnit()
let ins = lifter.ParseInstruction 0UL // parse the instruction at offset 0
lifter.LiftInstruction ins |> printfn "%A"
0
dotnet run을 입력하여 실행합니다. 콘솔에서 리프트된 IR 문을 볼 수 있습니다. 끝입니다! 몇 줄의 F# 코드만으로 Intel 명령어를 리프트했습니다.
B2R2 빌드는 간단합니다. .NET 10 SDK 이상을 설치하면 소스 루트에서 빌드할 준비가 완료됩니다.
릴리스 모드로 B2R2를 빌드하려면 dotnet build -c Release를 실행하세요.
디버그 모드로 B2R2를 빌드하려면 dotnet build를 실행하세요.
F# 개발 환경 설정에 대한 자세한 내용은 공식 F# 웹사이트(http://fsharp.org/)를 방문하세요.
B2R2는 KAIST의 SoftSec Lab 연구원들이 KAIST 사이버 보안 연구 센터 (CSRC)와 협력하여 개발했습니다. 전체 기여자 목록은 AUTHORS.md를 참조하십시오.
연구에서 B2R2를 사용하는 경우 다음 논문을 인용해 주시기 바랍니다:
@INPROCEEDINGS{jung:bar:2019,
author = {Minkyu Jung and Soomin Kim and HyungSeok Han and Jaeseung Choi and Sang Kil Cha},
title = {{B2R2}: Building an Efficient Front-End for Binary Analysis},
booktitle = {Proceedings of the NDSS Workshop on Binary Analysis Research},
year = 2019
}
B2R2용 온라인 튜토리얼이 제공되며, B2R2 사용의 기본 사항을 다루고 실습 예제를 제공합니다. 다음 링크에서 확인하세요: https://b2r2.org/tutorial-icst2026/.
다음은 B2R2를 사용하거나 기반으로 한 논문입니다. 귀하의 작업이 포함되어야 한다면 풀 리퀘스트를 열어 주십시오.
| AVR |
| :full_moon: |
| :full_moon: |
| :full_moon: |
| :full_moon: |
| :first_quarter_moon: |
| :new_moon: |
| PA-RISC | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |
| PPC32 | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| SPARC | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| SH4 | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |
| RISC-V | :full_moon: | :full_moon: | :full_moon: | :full_moon: | :first_quarter_moon: | :new_moon: |
| S390 | :full_moon: | :full_moon: | :full_moon: | :new_moon: | :first_quarter_moon: | :new_moon: |