2021. 11. 26. 22:00ㆍdreamhack[드림핵]/Reverse Engineering
x64dbg 사용법
x64dbg
x64dbg는 원도우 디버거이다. 32비트와 64비트를 모두 지원하며 소스코드가 공개되어있다.
x64dbg의 실행
x64dbg는 https://x64dbg.com/에서 다운받을 수 있다.
다운받은 폴더의 압축을 푼 후 release폴더에 들어가 몇 비트냐에 따라 32비트 64비트 중 선택하면 된다.
하지만 드림핵 강의에서는 대부분 64비트 프로그램에 대한 리버싱을 다루기에 대부분의 상황에서 64비트를 선택하여 진행하면 된다.
x64dbg의 시작화면
x64dbg에 분석할 실행파일을 드래그 앤 드랍하면 아래쪽과 비슷한 화면을 볼 수 있다.

x64dbg의 사용법 - 기본적인 UI
x64dbg의 기능
1. 분석할 프로그램을 연다.
2. 프로그램을 재시작한다.
3. 프로그램을 완전히 정지한다.
4. 프로그램을 실행(재개)한다.
5. 프로그램을 일시정지한다.
6. 어셈블리 코드 한 줄을 실행. 만약 call을 실행하려 하면 call한 함수 내부로 진입함
7. 어셈블리 코드 한 줄을 실행. 만약 call을 실행하려 하면 call한 함수가 ret명령어 실행 전까지 실행한 다음 멈춤

CPU 탭의 구성
- 주소와 어셈블리 코드와 x64dbg나 사용자가 단 주석이 여기에 표시됩니다.
왼쪽에서부터- 주소
- 옵코드
- 기계어 코드
- 주석
주소 부분에는 함수명을 알고 있을경우 함수명이 표시됩니다. 현재 rip(instruction pointer)가 가리키는 부분은 검은색 배경으로 표시해주며 브레이크 포인트가 걸려있는 경우 빨간색 배경으로 표시된다.
주석 부분에 x64dbg가 주석을 다는 경우로는 여러 가지가 있습니다. 가장 흔한 경우는 어셈블리 코드에서 가리키는 주소가 문자열이거나 익스포트된 함수일 경우이다. 해당 경우에는 주석에 문자열이나 함수의 이름을 표시해준다.
이곳에서 jmp나 call같은 실행 흐름을 바꾸는 어셈블리 코드를 선택하고 enter 키를 누르면 해당 부분으로 이동합니다. 되돌아올땐 -키를 사용 - 현재 CPU의 레지스터 상태 표시
아래로 스크롤하면 xmm과 같은 부동소수점 관련 레지스터의 상태도 볼 수 있다. - 1번창에서 선택한 부분에 대한 정보 표시, 이 부분에는 1번창 주석에 표시되지 않는 내용까지 상세히 표시
- 현재 레지스터 상태중 rcx, rdx, r8, r9값을 보여줌, 2번창과 별도로 보여주는 이유는 해당 레지스터 순서가 Windows 64비트 운영체제에서 기본적으로 사용하는 함수 호출 규약(Calling Convention)의 인자 순서이기 때문에 이를 통해 call 명령어에서 쉽게 인자로 어떤값들이 넘어가는지 확인할 수 있다.
- 핵스값을 보여줌, 프로그램 실행에 따라 자동으로 보여주지는 않으며 다른 창에서 헥스값을 보는 명령을 내리면 이 창에서 보여줌
- 스택값을 보여줌, 기본적으로 rsp값을 따라서 보여줌, 가운데 부분의 파란색 선은 한 함수의 스택 영역을 나타내는데 휴리스틱한 방법을 통해 x64dbg가 추측하여 보여주는 것이기 때문에 부정확할때도 있다.

x64dbg의 사용법-브레이크 포인트
브레이크 포인트란 프로그램 실행 중 원하는 지점이나 특정 조건을 만족할 경우 프로그램을 멈추게하는 기능
이를 통해 원하는 특정 지점부터 분석 가능
종류는 소프트웨어 브레이크 포인트, 하드웨어 브레이크 포인트, 메모리 브레이크 포인트 총 3개로 나뉜다.
위 3가지 종류의 브레이크 포인트 모두를 지원하여 브레이크 포인트에 조건을 설정하는 것 또한 가능하다.
스택창에서 우클릭 시 브레이크 포인트를 걸 수 있다.
대부분 소프트웨어 포인트를 걸게 되는데 F2가 단축키이다.

x64에서 설정한 브레이크포인트는 종류에 상관없이 중단점 탭에서 확인, 편집 가능

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으로 자동으로 채워줍니다.

'dreamhack[드림핵] > Reverse Engineering' 카테고리의 다른 글
| 5일차 (Hello World 어셈블리 분석) (0) | 2021.11.25 |
|---|---|
| 4일차 (0) | 2021.11.24 |
| 3일차 (0) | 2021.11.23 |
| 2일차 (0) | 2021.11.22 |
| 1일차 (0) | 2021.11.21 |