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 값은 저장한 그대로 남아있다.
참고 도서 : 리버싱 윈도우 - 로드북
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
어셈블리어 - LEA 명령어 (0) | 2021.04.17 |
---|---|
어셈블리어 - MOVZX 명령어 (0) | 2021.04.17 |
어셈블리어 개요 (0) | 2021.04.17 |
정규표현식 (Regular Expression) (0) | 2021.04.17 |
리얼모드 메모리 주소 표기 (0) | 2021.04.17 |