바이너리 디핑을 위한 bindiff 설치 및 사용법
- 리버싱/리버싱
- 2020. 2. 21. 01:46
바이너리 디핑 플러그인으로 bindiff, diaphora가 유명하다. 아마 diaphora보다는 bindiff를 많이 들어봤을 것 같다. 바이너리 디핑은 보통 바이너리의 패치 전후를 비교하거나 추가 취약점 발견을 위해서 많이 사용한다. bindiff 설치 및 사용에 있어서 삽질시간이 상당히 길었기 때문에 설치, IDa Plugin 설정, 사용방법 및 기타 에러 해결과정을 작성한다.참고로 IDA 플러그인으로 사용하는 것은 에러 발생없이 전부 잘됐는데 플러그인으로가 아닌 bindiff 프로그램을 사용하는 것에서 문제가 좀 있었다.
진행 환경은 윈도우10 x64에 파이썬 3.8, 자바 1.8.0_241이고 바이너리는 총 2개를 사용해봤는데 처음엔 바로 될줄 알고 실제 분석 예정이던 netcam arm파일을 하다가 계속 에러가 발생해서 혹시 파일 형식을 좀 타나 싶어서 arm파일 말고 pe파일도 써보느라 인터넷에서 Mp3tag라는 소프트웨어의 구버전과 신버전을 구해서 두개다 사용해보는 방식으로 진행했다. 캡쳐를 하나를 정해놓고 한게 아니라서 arm파일이랑 pefile이랑 왔다갔다하는데 결국은 둘다 bindiff 사용이 정상적으로 되는 것을 확인했으므로 양해해주길 바란다.
설치 및 사용 환경
Windows10 x64, Python3.8, java 1.8.0_241
사용 바이너리
netcam_old / netcam_new (arm)
Mp3tag_V3/ Mp3tab_V284 (pefile)
bindiff plugin 사용 성공
IDA 6.8, IDA 7.0, IDA7.2 / bindiff430, bindiff5
(plugin 사용은 IDA 버전과 bindiff 버전에 상관없이 전부 잘됐음)
bindiff 프로그램 사용 성공
IDA7.2 / bindiff5
bindiff 설치
일단 bindiff 사용을 위해선 사전에 자바와 IDA가 설치되어 있어야 한다. bindiff는 아래 URL에서 다운받을 수 있다.
https://www.zynamics.com/software.html
아무래도 안전성 면에서는 최신버전이 좋을 것 같았지만 설치되어있는 IDA가 6.8버전으로 최신버전은 아니기 때문에 느낌상 bindiff4.3.0이 호환이 잘될 것 같아서 4.3.0버전을 다운받아주었었는데 결국 여러 삽질과정을 거쳐 (주관적으로) 최신버전인 bindiff5를 받는게 가장 안전하다는 결론을 얻었다.
설치과정 중에는 IDA 경로를 입력하는 부분이 있는데 이부분만 제대로 설정해주면 설치는 간단하다.
IDA Plugin으로 bindiff 사용
설치할 때 IDA 경로만 잘 명시해줬다면 아래와 같이 Edit>plugins에서 bindff를 실행시킬 수 있다.
Edit>Plugins>BinDiff5 클릭 후 아래의 Diff Database를 클릭해 비교를 수행할 idb파일을 열어주면 된다. bindiff는 idb 파일을 입력으로 받기 때문에 비교하려는 바이너리의 idb가 생성되어 있어야 한다.
그럼 아래와 같이 Matched Functions 창부터 주르륵 새로운 창들이 생성된다. 대표적으로 "Matched Functions"를 보면 Similarity를 기준으로 유사도가 동일한 함수와 유사도가 다른 함수를 파악할 수 있다. 유사도가 1로 완벽히 동일한 함수의 경우 아래와 같이 연두색으로 나온다.
하지만 패치된 부분을 확인하려면 아무래도 바뀐 함수를 봐야하지 않겠는가. 스크롤을 하단으로 내리면 아래와 같이 유사도가 1 이하인 변경된 함수를 볼 수 있다. 유사도가 떨어지면 떨어질수록 빨간색으로 변하는 것을 볼 수 있다.
하지만 아무래도 플로그인으로 사용하기에는 해당 함수의 어느 위치가 변경됐는지 한눈에 보기가 좀 가독성이 떨어지고 직접 확인을 해봐야 하기 때문에 불편한 면이 없잖아 있다. 이제 아래에서 IDA Plugin이 아닌 bindiff 프로그램을 사용하기 위한 삽질 과정이 시작된다.
bindiff 프로그램 사용
개인적으로 삽질을 해본 결과, bindiff430이 바로가기 속성이 제대로 설정되어 있지 않거나(이건 바로가기 직접 생성 후 파일을 변경해주어 해결) IDA 경로를 제대로 인식하지 못하거나(이건 원래 에러가 없었는데 IDA를 7.0으로 바꾸고 나서 경로를 재입력해주고 나서 갑자기 발생 후 해결못함, bindiff 최신버전으로 재설치하니 해결됨) bindiff64가 빠져있다거나 하는 문제가 있었기에 결국 bindiff 최신버전으로 재설치해주었다.
하지만... 최신버전으로 설치해주고 난 후에도 아래와 같은 무책임한? 에러가 발생했다. "bindiff error, An error occued while diffing. Exit code 1"인데 Exit code 1이라니ㅠㅠ 이러면 문제가 Ida에 있는지 자바 버전이 문제인지 아니면 뭐 경로가 문제인지 해당 파일이 문제인지 등등 알 수가 없다.
일단 bindiff는 최신버전이기에 bindiff 문제는 아니라고 가정하고, 구글링해보니 딱 하나 중국페이지를 찾을 수 있었다. 답변을 번역해보니 'IDA7.2를 사용하거나 다음 IDA7.0 플러그인을 사용하십시오'이다. IDA7.0 플러그인으로는 정상 동작하기에 결국 IDA7.2를 재설치해주었다.
https://bbs.pediy.com/thread-251770.htm
하지만, 7.2 재설치 후에도 아래와 같은 에러가 발생했다. error가 아니라 warning이니까 그냥 OK를 누르면 되지 않을까 하는 기대에 그냥 기다렸다.
그렇게 큰 파일도 아닌데 1시간을....^^;
이건 아닌 것 같아서 끄고 문제가 발생했던 'BinExportBinary' 함수에 대해 알아보던 중, Bindiff5 설치 시 Bindiff5플러그인과 함께 plugin 메뉴에 있는 BinExport 10이 기억났고 이것을 사용해 Export파일을 직접 생성해보기로 했다.
Edit>Plugins>BinExport 10에서 BinExport를 켜준 후 아래의 BinExport V2 Binary Export를 클릭해 Export 파일을 생성할 파일을 선택해주면 다음과 같이 "Exporting database...' 창이 뜨며 Export 파일이 생성된다.
Bindiff에는 총 2개의 파일이 필요하기 때문에 각각 Export 파일을 생성해주었다.
그 후 bindiff에서 다시 두개의 idb파일을 선택해주었는데 아래와 같이 이전에 보지 못했던 뭔가 될것같은 기대감의 창이 떴다.
그리고! 드디어 bindiff 실행화면을 볼 수 있었다. 아래 Matched Functions을 클릭하면 위 IDA Plugin으로 사용했을 때 봤던 유사도를 한눈에 볼 수 있다.
그리고 제일 중요한 기능이라고 할 수 있는게 두개의 함수의 차이점을 시각적으로 보여주는 것인데 위 표 중에서 보고싶은 함수를 더블 클릭하면 된다. 그럼 아래와 같이 베이지블락 단위로 함수의 그래프가 나오고 바뀐 부분을 알 수 있다. 왼쪽이 구버전이고 오른쪽이 신버전인데 빨간색과 파란색 줄로 차이가 있는 코드 부분을 표시해놓았기 때문에 어디가 바뀌었는지 한눈에 보기가 편하다.
이로써 길고 길었던 bindiff 설치 및 삽질 과정을 알아보았다. bindiff를 사용해봤으니 임베디드 카테고리에서 netcam 패치와 관련한 내용과 bindiff 말고 또하나의 유명한 디핑 툴인 diaphora를 IDA Plugin으로 사용하는 방법에 관한 것을 포스팅해보려 한다.
'리버싱 > 리버싱' 카테고리의 다른 글
[원데이 취약점] GOM Player 2.0.12.3375 - '.asx' Local Stack Overflow (0) | 2020.03.11 |
---|---|
IDA 사용법 및 분석 시 유용한 팁 (0) | 2020.03.07 |
PE Viewer 개발 (3) - IMAGE_SECTION_HEADER (0) | 2020.02.11 |
PE Viewer 개발 (2) - IMAGE_NT_HEADERS (0) | 2020.02.09 |
PE Viewer 개발 (1) - IMAGE_DOS_HEADER (0) | 2020.02.09 |