MOV와 LEA의 차이
먼저 MOV와 LEA의 기능부터 알고 가보면 아래 내용과 같다.
1) MOV
- 형식 : MOV dest, src
- 기능 : src위치에 있는 데이터를 복사하여 dest위치에 저장
- 원칙 1) 메모리와 레지스터 사이의 데이터 이동.
2) 레지스터와 레지스터, 값을 레지스터나 메모리에 대입할 때 사용.
3) src와 dest의 크기가 같아야 함.
2) LEA
- 형식 : LEA dest, src
- 기능 : src오퍼랜드에서 지정된 주소를 dest로 로드
- 원칙 1) src의 오퍼랜드는 메모리에 위치해야 함.
2) mov와 비교하여 메모리 주소 표현 및 레지스터에 대한 직접적인 연산이 가능.
핵심은 제2연산자, 즉 src에 대한 추가 연산 방식이 다르다는 것이다.
MOV AX, [BP+4] 의 경우, [BP+4]를 하나의 주소 값으로 처리하고
LEA AX, [BP+4] 의 경우, [BP]만 주소 값으로 인식하여 +4는 주소 값에 대한 추가 연산으로 처리한다.
(예제 2번을 풀어보면서 확실하게 이해하자.)
--------------------------------------------------------------------------------------------------------------------
예제 1. ebp=0x12345, *ebp=100 일 때, eax 값이 무엇일까?
MOV eax, dword ptr ds[ebp];
LEA eax, dword ptr ds[ebp];
답
MOV의 eax = 100
LEA의 eax = 0x12345
예제 2. ebp=0x123e456, 0x123e452 메모리 주소에서 4바이트 공간에 100이라는 값이 들어있을 때,
MOV eax, dword ptr ss:[ebp-4];
LEA eax, dword ptr ss:[ebp-4];
답
MOV의 eax = 100
LEA의 eax = 0x123e452
---------------------------------------------------------------------------------------------------------------------------
MOV명령어를 사용한 eax에는 [...]가 src라면 ...의 주소에 들어있는 값을 넣는 것이다.
LEA명령어를 사용한 eax에는 [...]가 src라면 ...의 주소 값을 넣는 것이다.
**참고: dword ptr에 의해 4바이트의 값을 읽어 들인다.
//word ptr이면 2바이트, byte ptr이면 1바이트
//되도록 [ ] 전에 dword ptr처럼 메모리 크기를 지정해주자
**[ ] 기호
1) 어셈블리어에서 []는 주소를 의미, mov에서 []가 쓰이면 주소를 참조하는 것으로 쓰임
2) [ ] 기호를 쓰면 내부에서 사칙연산이 가능
(예시) lea eax, dword ptr ss[ebp-4]; 코드에 [] 기호가 없었다면
mov eax,ebp;
sub eax,4; //두 개의 코드를 써줘야 하는 번거로움이 생긴다. 따라서 사칙연산 명령어를 쓰지 않고도 [ ] 기호를 쓰면 내부에서 사칙연산이 가능해진다.
'보안 공부 > Reversing' 카테고리의 다른 글
[리버싱] 리틀엔디안, 빅엔디안 (0) | 2019.11.01 |
---|---|
[리버싱] CMP와 TEST 명령어 차이 (0) | 2019.11.01 |
[리버싱] 어셈블리 명령어 종류 (0) | 2019.09.17 |
[리버싱] 어셈블리어란/어셈블리어종류 (0) | 2019.09.17 |
[리버싱] 레지스터란, 레지스터 종류 (0) | 2019.09.15 |
댓글