블로그 이전했습니다. https://jeongzero.oopy.io/
Bindiff 상세 기능 조사
본문 바로가기
보안/Reversing

Bindiff 상세 기능 조사

728x90

목차


  1. Bindiff 소개
  1. Bindiff 이해
  1. 핵심기능

1. Bindiff 소개

 

no open source(지금도..?). 해당 툴은 C++로 초기에 개발되었으며 GUI는 자바로 만들어짐. 2003년에 이 툴로 블랙햇에서 발표를 진행했으며 인기를 끌었다. 지금 디핑 툴에서 가장 선호도 있는 툴로 자리잡은 이유는, 분석을 시각화 해주었기 때문이라고 함. 하지만 초기부터 GUI를 지원한 것은 아니였음. 

 

구글이 인수하기 전 

  • Version 1.6 특징(초기버전)
    1. 그래프 동형사상은 재귀함수, 명령어 레벨, 문자열, 뿐만 아니라 휴리스틱에 기반을 두었음
    1. 초창기에는 GUI가 없었고, 단지 2개의 WinGraph를 런칭했음
    1. 데이터베이스가 간의 함수이름을 포팅하는(명명?) 기능이 있음

     

  • Version 2.0, 2.1 특징
    1. 2.0, 2.1 버전에서 처음으로 GUI가 나옴. 리눅스 용이였음

     

  • Version 3.0-3.2
    1. IDA에 플러그인 형식으로 지원되기 시작하였고, 맥OS 지원 시작

     


 

구글이 인수 한 후 

외적인 이유에 직면하여 BinDiff 개발이 잠깐 중단되었음. 

 

  • Version 4.0
    1. 버전 4.0에는 다른 많은 새로운 기능 중에서 Call Graph(CG), incremental, IDA 주석 가져 오기 및 incremental diffing이 추가되었다

     

  • Version 4.1-4.3
    1. 버전 4.1 ~ 4.3은 MacOSX에 대한 지원을 삭제하고, 다시 추가하고 더 많은 아키텍처를 추가했으며 Public을 하긴 했지만 20프로 정도 밖에 접근이 불가능했음

       

  • Version 5
    1. 2019년에 출시됨

     

 


 

2. BinDiff 이해

 

구체적인 어셈블리 명령을 무시하고, 실행의 추상적인 구조에서 동작함. 

두 바이너리의 유사도를 분석하는 알고리즘은

Function Matching 15개 , Basic Block Matching 18

가 있다. 각각의 알고리즘은 성능과 매칭 정확도가 확인 가능하다 

 

Initial matches

  • 베이직 블록 개수
  • 베이직 블록과 블록 사이의 선 (엣지)
  • 하위 함수 호출 횟수

 

**** 아래의 모든 설명은 A와 B의 유사도를 측정하는 것으로 설명하겠음 

💡
오른쪽 사진에서 베이직 블록 들 간의 선을 '엣지'라그럼

 

초기에 두 개의 실행파일에 대한 두 세트(A,B)의 시그니쳐가 만들어지면(위의 3개의 특성을 기준으로), 각 실행파일에서 생성된 시그니처를 기반으로, 초기 일치 항목이 작성된다. 이게 어떻게 작성되냐면 시그니처들의 하위 속성들을 비교하면서 일치하는게 생기면 일치한다고 작성한다. 

 

이 단계 후에는 call graphs (함수 사이의 call-to 관계에 대한 정보가 포함 된 그래프)를 사용하여 더 많은 일치 항목을 생성한다. 이러한 하위 집합은 모든 함수 집합보다 훨씬 작기 때문에 새로운 고유 한 일치 항목을 찾는 가능성이 훨씬 높다. 이 프로세스는 새로운 일치 항목을 찾을 수 없을 때까지 반복된다. 

 


 

일반적인 매칭 전략

 

