minhui study

[WEEK1] 어셈블리어 C언어로 변환하기 본문

Hacking/Reversing

[WEEK1] 어셈블리어 C언어로 변환하기

minhui 2020. 9. 13. 14:41

먼저 main()문부터 살펴보자

→ 값을 스택에 집어넣는 명령어로 main함수에서 RBP가 베이스 포인터 역할을 하게 될테니 RBP가 이전에 가지고 있던 값을 스택에 백업해두기 위한 용도로 사용된다. (나중에 main함수가 종료(return)되기 전에 이 값을 회복시켜 준다.)

 

→ 이 명령 이후부터 RBP는 현재 RSP와 같은 값을 가지게 된다. 그리고 main()함수가 끝날 때까지는 RBP값은 고정된다. 

이 말은 즉 스택에 저장된 함수 파라미터와 로컬 변수들은 RBP를 통해 접근한다는 것이다. 


위의 두 명령어를 통해 main()함수 스택 프레임이 생성되었다고 할 수 있다.

 

→ SUB는 빼기 명령어로 RSP에서 16을 빼라는 뜻이다. 16을 갑자기 빼는 이유가 뭘까?
16은 main()함수의 로컬 변수의 크기로 int타입의 변수가 총 4개(4*4)나 float같이 8byte변수가 2개 있다고 추측할 수 있다. 하지만 밑에 명령어를 보았을 때 rbp - 4를 쓰고 있으므로 4byte변수가 있다고 추측해볼 수 있다.
이 변수들을 스택에 저장하기 위해서 필요한 크기만큼 RSP에서 빼서 메모리 공간을 확보하기 위한 명령어로 이제 main()함수 내에서 RSP값이 아무리 변해도 변수를 위해 확보한 스택 영역은 훼손되지 않는다.

 

mov DWORD PTR [rbp-4], 1
rbp - 4주소에서 4바이트 크기의 메모리에 1을 넣는다. 

mov eax, DWORD PTR [rbp-4]
eax에 rbp-4에 들어있는 값 1을 넣는다.

mov edi, eax
mov eax, 0
eax값 1을 edi에 넣고 eax를 0으로 초기화 시킨다. (eax : 0, edi : 1)

 

 

이제 square함수를 호출하므로 함수 부분을 살펴보자

 

→ main()문에서와 같이 값을 스택에 집어넣는 명령어로 main함수에서 RBP가 베이스 포인터 역할을 하게 될테니 RBP가 이전에 가지고 있던 값을 스택에 백업해두기 위한 용도로 사용되고, 이로써 함수 square에 대한 스택 프레임을 생성하게 된다.

그리고 원래의 rbp값을 스택에 저장한 후에 현재의 rsp를 rbp에 입력하여 새로 설정된 rbp로 스택에 저장된 함수 파라미터와 로컬 변수들에 접근한다.

 

mov DWORD PTR [rbp-4], edi

edi에 있는 값 1을 rbp-4에 넣는다.

mov eax, DWORD PTR [rbp-4]
rbp-4에 있는 값을 eax에 넣는다.

imul eax, eax

imul은 부호가 있는 곱셈 명령어로 eax = eax * eax 를 하는 연산식이다.


rbp를 pop하여 main()함수로 복귀한다.

 

 

다시 main()함수로 복귀한 다음이다.

→ main()초반에 rbp-4가 있었으므로 4byte짜리 두번째 변수가 있는 것을 확인할 수 있다. 


mov DWORD PTR [rbp-8], eax
rbp - 8주소에서 4바이트 크기의 메모리에 eax의 값을 넣는다. 

mov eax, 0

eax에 0을 넣는다.

leave

ret

마지막으로 main()문까지 종료한다.

 

아래는 위의 해석을 통해 작성해본 C언어 코드이다.

#include "stdio.h"

int square(int a){
	int x = a;
	return x*x;
}

int main(){
	int a = 1;
	int b = square(a);
	return 0;
}

 

'Hacking > Reversing' 카테고리의 다른 글

WOW64 file system redirection  (0) 2020.09.17
[WEEK 2]어셈블리어 C언어로 변환하기  (0) 2020.09.17
Wargame 'Dreamhack' rev-0  (0) 2020.09.13
Crackme #1  (0) 2020.09.13
[WEEK1]호출규약(32bit/64bit) 정리  (0) 2020.09.11
Comments