5일차 (Hello World 어셈블리 분석)

2021. 11. 25. 22:00dreamhack[드림핵]/Reverse Engineering

Hello World

Hello World - 1

프로그래밍 언어를 배울 때 먼저 Hello World를 출력하는걸 다 해봤을 거다 이번엔 C언어로 짜인 코드가 어떻게 어셈블리 코드로 바뀌었는지 공부할거다.

컴파일 할 파일의 내용

 

Hello World - 2

하단에 보이는 어셈블리 코드는 x64dbg를 통해 main함수 일부분을 가져온 것

1.주소

해당 어셈블리 코드의 시작 주소가 여기 표시됨

2.기계코드

사람이 읽을 수 있는 어셈블리 코드의 전 단계인 기계어가 여기에 표시됨 :앞에 있는 값은 prefix이고 띄어쓰기 다음에 있는 부분은 어셈블리 코드의 2번째 인자 부분

3.어셈블리어

비교적 사람이 읽기 쉬운 형태인 어셈블리 코드가 여기에 표시됨 3번째를 보면 &puts라고 표시해주는걸 알 수 있다.

4.코멘트

2번째 줄을 보면 7FF6ED802220에 있는 문자열에 대한 정보가 표시된다.

 

Hello World - 디스어셈블리 결과 살펴보기

 

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

sub rsp, 28

rsp위치에서 0x28만큼 빼 스택의 용량 확보 함

잘 생각해보면 이상한 점이 있다 소스코드에는 지역변수를 사용하는 곳이 전혀 없는데도 0x28만큼 스택을 확보하였다. 그 이유는 shadow space 또는 home space라 불리는 공간을 확보하고 성능향상을 위한 메모리 사용 최적화가 적용되어있기 때문이다.

 

lea rcx, qword ptr ds: [7FF6ED802220]

해당 명령어는 rcx에 0x7FF6ED802220 값을 저장  0x7FF6ED802220는 주소값이며 x64dbg가 생성한 디스어셈블 겨로가의 코멘트 부분을 확인해보면 puts의 첫번째 인자인 hello world!\n가 위치해있는걸 알 수 있다.

 

x64에는 많은 레지스터들이 존재하는데, puts의 첫번째 인자를 rcx에 넣은 이유는 사람들이 정해둔 규칙이 있기 때문이다. 이를 calling convention, 한국어로 함수 호출 규약이라고 한다.

함수 호출 규약은 한 가지가 아니며 여러 종류가 있는데 이 강좌에서는 보편적으로 사용되며 아래 예제에서도 사용된 64비트 Windows의 함수 호출 규약에 대한 설명이다.

 

64비트 windows의 함수 호출 규약

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

- rcx(ecx, cx, ...)

- rdx(edx, dx, ...)

- r8(r8d, r8w, ...)

- r9(r9d, r9w, ...)

 

이후 5번째 인자부터는 스택에 넣게 된다. 함수 리턴값은 rax(eax, ax, ...)에 저장

 

8개의 인자를 받는 함수의 디스어셈블 결과를 보면 밑의 그림과 같이 나오게 된다.

살펴보면 rxc(ecx), rdx(edx), r8(r8d), r9(r9d)에 4번째 인자까지 넣고 5~8번째 인자는 미리 확보해둔 스택에 저장하는 것을 알 수 있다.

 

Hello World - 디스어셈블리 결과 살펴보기 - 2

call qword ptr ds:[<&puts>]

해당 명령어는 puts를 호출하는 명령어

 

xor eax, eax

해당 명령어는 eax를 0으로 만들어주는 명령어이다. main함수의 리턴값을 0으로 설정해놨기 때문에 함수의 리턴값을 의미하는 eax레지스터를 0으로 설정( xor을 통해 하는 이유는 명령어의 길이가 짧고 cpu에서 더욱 빠르게 실행시키기 때문이다.)

 

add rsp, 28

확보해두었던 스택을 정리하는 명령어이다.

 

ret

함수의 실행이 끝나고 돌아가기 위해 사용하는 명령어이다.

 

 

 

'dreamhack[드림핵] > Reverse Engineering' 카테고리의 다른 글

6일차 (x64dbg 사용법)  (0) 2021.11.26
4일차  (0) 2021.11.24
3일차  (0) 2021.11.23
2일차  (0) 2021.11.22
1일차  (0) 2021.11.21