Fascination
article thumbnail

Reversing Engineering - 4. x64dbg


1. x64dbg 사용법

# x64dbg

- 윈도우 디버거

-  UI나 기능 등 많은 면에서 ollydbg를 닮았으며, ollydbg는 소스 코드가 공개되어 있지 않고 32비트만 지원하는데 반해 x64dbg는 오픈소스이고 32비트와 64비트를 둘 다 지원

- 강력한 디스어셈블 엔진을 가지고 있으며 그래프 뷰, 플러그인 등 리버싱에 있어서 편리한 여러가지 기능들이 내장되어 있음

ollydbg와 x64dbg

 

 

# x64dbg의 사용법 - 기본적인 UI

- x64dbg의 상단바

x64dbg의 상단바

1. 분석할 프로그램을 열음

2. 프로그램을 재시작함

3. 프로그램을 완전히 정지

4. 프로그램을 실행(재개)함

5. 프로그램을 일시정지 시킴. 실행중인 상태에서 임의로 중단시키고 싶을 때 사용

6. 어셈블리 코드를 한 줄 실행. 만약 call을 실행하려 하면 call한 함수 내부로 진입. (step into)

7. 어셈블리 코드를 한 줄 실행. 만약 call을 실행하려 하면 call한 함수가 ret명령어를 실행할 때까지(리턴할 때까지) 실행한 다음 멈춤 (Step Over)

 

- x64dbg의 CPU 탭의 구성

x64dbg의 CPU 탭의 구성

1. 주소와 어셈블리 코드와 x64dbg나 사용자가 단 주석이 여기에 표시됨

- 왼쪽에서부터 주소→옵코드→기계어 코드→주석 순서로 표시

- 주소: 함수명을 알고 있을 경우 함수명이 표시됨

  > 현재 rip(instruction pointer)가 가리키는 부분은 검은색 배경으로 표시해주며

     브레이크 포인트가 걸려있는 경우 빨간색 배경으로 표시

- 주석 부분에 x64dbg가 주석을 다는 경우는 여러 가지가 있음

  > 어셈블리 코드에서 가리키는 주소가 문자열이거나 익스포트된 함수일 경우 주석에 문자열이나 함수의 이름을 표시

- jmp나 call같은 실행 흐름을 바꾸는 어셈블리 코드를 선택하고 enter키를 누르면 해당 부분으로 이동

  > 되돌아올 땐 -키를 사용

2. 현재 CPU의 레지스터 상태가 여기에 표시됨

- 아래로 스크롤하면 xmm과 같은 부동소수점 관련 레지스터의 상태도 볼 수 있음

3. 1번 창에서 선택한 부분에 대한 정보가 여기에 표시됨

- 1번창 주석에 표시되지 않는 내용까지 상세히 표시됨

4. 현재 레지스터 상태 중 rcx, rdx, r8, r9값을 보여줌

- 2번창과 별도로 보여주는 이유는 해당 레지스터의 순서가 windows 64비트 운영체제에서 기본적으로 사용하는 함수 호출 규약의 인자 순서이기 때문

- 이를 통해 call 명령어에서 쉽게 인자로 어떤값들이 넘어가는지 확인할 수 있음

5. 헥스값을 보여줌

- 프로그램 실행에 따라 자동으로 보여주지는 않으며 다른 창에서 헥스값을 보는 명령을 내리면 이 창에서 보여짐

6. 스택값을 보여줌

- 기본적으로 rsp값을 따라서 보여주게 됨

- 가운데 부분의 파란색 선은 한 함수의 스택 영역을 나타냄

- 다만 휴리스틱한 방법을 통해 x64dbg가 추측하여 보여주는 것이기 때문에 부정확할때도 있음

 

 

# x64dbg의 사용법 - 브레이크 포인트

x64dbg 브레이크 포인트 (1)

 - 브레이크 포인트란 리버싱에 있어서 필수적인 도구 중 하나로, 프로그램 실행 중 원하는 지점이나 특정 조건을 만족하는 경우 프로그램을 멈추게 할 수 있는 기능

- 이를 통해 리버서는 프로그램의 시작지점부터가 아닌 분석을 원하는 특정 지점부터 분석을 하는게 가능함

- 브레이크 포인트는 크게 3개로 나눌 수 있음

  > 소프트웨어 브레이크 포인트

  > 하드웨어 브레이크 포인트

  > 메모리 브레이크 포인트

- x64dbg는 3가지 종류의 브레이크 포인트를 모두 지원하며 브레이크 포인트에 조건을 설정하는 것 또한 가능

- 디스어셈블창, 헥스덤프창, 스택창에서 오른쪽 클릭을 했으르 때 나오는 메뉴를 통해 브레이크 포인트를 걸 수 있음

- 대부분의 경우에서는 소프트웨어 브레이크 포인트를 걸게됨

  > 보통 F2 단축키를 통해 브레이크 포인트를 걸게됨

 

x64dbg 브레이크 포인트 (2)

- x64dbg에서 설정한 브레이크포인트는 종류에 상관없이 중단점 탭에서 확인할 수 있음

- 오른쪽 클릭시 나오는 메뉴를 통해 브레이크 포인트를 비활성화 하거나 삭제하거나 조건을 편집할 수 있음

 

 

# x64dbg의 사용법 - 필수 단축키

- F2: 소프트웨어 브레이크 포인트를 걸 때 사용하는 단축키

  > 이미 브레이크 포인트가 걸려있는 주소에서 누를 경우 브레이크 포인트를 삭제

- F7: 어셈블리 코드를 한 줄 실행

  > 만약 call을 실행하려 하면 call한 함수 내부로 진입

- F8: 어셈블리 코드를 한 줄 실행

  > 만약 call을 실행하려 하면 call한 함수가 ret명령어를 실행할 때까지(리턴할 때까지) 실행한 다음 멈춤

- F9: 프로그램의 실행을 재개

- Ctrl + g: 현재 창이 보여주는 주소를 바꿈

  > 디스어셈블 창에서 사용하면 디스어셈블 창이 해당 주소로 가고, 헥스덤프 창에서 사용하면

     헥스 덤프 창이 해당 주소로 가는 식

  > 주소값 말고도 간단한 사칙 연산이나 함수명도 인식

- -, +: 이전 또는 다음 주소로 이동

  > call이나 jmp 명령어의 주소로 이동했을 때, 이전 주소로 돌아가거나 다시 이동할 때 자주 쓰임

- <enter>키: call이나 jcc와 같은 Pc(program counter)를 변경시키는 명령어를 선택한 상태에서 누르면 해당되는 주소로 이동

  ex) call 0x11223344 → 0x11223344로 이동

- <space>키: 선택한 어셈블리어를 수정

  > 잔존 바이트를 NOP로 채우기를 선택하면 수정된 코드 길이가 기존 코드의 길이보다 작을 때

     남는 공간을 NOP로 자동으로 채워줌

x64dbg NOP 채우기

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!