바이너리 분석 플랫폼 B2R2(v0.1.0) 실행만 해본 후기

2019-03-10

B2R2 (v0.1.0) 실행만 해본 후기!

B2R2

카이스트 정보보호대학원에서 ‘IDA를 뛰어넘을 디버거를 개발하고 있다. 이미 어떤 부분에서는 IDA를 뛰어 넘었다’는 이야기를 카이스트 정보보호대학원 설명회에서 들은 이후로 온갖 추측이 난무했습니다. 인공지능을 통해 자동으로 exploit을 해준다거나 java로 개발되서 오픈소스로 풀릴것이라던가 등등..

깃허브에 B2R2 레포지토리(https://github.com/B2R2-org/B2R2) 가 생긴지는 꽤 됐지만(1월 1일) B2R2는 Nuget 패키지로만 접해볼 수 있었고, 실제 소스코드는 NDSS BAR(Binary Analysis Research) 컨퍼런스 발표 하루 전(2월 23일)에 커밋되었습니다. NDSS BAR에서 “B2R2: Building an Efficient Front-Endfor Binary Analysis” 라는 제목으로 발표가 진행되었고, 해당 논문은 최우수 논문으로 선정되었습니다.

최근 바이너리 분석 툴들이 바이너리를 분석하는 절차는 대게 프론트엔드와 백엔드로 구성되어있다고 합니다.

프론트엔드에서 기계어를 해석, 분석하기 용이한 구조(IR(중간언어))로 변환하고 백엔드에서 실제 분석(Symbolic Execution, Taint Tracking 등등)을 진행하는것이죠.

이번 B2R2는 이 프론트엔드에 집중되어있고, 기존의 IR 리프팅 도구들과 비교하면 시간이 2배에서 100배까지도 차이가 난다고 합니다.(관련 기사 : http://www.etnews.com/20181212000318)

0:  65 ff 15 10 00 00 00    call   QWORD PTR gs:[rip+0x10]        # 0x17 

=> (B2R2로 리프팅!)

[|ISMark (0UL,7u);
  Put
    (TempVar (64,0),
     Load
       (Little,64,
        BinOp
          (ADD,64,Var (64,1797,"GSBase",IntelRegisterSet<80000000, 0, 0, 0>),
           Num 0x17:I64,{HasLoad = false;
                         VarInfo = IntelRegisterSet<80000000, 0, 0, 0>;
                         TempVarInfo = set [];},None),
        {HasLoad = true;
         VarInfo = IntelRegisterSet<80000000, 0, 0, 0>;
         TempVarInfo = set [];},None)); Put (TempVar (64,1),Num 0x7:I64);
  Put
    (Var (64,4,"RSP",IntelRegisterSet<10, 0, 0, 0>),
     BinOp
       (SUB,64,Var (64,4,"RSP",IntelRegisterSet<10, 0, 0, 0>),Num 0x8:I64,
        {HasLoad = false;
         VarInfo = IntelRegisterSet<10, 0, 0, 0>;
         TempVarInfo = set [];},None));
  Store (Little,Var (64,4,"RSP",IntelRegisterSet<10, 0, 0, 0>),TempVar (64,1));
  InterJmp (PCVar (64,"RIP"),TempVar (64,0)); IEMark 7UL|]

기존 바이너리 분석 연구들은 Back-end쪽으로 많이 진행되어 왔는데, 이번 B2R2 논문은 프론트엔드의 획기적인 성능 향상에 대해 다룬 논문으로써 가치가 있다고 합니다.

(위 리프팅 과정은 B2R2 깃헙 메인에 Example 항목에서 직접 따라해보실 수 있습니다.)

(논문에 대해서 더 자세하고 정확한 정보를 읽으시려면에서 “B2R2 바이너리 분석 도구 및 논문 리뷰( https://cpuu.postype.com/post/3258254 )“ 를 읽어보시길 바랍니다. 위 어셈블리 코드를 리프팅 하는 과정도 좀 더 자세하게 읽어보실 수 있습니다.)

B2R2 커맨드라인 사용해보기

발표된 B2R2깃헙의 ReadMe의 Features를 살펴보면 현재는 binary parser, lifter, optimizer에 집중된 형태고, Back-end 기능인 Symbolic Executor는 구현은 되었지만 오픈소스로 공개할 계획은 아직 없다고 합니다.

그렇다고 해서 Back-end기능이 아무것도 없는것은 아닙니다.

ROP chain 구성, 자동으로 함수 호출과정을 그래프로 시각화 해주는 기능이 포함되어있습니다. CFG building은 뭔지 잘 모르겠네요.

1. BinExplorer 빌드하기

깃헙에서 B2R2를 클론하신 후에 src/Utilities/BinExplorer 로 들어갑니다.

그리고 dotnet build -c Release 명령어를 통해 빌드해주세요

Microsoft Windows [Version 10.0.17763.316]
(c) 2018 Microsoft Corporation. All rights reserved.

D:\B2R2\src\Utilities\BinExplorer>dotnet build -c Release

빌드가 완료되셨다면 B2R2/src/Utilities/BinExplorer/bin/Release/netcoreapp2.0/ 로 이동하신 뒤에,

dotnet B2R2.Utilities.BinExplorer.dll

를 통해 BinExplorer를 실행할 수 있습니다.

(끼오오오옷!)

[Input Configuration]

-i <file>                    : Specify an input <file>
-a,--isa <ISA>               : Specify <ISA> (e.g., x86) from command line
-r,--base-addr <address>     : Specify the base <address> in hex (default=0)

[Host Configuration]

-p,--port                    : Specify host port <number>

[Logging Configuration]

-l,--log                     : Specify log file <name> (default: B2R2.log)

[Visualization Configuration]

--visual                     : Enable CFG Visualization mode
--loadjson <OPT>             : File name to load CFG json
--dumpjson <OPT>             : File name to dump CFG json (default is ./output.cfg)

[Extra]

--readline                   : Enable readline feature for BinExplorer
-j,--jsondir <OPT>           : Directory name to dump CFG json (do not dump if empty)
-v,--verbose                 : Verbose mode
-h,--help                    : Show this usage

여러가지 바이너리를 시도해봤는데, Win64 실행파일, ELF64 실행파일은 로드에 실패하고,

ELF32 실행파일은 로드를 잘 하더라구요. 디버깅을 해봤는데 ELF64는 바이너리 파일보다 더 크게 파일을 읽으려고 해서 런타임 에러가 났고, Win64는 엔트리가 2개인데 바이너리 파싱을 할 주소가 1개였나? 뭔가 바이너리를 파싱할 주소의 개수가 일치하질 않아서 List 바운더리 에러가 났었는데 정확하게 원인을 알아내진 못했습니다.

제가 불러본 ELF32 바이너리는 Codegate 2016에 등장한 watermelon이라는 문제의 바이너리 입니다.

-i 옵션 뒤에 파일의 경로를 기입해주시면 됩니다.

8282포트로 시각화 그래프를 보여주니, 해당 포트를 사용할 수 있게 비워두시거나, -p 옵션을 통해 다른 포트로 변경하시면 됩니다.

dotnet B2R2.Utilities.BinExplorer.dll -i watermelon

가젯도 잘 찾아주고 함수 리스트, 디스어셈블, 헥스덤프, search 기능들도 잘 작동합니다.

ROP chain compile은 안해봤습니다. 제가 ROP를 할줄 모르거든요.

BinExplorer를 작동시킨 상태로 http://localhost:8282 에 접속해보면

분기를 잘 시각화해줍니다.

시각화는 d3.js로 되어있었습니다.

결론

비록 제가 기대했던것처럼 바이너리를 자동으로 분석해서 퍼징하고 취약점을 찾아내는 툴은 아니였지만, 그렇다고 실망할만한 툴은 절대 아니었습니다. 이 Front-end 툴을 이용해서 어떻게 하면 신박한 Back-end툴을 만들어볼 수 있을지 여러가지 고민을 해보고 싶네요.

이만 B2R2 실행만 해본 후기를 마치도록 하겠습니다. 혹시 바이너리 실행 오류를 해결할 줄 아시는분은 덧글로 알려주세요!