BinDiff에는 일치되는 항목을 생성하기위한 함수 속성 목록이 있다. 해당 바이너리의 모든 함수를 고려한뒤, 전역수준에서 시작하여 모든 함수의 첫번째 특징을 계산한다. 이를 통해 나올 수 있는 결과는 다음과 같다.

 

  • 해당 속성은 두 A,B 바이너리에서 모두 고유하다. =⇒ 함수 일치
  • 해당 속성은 두 A,B 바이너리에서 여러번 나타남 =⇒ 일치하는 내용이 애매함.
    1. Drill Down 실시(더 자세히 분석하다라는 뜻)

      해당 속성에 대해 일치하는 기능 세트만 고려함.  

  • A,B 두 바이너리에서는 해당 속성이 일치하지 않는다.

 

 

초기 매칭 이후에 각 caller와 callee들을 고려한다. BinDiff는 위에서 설명한 드릴 다운 단계를 수행하여 Caller와 Callee의 함수를 매칭시켜 확인한다. 마지막으로 BinDiff는 새로 일치 된 모든 함수에 대해서 베이직 블록의 일치여부를 판별하고, 일치하는 베이직 블록에서 호출 된 함수가 매칭되는지 확인한다. 

 

이것으로 하나의 속성에 대한 매칭 여부를 마친다. 다음 속성을 사용하여 나머지 일치하지 않는 함수에서 해당 프로세스가 다시 실행된다. 

 


 

💡
구체적인 어셈블리 명령을 무시하고, 실행의 추상적인 구조에서 동작함.
💡
두 바이너리의 유사도를 분석하는 알고리즘은 Function Matching 15개, Basic Block Matching 18 가 있다. 각각의 알고리즘은 성능과 매칭 정확도가 확인 가능하다

 

 

  • 함수 매칭
  • 베이직 블록 매칭

 


 

함수 매칭

함수 속성은 두 가지 방법 중 하나로 사용된다. 함수별 또는 엣지마다. 소스 및 대상 함수 속성이 일치하는 경우 에지 일치는 에지 (호출 그래프의 호출을 나타내거나 플로우 그래프에서 점프)를 일치시킨다. 따라서 에지 매칭은 더 강력한 기준이며 일반적으로 더 나은 매칭을 제공한다.  

 

그러나 그래프에서 베이직 블록 당 많은 엣지를 가질 수 있기 때문에 (엣지 수가 종종 블록 수에서 직선적으로 증가하는 콜 그래프의 경우 특히 그렇습니다) 엣지 매칭 방법은 잠재적으로 매우 느릴 수 있다. 특정 바이너리에 대한 성능 문제가 발생하면 먼저 엣지 매칭 기반 알고리즘을 비활성화해야 한다. 

 

 

결과 일치의 정확도에 따른 함수 매칭 알고리즘 종류들

 

  1. 해시 매칭
    • 함수의 바이트 단위의 해시를 기반으로 일치성 판별. 따라서 이 알고리즘과 일치하는 두 함수는 바이트 수준에서 동일해야

      — 일치 정확성 : 아주 좋음 

      — 알고리즘 성능 : 매우 좋음 


       

     

  1. 이름 해시 매칭
    • 이름의 해시를 기반으로 함수를 찾는다. 여기서 말하는 이름은 디스어셈블러에 의해 자동으로 생성된 이름을 뜻함. 즉 바이너리에 실제 본문이 없는 함수와 일치 할 수 있는 지 몇 안되는 알고리즘 중 하나.

      — 일치 정확성 : 아주 좋음 

      — 알고리즘 성능 : 매우 좋음 


       

  1. 엣지 흐름도 MD 인덱스
  1. 엣지 CG MD 인덱스
  1. MD 인덱스 일치
  1. prime 시그니처 일치
  1. MD 인덱스 일치
  1. 엣지 근첩 MD 인덱스 일치
  1. 주소 순서 일치

 

  1. 문자열 참조 일치
    • 참조된 문자열 데이터를 기반으로 함수를 일치판명함. 문제의 함수에서 참조 된 모든 문자열은 결합된 해시에 삽입되며, 이후 하나 이상의 문자열이 참조되는 경우 일치하는 속성으로 판명함.

      — 일치 정확성 : 중간 

      — 알고리즘 성능 : 매우 좋음 


     

  1. 루프 카운트 매칭
    • 루프 수에 따라 함수 일치 판명.

      — 일치 정확성 : 안좋음 

      — 알고리즘 성능 : 매우 좋음 


       


 

Basic Block 매칭

