STUDY

x64dbg로 프로그램 따라가기

MALWARE
Author
gleaming
Date
2021-08-15 20:47
Views
624

본 글은 "x64dbg 디버거를 활용한 리버싱과 시스템 해킹의 원리" 책으로 공부한 후 정리한 글입니다.


x64dbg의 사용법을 알아보기 위해 간단한 예제 프로그램을 만들어 디버깅을 시작해보자.

먼저 "HelloWorld.exe"라는 이름의 실행 파일을 만들었다.

소스 코드는 다음과 같다.

1
2
3
4
5
6
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL"Hello World!!""Welcome Message", MB_OK);
    return 0;
}
cs





디버깅 시작하기

x32dbg.exe를 연다.

[F3] or 파일-열기를 통해 HelloWorld.exe 파일을 불러온다.

설정에서 진입점 중단점만 설정해두어서, 실행 파일을 불러왔을 때 실행 막대가 EntryPoint에서 멈춰져 있다.

CPU 탭에는 각각 명령어 포인터, 명령어 주소, 명령어 코드, 어셈블리어, 설명(사용자 주석, 레이블, 사용된 메모리 주소)을 보여준다.





명령어 실행하기

디버깅의 진행은 분석이 필요한 코드를 찾아가고, 그 코드의 의미를 파악하는 것이다.

코드의 진입점(Entry Point)부터 코드를 차례로 진행해본다.

👉🏻 한 줄씩 실행

  • [F7] : (명령어 Call 위에서) Call 함수의 내부로 따라 들어가 수행한다.(함수가 무슨 동작을 하는지 궁금할 때)
  • [F8] : (명령어 Call 위에서) Call 함수를 하나의 명령어처럼 수행한다.



👉🏻 특정 위치까지 실행

  • [F9] : 디버거 내에서 중단점(Break Point)까지 프로그램을 실행한다.
     임의의 지점까지 실행하고 싶다면, [F2] 키를 이용하여 중단점을 설정하면 된다.
     임시적으로 프로그램 코드의 어떤 지점까지 실행하고 싶다면, [F4] 키를 이용하여 그 지점까지 실행할 수 있다.
     [F7] 키로 진행 후 더 이상 분석할 필요가 없다면, [Ctrl+F9] 키를 사용하여 함수 끝(명령어 RETN 위치)까지 실행하여 함수를 벗어날 수 있다.
     처음부터 다시 진행하면서 살펴보고 싶다면, [Ctrl+F2] 키를 사용하여 재시작을 하면 된다.
     자세한 설명은 책 62p를 참고하기




베이스 캠프 설정하기

디버깅을 하다 보면 분석하는 데 오랜 시간이 걸리는 경우가 많아 휴식을 취하고 다음에 이어서 할 필요가 있다.

디버깅을 다시 시작하는 지점을 베이스캠프(base camp)라 한다.

👉🏻 중단점 설정하기 [F2]

  • 제일 많이 사용하는 방법! 프로그램을 다시 시작하더라도 해당 지점에서 멈추게 할 수 있다.
  • [F2] 키를 통해 중단점을 설정할 수 있고(주소 부분 빨개짐), 중단점 탭에서 확인이 가능하다. [Del] 키를 통해 삭제할 수 있다.


👉🏻 레이블(label) 달기 [:]

  • 원하는 주소에서 [:] 키를 눌러 레이블을 달 수 있다. (설명란에 빨간 글씨로)
  • 레이블을 참조하는 주소를 찾는 기능도 있다. (참조 찾기-선택한 주소)


👉🏻 주석(comment) 달기 [;]

  • 원하는 위치에 [;] 키를 눌러 주석을 달 수 있다. (설명란에 검정 글씨로)
  • 주석과 레이블은 검색하여 찾아볼 수 있다. (보기-주석/레이블)


👉🏻 주소로 직접 이동하기 [Ctrl+G]

  • 이 방법을 사용하기 위해서는 중요한 주소를 메모장이나 노트에 기록해두어야 한다.
  • [Ctrl+G] 키를 이용해 원하는 위치로 바로 이동할 수 있다. (주소 찾아가기)



  1. [F8] 키로 한 줄씩 코드 실행
  2. 원하는 코드를 찾으면, 그 앞에 [F2] 키로 Break Point 설정
  3. [Ctrl+F2] 키로 다시 시작
  4. [F9] 키로 중단점까지 실행
  5. [F7] 키로 원하는 기능이 있는 코드로 진입