본문 바로가기
보안 공부/Reversing

[리버싱] MOV와 LEA의 차이

by 그적 2019. 9. 17.

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;   //두 개의 코드를 써줘야 하는 번거로움이 생긴다. 따라서 사칙연산 명령어를 쓰지 않고도 [ ] 기호를 쓰면 내부에서 사칙연산이 가능해진다.

댓글