목차
- Bindiff 소개
- Bindiff 이해
- 핵심기능
1. Bindiff 소개
no open source(지금도..?). 해당 툴은 C++로 초기에 개발되었으며 GUI는 자바로 만들어짐. 2003년에 이 툴로 블랙햇에서 발표를 진행했으며 인기를 끌었다. 지금 디핑 툴에서 가장 선호도 있는 툴로 자리잡은 이유는, 분석을 시각화 해주었기 때문이라고 함. 하지만 초기부터 GUI를 지원한 것은 아니였음.
구글이 인수하기 전
- Version 1.6 특징(초기버전)
- 그래프 동형사상은 재귀함수, 명령어 레벨, 문자열, 뿐만 아니라 휴리스틱에 기반을 두었음
- 초창기에는 GUI가 없었고, 단지 2개의 WinGraph를 런칭했음
- 데이터베이스가 간의 함수이름을 포팅하는(명명?) 기능이 있음
- Version 2.0, 2.1 특징
- 2.0, 2.1 버전에서 처음으로 GUI가 나옴. 리눅스 용이였음
- Version 3.0-3.2
- IDA에 플러그인 형식으로 지원되기 시작하였고, 맥OS 지원 시작
구글이 인수 한 후
외적인 이유에 직면하여 BinDiff 개발이 잠깐 중단되었음.
- Version 4.0
- 버전 4.0에는 다른 많은 새로운 기능 중에서 Call Graph(CG), incremental, IDA 주석 가져 오기 및 incremental diffing이 추가되었다
- Version 4.1-4.3
- 버전 4.1 ~ 4.3은 MacOSX에 대한 지원을 삭제하고, 다시 추가하고 더 많은 아키텍처를 추가했으며 Public을 하긴 했지만 20프로 정도 밖에 접근이 불가능했음
- 버전 4.1 ~ 4.3은 MacOSX에 대한 지원을 삭제하고, 다시 추가하고 더 많은 아키텍처를 추가했으며 Public을 하긴 했지만 20프로 정도 밖에 접근이 불가능했음
- Version 5
- 2019년에 출시됨
- Bindiff 메뉴얼
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 바이너리에서 여러번 나타남 =⇒ 일치하는 내용이 애매함.
- Drill Down 실시(더 자세히 분석하다라는 뜻)
해당 속성에 대해 일치하는 기능 세트만 고려함.
- Drill Down 실시(더 자세히 분석하다라는 뜻)
- A,B 두 바이너리에서는 해당 속성이 일치하지 않는다.
초기 매칭 이후에 각 caller와 callee들을 고려한다. BinDiff는 위에서 설명한 드릴 다운 단계를 수행하여 Caller와 Callee의 함수를 매칭시켜 확인한다. 마지막으로 BinDiff는 새로 일치 된 모든 함수에 대해서 베이직 블록의 일치여부를 판별하고, 일치하는 베이직 블록에서 호출 된 함수가 매칭되는지 확인한다.
이것으로 하나의 속성에 대한 매칭 여부를 마친다. 다음 속성을 사용하여 나머지 일치하지 않는 함수에서 해당 프로세스가 다시 실행된다.
- 함수 매칭
- 베이직 블록 매칭
함수 매칭
함수 속성은 두 가지 방법 중 하나로 사용된다. 함수별 또는 엣지마다. 소스 및 대상 함수 속성이 일치하는 경우 에지 일치는 에지 (호출 그래프의 호출을 나타내거나 플로우 그래프에서 점프)를 일치시킨다. 따라서 에지 매칭은 더 강력한 기준이며 일반적으로 더 나은 매칭을 제공한다.
그러나 그래프에서 베이직 블록 당 많은 엣지를 가질 수 있기 때문에 (엣지 수가 종종 블록 수에서 직선적으로 증가하는 콜 그래프의 경우 특히 그렇습니다) 엣지 매칭 방법은 잠재적으로 매우 느릴 수 있다. 특정 바이너리에 대한 성능 문제가 발생하면 먼저 엣지 매칭 기반 알고리즘을 비활성화해야 한다.
결과 일치의 정확도에 따른 함수 매칭 알고리즘 종류들
- 해시 매칭
- 함수의 바이트 단위의 해시를 기반으로 일치성 판별. 따라서 이 알고리즘과 일치하는 두 함수는 바이트 수준에서 동일해야
— 일치 정확성 : 아주 좋음
— 알고리즘 성능 : 매우 좋음
- 함수의 바이트 단위의 해시를 기반으로 일치성 판별. 따라서 이 알고리즘과 일치하는 두 함수는 바이트 수준에서 동일해야
- 이름 해시 매칭
- 이름의 해시를 기반으로 함수를 찾는다. 여기서 말하는 이름은 디스어셈블러에 의해 자동으로 생성된 이름을 뜻함. 즉 바이너리에 실제 본문이 없는 함수와 일치 할 수 있는 지 몇 안되는 알고리즘 중 하나.
— 일치 정확성 : 아주 좋음
— 알고리즘 성능 : 매우 좋음
- 이름의 해시를 기반으로 함수를 찾는다. 여기서 말하는 이름은 디스어셈블러에 의해 자동으로 생성된 이름을 뜻함. 즉 바이너리에 실제 본문이 없는 함수와 일치 할 수 있는 지 몇 안되는 알고리즘 중 하나.
- 엣지 흐름도 MD 인덱스
- 엣지 CG MD 인덱스
- MD 인덱스 일치
- prime 시그니처 일치
- MD 인덱스 일치
- 엣지 근첩 MD 인덱스 일치
- 주소 순서 일치
- 문자열 참조 일치
- 참조된 문자열 데이터를 기반으로 함수를 일치판명함. 문제의 함수에서 참조 된 모든 문자열은 결합된 해시에 삽입되며, 이후 하나 이상의 문자열이 참조되는 경우 일치하는 속성으로 판명함.
— 일치 정확성 : 중간
— 알고리즘 성능 : 매우 좋음
- 참조된 문자열 데이터를 기반으로 함수를 일치판명함. 문제의 함수에서 참조 된 모든 문자열은 결합된 해시에 삽입되며, 이후 하나 이상의 문자열이 참조되는 경우 일치하는 속성으로 판명함.
- 루프 카운트 매칭
- 루프 수에 따라 함수 일치 판명.
— 일치 정확성 : 안좋음
— 알고리즘 성능 : 매우 좋음
- 루프 수에 따라 함수 일치 판명.
Basic Block 매칭
CFG에서 베이직 블록 매칭은 알고리즘적으로 위의 함수 매칭과 매우 유사함.
- edges prime product
- 소스 코드 및 대상의 베이직 블록의 주요 product가 일치하면 일치한다고 판단함. 따라서 두 기본 블록 모두 동일한 명령어를 포함함
—
일치 정확성 : 아주 좋음
- 소스 코드 및 대상의 베이직 블록의 주요 product가 일치하면 일치한다고 판단함. 따라서 두 기본 블록 모두 동일한 명령어를 포함함
- hash matching (최소 4개의 명령어)
- 베이직 블록은 바이트 단위의 이진 해시 값을 기반으로 측정됨. 4개 이상의 명령어가 있는 베이직 블록에서만 사용됨.
—
일치 정확성 : 아주 좋음
- 베이직 블록은 바이트 단위의 이진 해시 값을 기반으로 측정됨. 4개 이상의 명령어가 있는 베이직 블록에서만 사용됨.
- 호출 참조 매칭
- 베이직 블록에서 하나 이상의 함수를 호출할 때, 호출 된 함수가 일치하면 일치한다고 판명
—
일치 정확성 : 아주 좋음
- 베이직 블록에서 하나 이상의 함수를 호출할 때, 호출 된 함수가 일치하면 일치한다고 판명
- 문자열 참조 매칭
- 베이직 블록은 하나 이상의 문자열을 참조하고, 해당 문자열이 두 바이너리 모두에서 동일한 경우 일치한다고 판명.
—
일치 정확성 : 아주 좋음
- prime matching(최소 4개의 명령어)
- call reference matching
Confidence/Similarity
BinDiff에서 표시되는 유사성 및 정확성의 지표는 어떠한 함수로 부여된 가중치를 이용하여 평균 알고리즘 신뢰도에 대한 수치가 표시된다. 가중치에 대한 부여 기준은 다음과 같다.
- 함수의 유사성 판단 기준 가중치 값
- 전체 바이너리 유사성 판단 기준 가중치 값
3. 핵심기능
다른 툴에 비해서 환경 구성 및 사용이 편하다는 장점이 있다.
사용 방법
- 비교할 exe 파일 아무거나 로드
ex) Bindiff1.exe 파일 업로드 - 맨 아래에 있음
(Load resources 옵션 추가하면 좋고 exe 파일 안올라가서 txt로 올림. 다운받고 exe로 바꾸셈)
- 실행되면 해당 파일을 idb로 저장해야함.
저장하면 .i64 파일이 생성됨. 32비트는 .idb로 저장되고 64비트는 .i64로 저장됨
- 이제 비교할 바이너리를 다시 ida로 로드시키여함
(비교대상 : Bindiff3.exe) — 이것도 다운받고 exe로 변경해야함 - 맨아래에 있음
-
- 왼쪽 상단의 edit 탭에서 plugins를 선택하고 bindiff5 선택
그러면 BinDiff 5라고 착은 창이 뜨는데 거기서 Diff Database를 클릭하고 아까 위에서 저장한 idb(i64) 파일을 클릭함
- 이 과정의 의미는 exe 파일 두개 자체로 비교를 하는 것이 아닌 idb 파일로 비교해야하기 때문에 그런것임. 쨋든 아까 저장한 idb 파일을 선택하면 bindiff가 실행되고 결과를 볼 수 있음
- Bindiff 실행 결과
- 주요하게 볼 것이 파란색으로 칠한 Matched Functions 탭임. 해당 탭을 확대해서 보면 위에서 설명한 함수 매칭 알고리즘 및, 베이직 블록 매칭 알고리즘을 사용해서 결과가 다나옴. 직접 확인하면 좋을 듯
- 만약 원하는 블록에 대한 flow chart를 보고 싶으면 우클릭 후 flow graph 보기를 누르면 bindiff 자체 프로그램이 실행되고, 다음의 그림이 실행됨
파란 색 글씨를 보면 두 바이너리의 메인함수를 비교한 것을 확인 할 수 있음.
참고자료
'보안 > Reversing' 카테고리의 다른 글
리버싱 기초 with 어셈블리종류 (0) | 2020.05.05 |
---|---|
라이플캠페인 보고서 개인요약 (0) | 2020.05.05 |
RTL 기법 파헤치기 (8) | 2019.05.19 |
스택의 구조 (2) | 2019.05.10 |
인텔 8086 메모리 구조 (0) | 2019.05.10 |