IT 그리고 정보보안/Knowledge base

어셈블리어 - MOV 명령어

plummmm 2021. 4. 17. 10:18
반응형

MOV 명령

데이터를 복사하는 명령어다. move라고 착각하여 이동시킨다고 생각할 수 있는데

이거는 복사하는 거다.

MOV를 쓸 때 몇가지 제한사항이 있으니 참고하자.

 

* 레지스터에서는 같은 사이즈의 데이터끼리만 복사 가능하다.

* 메모리에서 메모리로 복사가 안된다. 고로 레지스터를 통해서 복사해야한다.

* 세그먼트 레지스터의 내용은 범용 레지스터가 아닌 곳으로 이동 가능. 반대는 불가

 

mov는  " mov eax, ebx " 형태를 가진다.

ebx의 값을 eax로 복사한다. 이런 뜻이다.

 

직접 예제를 통해서 mov에 대해 더 알아보자.

 

mov에 관한 예제 어셈블리 코드이다. 설명이 필요하니 하겠음

 

.code : 코드가 시작되는 부분

 

main proc 

push ebp : 기존 EBP 주소를 스택에 백업

 

mov esp, ebp

sub esp, 8h  

:여기 까지가 함수의 프롤로그. 

함수의 시작 지점을 EBP에 저장하여 Frame pointer 설정하는 과정이다.

 

mov dword ptr [ebp-4], 22334455h

mov dword ptr [ebp-8], 00000000h

: 메모리 주소를 가르킬 때  []를 사용한다. 메모리 접근할 때는 항상 ptr로 사이즈를 정의해야한다.

dword ptr 은 4바이트 단위로 접근하겠다 이말이다. 스택은 기본적으로 4바이트 단위로 구성

 

mov esi, dword ptr [ebp-4]

mov edi, dword ptr [ebp-8]

: 위에서 저장한 값들을 MOV명령을 이용하여 ESI와 EDI에 복사

 

mov esp, ebp

pop ebp

retn

 

main endp

end main

: 함수 에필로그... Frame pointer 제거, 지역변수 제거 및 EBP 값 복원

 

 

소스 분석은 요정도로 하고.

위에서 잠깐 나온 메모리 주소 가르킬 때 사용하는 대괄호 []에 대해 설명하고 가겠음

 

[ebp-4]와 ebp-4의 차이를 한번 보자. 예를 들어보겠음.

mov eax, ebx 와 mov eax, [ebx] 가 있다. ebx=12345678 이다.

 

mov eax, ebx 는 ebx의 값 12345678을 eax에 복사하는 것이다. 반면..

 

mov eax, [ebx] 는 ebx의 값 12345678을 메모리 주소로 써서 0x12345678 에 위치한 값을 eax로 복사하는 것이다

 

자.. 그럼 이제 코딩한 프로그램을 디스어셈블..

 

잘안보이지만.. 밑에 한줄 씩 설명함

 

PUSH EBP : 현재 EBP값을 스택에 넣는다. 스택창을 확인하면 EBP의 값이 스택에 올라 와있다.

MOV EBP, ESP : ESP의 값을 EBP에 저장시킨다.

SUB ESP, 8 : 스택이 하나에 4바이트니까 스택에 2개의 공간을 할당한다.

 

mov dword ptr ss:[ebp-4], 22334455h : 할당된 첫번째 공간에 0x22334455값을 저장한다.

mov dword ptr ss:[ebp-8], 00000000h: 할당된 두번째 공간에 0x0 값을 저장한다.

 

mov esi, dword ptr ss:[ebp-4] : [ebp-4]에 할당된 값 0x22334455를 ESI로 복사한다.

mov edi, dword ptr ss:[ebp-8] : [ebp-8]에 할당된 값 0x0을 EDI로 복사한다.

 

mov esp, ebp

pop ebp

retn

:함수의 에필로그이다.

스택 공간을 해제하고, EBP값을 스택에서 빼고 이전 함수로 돌아간다.

하지만 ESI와 EDI 값은 저장한 그대로 남아있다.

 

참고 도서 : 리버싱 윈도우 - 로드북

반응형