본문 바로가기

사용기 및 분석/소프트웨어

IDA 를 쓸 수 없다면, x64dbg !

 회사에서나, 집에서나 컴파일러에서 디버깅을 다 했다고 생각 했는데, 막상 다른 환경으로 돌려 보거나 하면 기대하지 못한 오류를 겪게 되는 경우가 있습니다. ( 예를 들어 흔히 보는 0xCxxxxxxx .. exception fault ? ) 그런 경우 원인을 찾아 내기 위해 별도의 독립형 디버깅 프로그램을 사용해야 하는 경우가 있는데, 저의 경우는 WinDBG 를 사용해 왔었습니다. 하지만 이 WinDBG 의 경우 M$ 에서 이에 대한 지원을 끊은 상태이기 때문에 앞으로 계속 사용이 어려울 뿐더러, 이젠 구하기도 어렵다는 단점이 있습니다.

 이를 해결 하기 위해서는 고성능 Debugger 인 IDA 같은 것을 쓸 수도 있겠지만, 개인이 이런 비싼 디버거를 불법적인 방법을 통하지 않고 쓰기엔 부담이 크다고 보입니다. 그래서 선택 할 수 있는 방법은 바로 x64bdg 가 있습니다.



 x64dbg 는 다음과 같은 기능을 지원 합니다.


  • 직관적이고 익숙하면서도 새로운 사용자 인터페이스

  • C 언어 문법 형태의 파저

  • TitanEngine 을 통한 DLL 과 EXE 의 모든 디버깅 기능 포함

  • IDA 와 같은 형태의 사이드바와 이동 화살표 표시

  • IDA 와 같은 명령어 토큰 표시 (하이라이트 레지스터 등)

  • 메모리 맵

  • 심볼 보기

  • 쓰레드 보기

  • 소스 코드 보기

  • 내용에 충실한 레지스터 보기

  • 마음대로 바꿀수 있는 컬러 스킴

  • 동적으로 인지되는 모듈과 문자열

  • 리콘스트럭터 추출 포함(Scylla)

  • 빠른 디스어셈블러(Capstone)

  • 커멘트나 레이블, 북마크 등을 위한 사용자 데이터베이스 (JSON)

  • 그로윙 API 를 위한 플러그인 지원

  • 자동화를 위한 확장및 디버깅이 가능한 스크립트 지원

  • 여러 형태로 메모리 덤프

  • Basic debug symbol (PDB) 지원

  • 동적 스택 보기

  • 내장 어셈블러 (XEDParse/Keystone/asmjit)

  • 실행 패치

  • Yara Pattern 매칭

  • Snowman 디컴파일러

  • 분석

 위 기능은 실제 IDA 에서도 그리 다 쓰이지 않는 것임에도, 충실히 오픈소스로 다 구현을 해서 올려지고 있습니다. 또한 오픈소스 이다보니 능력이 되면 참여도 할 수 있고, 사용자는 감사한 마음으로 기부를 할 수 도 있습니다.


