-
[dreamhack.io study] x64dbg로 hello world 디버깅해보기Reverse Engineering 2020. 11. 26. 03:15
이번 포스팅에서는 x64dbg를 이용하여 hello world를 디버깅해보겠다. dreamhack.io의 x64dbg사용법 강좌를 참고하였다.
1. x64dbg 다운로드
우선 x64dbg를 이전 Debugging Tools 작성글에 나와있는 링크를 통해 다운로드한다. 다운로드한 후 압축을 해제한 후, release폴더에 있는 x96dbg.exe 파일을 실행해보자.
이전 포스팅에서도 설명하였듯이, x64dbg는 32-bit 뿐만 아니라 64-bit도 지원한다. 원하는 모드를 선택하면 다음과 같은 창이 나온다.
위 사진은 x64dbg를 실행한 후, 임의로 실행파일은 열었을 때 나오는 화면이다. Ollydbg와 매우 유사한 것을 확인할 수 있으며, 단축키도 거의 비슷하다. 몇몇 주요 단축키들을 정리하면 다음과 같다.
기능(단축키)
설명
F2
BP 설정
F7
코드 한 줄 실행(call의 경우 함수 내부 진입)
F8
코드 한 줄 실행(call의 경우 내부 진입x)
F9
프로그램 실행
Ctrl + g
주소 이동
-, +
이전 또는 다음 주소로 이동
<enter>
분기문에서 target 주소로 이동
<space>
어셈블리 코드 수정
2. x64dbg로 hello world 디버깅해보기
이제 본격적으로 간단한 프로그램을 디버깅해보자. 먼저 다음과 같은 코드를 작성하여 프로그램을 생성한다. (visual studio 2019 / release 모드 / x64 에서 빌드되었다.)
#include <stdio.h> void main() { puts("hello world!\n"); }
(hello-world.cpp)
이후 생성된 .exe파일을 x64dbg(64bit mode)로 open하면 다음과 같다.
이때 초기 설정으로 시스템 중단점 설정이 켜져 있으므로 설정-> 환경설정에서 시스템 중단점 항목을 체크 해제한 후 다시 실행해준다. 그러면 다음과 같이 프로그램의 시작 지점에서 멈춘 상태로 디버깅이 되는 것을 확인할 수 있다.
3. main 함수 찾기
이전에 Ollydbg로 hello world를 디버깅할 때와 마찬가지로 main 함수를 찾아보자. dreamhack 강좌에서는 다음과 같은 세 가지 방법을 제시한다.
(1) 정해진 pattern
visual studio 2019 64bit release 모드에서 컴파일된 코드에 한하여 위 첨부 사진의 네 번째 줄에 있는 jmp 명령어에서 <enter> 키를 눌러 target 주소로 이동한 후 스크롤을 조금만 내리면 다음과 같은 코드를 볼 수 있다.
파란 펜으로 표시한 부분은 바로 main 함수의 argc, argv, envp argument를 Windows API로 설정하는 부분이다. 모든 argument 값을 설정한 후, 동그라미 표시한 call <hello_x64.main>이 바로 main 함수임을 알 수 있다.
(2) 문자열 검색
작성한 프로그램은 hello world라는 문자열을 출력한다. 이를 이용하여 x64dbg 상단 메뉴 아이콘 중 Az라고 표기되어 있는 아이콘을 누르면 현재 보고 있는 모듈에 있는 문자열들을 참조하는 어셈블리어를 검색해준다.
위 화면에서 더블클릭하면 해당 문자열이 있는 곳, 즉 main 함수 내부로 이동할 수 있다.
(3) import한 함수로 찾기
작성한 프로그램에서는 puts라는 함수를 호출한다는 점을 이용하여 main함수를 찾을 수도 있다.
x64dbg 상단 메뉴 아이콘 중 옛날 핸드폰 모양의 아이콘을 클릭하면 현재 모듈에서 import한 모든 함수 목록이 나온다. 상단에 puts함수가 있음을 확인할 수 있으며 이를 통해 main 함수 내부로 이동할 수 있다.
Ollydbg와 비교했을 때 더 가독성도 좋아보이고 64-bit도 지원하므로 유용하게 사용할 수 있을 것 같다. 이후 리버싱 핵심원리 포스팅에서도 가끔씩 x64dbg를 이용해 디버깅을 해봐야겠다.
반응형'Reverse Engineering' 카테고리의 다른 글
[리버싱 핵심원리 study] 8장 abex' crackme#2 분석(1) (1) 2020.12.02 [리버싱 핵심원리 study] 7장 Stack Frame (0) 2020.12.01 [리버싱 핵심원리 study] 6장 abex' crackme #1 분석 (0) 2020.11.25 [리버싱 핵심원리 study] 2장 Hello World! 리버싱 (0) 2020.11.22 Debugging Tools (0) 2020.11.20