Reversing Engineering - 4. x64dbg
1. x64dbg 사용법
# x64dbg
- 윈도우 디버거
- UI나 기능 등 많은 면에서 ollydbg를 닮았으며, ollydbg는 소스 코드가 공개되어 있지 않고 32비트만 지원하는데 반해 x64dbg는 오픈소스이고 32비트와 64비트를 둘 다 지원
- 강력한 디스어셈블 엔진을 가지고 있으며 그래프 뷰, 플러그인 등 리버싱에 있어서 편리한 여러가지 기능들이 내장되어 있음
# x64dbg의 사용법 - 기본적인 UI
- x64dbg의 상단바
1. 분석할 프로그램을 열음
2. 프로그램을 재시작함
3. 프로그램을 완전히 정지
4. 프로그램을 실행(재개)함
5. 프로그램을 일시정지 시킴. 실행중인 상태에서 임의로 중단시키고 싶을 때 사용
6. 어셈블리 코드를 한 줄 실행. 만약 call을 실행하려 하면 call한 함수 내부로 진입. (step into)
7. 어셈블리 코드를 한 줄 실행. 만약 call을 실행하려 하면 call한 함수가 ret명령어를 실행할 때까지(리턴할 때까지) 실행한 다음 멈춤 (Step Over)
- 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의 사용법 - 브레이크 포인트
- 브레이크 포인트란 리버싱에 있어서 필수적인 도구 중 하나로, 프로그램 실행 중 원하는 지점이나 특정 조건을 만족하는 경우 프로그램을 멈추게 할 수 있는 기능
- 이를 통해 리버서는 프로그램의 시작지점부터가 아닌 분석을 원하는 특정 지점부터 분석을 하는게 가능함
- 브레이크 포인트는 크게 3개로 나눌 수 있음
> 소프트웨어 브레이크 포인트
> 하드웨어 브레이크 포인트
> 메모리 브레이크 포인트
- x64dbg는 3가지 종류의 브레이크 포인트를 모두 지원하며 브레이크 포인트에 조건을 설정하는 것 또한 가능
- 디스어셈블창, 헥스덤프창, 스택창에서 오른쪽 클릭을 했으르 때 나오는 메뉴를 통해 브레이크 포인트를 걸 수 있음
- 대부분의 경우에서는 소프트웨어 브레이크 포인트를 걸게됨
> 보통 F2 단축키를 통해 브레이크 포인트를 걸게됨
- 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로 자동으로 채워줌
'Hacking Tech > Reversing' 카테고리의 다른 글
[Dreamhack] Reversing Engineering - 6. 쉬운 crackme를 통한 디버거 사용법 - 1 (0) | 2021.12.21 |
---|---|
[Dreamhack] Reversing Engineering - 5. hello-world로 배우는 x64dbg 사용법 (0) | 2021.10.04 |
[Dreamhack] Reversing Engineering - 3. puts("hello world!\n") → x86_64 asm (0) | 2021.10.03 |
[Dreamhack] Reversing Engineering - 2. x64 기초 (0) | 2021.09.19 |
[Dreamhack] Reversing Engineering - 1. 리버싱 엔지니어링이란 (0) | 2021.09.16 |