ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 실행화면

    위 사진은 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 함수 찾기

    파란 펜으로 표시한 부분은 바로 main 함수의 argc, argv, envp argument를 Windows API로 설정하는 부분이다. 모든 argument 값을 설정한 후, 동그라미 표시한 call <hello_x64.main>이 바로 main 함수임을 알 수 있다.

     

     

    (2) 문자열 검색

    작성한 프로그램은 hello world라는 문자열을 출력한다. 이를 이용하여 x64dbg 상단 메뉴 아이콘 중 Az라고 표기되어 있는 아이콘을 누르면 현재 보고 있는 모듈에 있는 문자열들을 참조하는 어셈블리어를 검색해준다.

    문자열을 통한 main함수 찾기

    위 화면에서 더블클릭하면 해당 문자열이 있는 곳, 즉 main 함수 내부로 이동할 수 있다.

     

     

    (3) import한 함수로 찾기

    작성한 프로그램에서는 puts라는 함수를 호출한다는 점을 이용하여 main함수를 찾을 수도 있다.

    x64dbg 상단 메뉴 아이콘 중 옛날 핸드폰 모양의 아이콘을 클릭하면 현재 모듈에서 import한 모든 함수 목록이 나온다. 상단에 puts함수가 있음을 확인할 수 있으며 이를 통해 main 함수 내부로 이동할 수 있다.

    import한 함수로 main함수 찾기

     

    Ollydbg와 비교했을 때 더 가독성도 좋아보이고 64-bit도 지원하므로 유용하게 사용할 수 있을 것 같다. 이후 리버싱 핵심원리 포스팅에서도 가끔씩 x64dbg를 이용해 디버깅을 해봐야겠다.

    반응형

    댓글

Designed by Tistory.