실행 및 사용

 x64dbg 는 설치 파일을 제공하지 않습니다. 디버깅을 하는 개발자 정도 되는 입장이라면 사실 이런 설치본이 무슨 의미가 있겠는가 하겠지만, 그냥 Source Forge 의 x64dbg 에 방문 하여 최신 릴리즈판을 받고, 이를 어딘가에 풀어 사용할 준비를 마치면 됩니다. release 폴더 안에 있는 x96dbg.exe 를 최초 구동 하면 아래 이미지 처럼 작은 윈도우가 뜨면서 부터 시작을 할 수 있게 됩니다.



 만약 최초 실행 이라면 Setup 을 클릭 하여 탐색기 컨텍스트 메뉴에 등록을 하거나, 하위 디버거 설정 등을 할 수 있으며, 바로 디버깅을 시작 하려면 자신이 디버깅을 하려는 PE 바이너리의 포맷에 맞게 x32 나 x64 중 하나를 구동 하면 됩니다. (x96 = x32 + x64 ...)


 처음 구동 화면은 아래와 같이 뜨며, IDA 에 익숙한 사용자들을 위해 꽤 잘 다듬어 진 상태로 만들기 위해 노력한 모습이 절절 합니다. 물론 GUI 는 QT 를 사용하고 있습니다.



 사용은 간단히 IDA 에서 하듯, 디버깅 할 DLL 이나 EXE 등을 끌어다 프로그램 윈도우 위에 놓으면 됩니다. 꽤 빠른 속도로 재 해석된 어셈블러 코드들로 바로 볼 수 있으며, 자동으로 문자열이나 현재 진입점 등을 어셈블러 명령 오른편에서 표시 해 주게 됩니다.



 물론 디버깅을 위한 프로그램이기 때문에, 디버깅 포인트를 직접 걸 수 있음은 물론, 디버깅 중, ds:[주소] 내에 적재 되어 있는 문자열 셋도 참조로 바로 확인이 가능한 부분이 있기 때문에 여러모로 뜯어 볼 수 있는 편리함을 기본으로 제공 합니다. 물론 좀 더 명확한 형태로는 IDA 를 능가하지 못하는 부분이 많이 있긴 합니다만 Windows 의 64bit PE 를 디버깅 하는데 있어서는 이거라도 있고 없고는 릴리즈 된 상태의 이미지를 디버깅 하는데 그리 많은 방법이 있지 않다는 점 입니다. (IDA Free 도 64bit PE 를 디버깅 할 수는 없는걸로 알고 있습니다)



 만약 DLL 을 디버깅 하거나 할때, exported symbol 과 같은 형태 추척, 또는 각 symbol 구동 형태는 물론, 의도한 대로 최적화가 되었는지 등을 검증 하는 방법으로도 꽤 괜찮은 툴로 쓰일수 있습니다.



 다만, 내장된 Snowman 은 제가 사용 방법을 알지 못해서 인지 어쩐지, 바로 코드가 뜨지 않고 그 방법도 알지 못하여 따로 stand-alone (독립) 버젼으로 존재하는 것을 쓰는걸로 만족 했어야 했습니다.


 Snowman 독립 버젼의 경우는 같은 QT 로 만들어 졌으나, xt64dbg 처럼 드래그 드롭으로 바로 역컴파일을 할 수는 없고, 메뉴의 파일 열기로만 이미지를 로드 하여, 역컴파일을 하게 됩니다. 실제 제작자의 예제 페이지 를 확인 해 보면 꽤 근사하게 볼수 있을것 처럼 뜨지만, MinGW-W64 6. 이상의 버젼으로 만들어진 이미지는 아쉽게도 동일한 코드를 가지고 빌드를 해도 여러 요소들이 더 포함되는지라 예제의 코드처럼 분석이 되지 않는것은 아쉬운 부분 입니다.


예를 들어 아래처럼 코드를 만들고 ...


이를 다음 Makefile 처럼 디버깅 정보까지 넣어 빌드를 하고,


Snowman 에서 열어 본다 한들, 가장 이상적인 형태로 main 이 다음처럼 구동되게 바뀌어 있습니다.


이것이 디버깅이나, 리버스 엔지니어링의 어려움 이겠지만, 차차 익숙해 지면 어렵지 않게 내가 원하는 코드를 얻을 수 있는 위치에 오르지 않을까 합니다. 그나마 어셈블러를 C++ 정도로 재구성 해 주는 수준일지 모르지만, 어셈블러 레지스터들이 뭘 하는지 모르는 사람의 입장에서 그냥 손가락이나 빨고 멍하게 보고 있어야 하는 수준 보다는 매우 나은 형태로 나와 주기 때문에 (물론 왼편에 어셈블러 그대로 뜹니다만) 어셈블러 코드 학습에도 도움이 되지 않을까 합니다.