본문 바로가기

Reversing/개념

[DreamHack] 3강, 4강 : puts("hello world!\n"); → x86_64 asm

DreamHack 3강!

오늘도 빨리 정리해보자 :)

4강은 x64dbg의 기본적인 사용법을 설명하는 강의이기 때문에, 간단하게 정리만하고 넘어가겠다.

 

 

<3강> : puts("hello world!\n"); → x86_64 asm

< Hello world >

 

"hello world!" 출력 프로그램
x64dbg를 통해 main함수 일부분을 가져온 어셈블리 코드 (왼쪽부터 주소, 기계코드, 어셈블리어, 코멘트)

        - 주소 : 해당 어셈블리 코드의 시작 주소

        - 기계 코드 : 사람이 읽을 수 있는 어셈블리 코드의 전 단계인 기계어

                        : ":" 앞에 있는 값은 prefix이고, 띄어쓰기 다음에 있는 부분은 어셈블리 코드의 2번째 인자 부분임

        - 어셈블리어 : 주소값의 경우 x64dbg가 적절한 형태로 바꾸어서 보여주기도 함.

                           (3번째 줄에서 &puts라고 표시되는 것 확인))

        - 코멘트 : x64dbg가 프로그램을 분석하여 알게된 추가적인 정보

                      (2번째 줄에서 문자열에 대한 정보가 표시되는 것 확인)

 

< Hello world - 디스어셈블리 결과 살펴보기 >

    1.  디스어셈블리 결과 살펴보기 - 1

        : sub rsp, 28

          - rsp에서 0x28만큼 빼 함수 내부에서 사용할 스택의 용량을 확보하는 명령어

          - 일반적으로 함수에서 지역변수로 선언한 값들이 스택에 위치하게 되는데, 이 지역변수들이

             저장될 공간을 컴파일러가 미리 계산하여 함수 시작부분에 확보해두는 것

        : lea rcx,qword ptr ds:[7FF6ED802220]

           - rcx에 "0x7FF6ED802220" 값을 저장

           - "0x7FF6ED802220"는 주소값이며, 코멘트 부분을 확인해보면 puts의 천번째 인자인

              "hello world!\n" 가 위치한 주소인 것을 알 수 있음

           - puts의 첫번째 인자를 rcx에 넣은 이유는 calling convention(함수 호출 규약)이 존재하기 때문

    2.  Windows의 함수 호출 규약

          - windows의 함수 호출 규약은 다음과 같은 순서로 첫 4개의 인자를 받음.

rcx (ecx, cx, ···)
rdx (edx, dx, ···)
r8 (r8d, r8w, ···)
r9 (r9d,r9w, ···)

          - 이후 5번째 인자부터는 스택에 넣게 되며, 함수의 리턴값은 rax (eax, ax, ···)에 저장됨.

    3.  디스어셈블리 결과 살펴보기 - 2

        : call qword ptr ds:[<&puts>]

           - puts를 호출하는 명령어

        : xor eax, eax

            - eax를 0으로 만들어주는 명령어

            - main함수의 리턴값을 0으로 설정해놨기 때문에 함수의 리턴값을 의미하는 eax 레지스터를 0으로 설정

            - [move eax, 0]보다 명령어의 길이가 짧고, CPU에서 좀더 빠르게 실행시킴

        : add rsp,28

            - 함수 시작시 확보해두었던 스택을 정리하는 명렁어

        : ret

            - 함수의 실행을 마치고 리턴하기 위해 사용하는 명령어

            - call 명령어를 통해 스택에 저장된 Return Address로 돌아감

 

 

<4강> : x64dbg 사용법

    1. x64dbg

        : 윈도우 디버거

        : 오픈소스이며, 32비트와 64비트를 모두 지원함

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