CFG에서 베이직 블록 매칭은 알고리즘적으로 위의 함수 매칭과 매우 유사함.  

 

  1. edges prime product
    • 소스 코드 및 대상의 베이직 블록의 주요 product가 일치하면 일치한다고 판단함. 따라서 두 기본 블록 모두 동일한 명령어를 포함함

      일치 정확성 : 아주 좋음

       


       

  1. hash matching (최소 4개의 명령어)
    • 베이직 블록은 바이트 단위의 이진 해시 값을 기반으로 측정됨. 4개 이상의 명령어가 있는 베이직 블록에서만 사용됨.

      일치 정확성 : 아주 좋음

       


       

  1. 호출 참조 매칭
    • 베이직 블록에서 하나 이상의 함수를 호출할 때, 호출 된 함수가 일치하면 일치한다고 판명

      일치 정확성 : 아주 좋음

       


       

  1. 문자열 참조 매칭
    • 베이직 블록은 하나 이상의 문자열을 참조하고, 해당 문자열이 두 바이너리 모두에서 동일한 경우 일치한다고 판명.

    일치 정확성 : 아주 좋음

     


     

  1. prime matching(최소 4개의 명령어)
  1. call reference matching

 


 

Confidence/Similarity

 

BinDiff에서 표시되는 유사성 및 정확성의 지표는 어떠한 함수로 부여된 가중치를 이용하여 평균 알고리즘 신뢰도에 대한 수치가 표시된다. 가중치에 대한 부여 기준은 다음과 같다. 

 

  • 함수의 유사성 판단 기준 가중치 값

 

  • 전체 바이너리 유사성 판단 기준 가중치 값

 

 


 

3. 핵심기능

 

다른 툴에 비해서 환경 구성 및 사용이 편하다는 장점이 있다. 

 

사용 방법

  1. 비교할 exe 파일 아무거나 로드

    ex) Bindiff1.exe 파일 업로드  - 맨 아래에 있음

    (Load resources 옵션 추가하면 좋고 exe 파일 안올라가서 txt로 올림. 다운받고 exe로 바꾸셈) 

     

     

  2. 실행되면 해당 파일을 idb로 저장해야함.

    저장하면 .i64 파일이 생성됨. 32비트는 .idb로 저장되고 64비트는 .i64로 저장됨 

     

     

  1. 이제 비교할 바이너리를 다시 ida로 로드시키여함

    (비교대상 : Bindiff3.exe) — 이것도 다운받고 exe로 변경해야함 - 맨아래에 있음

  2.  

     

     

  1. 왼쪽 상단의 edit 탭에서 plugins를 선택하고 bindiff5 선택

    그러면 BinDiff 5라고 착은 창이 뜨는데 거기서 Diff Database를 클릭하고 아까 위에서 저장한 idb(i64) 파일을 클릭함 

    • 이 과정의 의미는 exe 파일 두개 자체로 비교를 하는 것이 아닌 idb 파일로 비교해야하기 때문에 그런것임. 쨋든 아까 저장한 idb 파일을 선택하면 bindiff가 실행되고 결과를 볼 수 있음

     

  1. Bindiff 실행 결과
  • 주요하게 볼 것이 파란색으로 칠한 Matched Functions 탭임. 해당 탭을 확대해서 보면 위에서 설명한 함수 매칭 알고리즘 및, 베이직 블록 매칭 알고리즘을 사용해서 결과가 다나옴. 직접 확인하면 좋을 듯
  • 만약 원하는 블록에 대한 flow chart를 보고 싶으면 우클릭 후 flow graph 보기를 누르면 bindiff 자체 프로그램이 실행되고, 다음의 그림이 실행됨

 

파란 색 글씨를 보면 두 바이너리의 메인함수를 비교한 것을 확인 할 수 있음. 

 

참고자료

Bindiff1.txt
0.01MB
Bindiff3.txt
0.01MB

 

728x90

'보안 > Reversing' 카테고리의 다른 글

리버싱 기초 with 어셈블리종류  (0) 2020.05.05
라이플캠페인 보고서 개인요약  (0) 2020.05.05
RTL 기법 파헤치기  (8) 2019.05.19
스택의 구조  (2) 2019.05.10
인텔 8086 메모리 구조  (0) 2019.05.10