1619, 1/81 회원가입  로그인  
   zen0c1de
   http://dieuhouse.tistory.com
   [Reverse Engineering] 리버싱의 기초 - 범용 레지스터와 Assembly(Pop,Mov)

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=7892 [복사]


EAX (Accumulator)

        - 산술, 논리 연산의 중심이 되는 레지스터이다.

        - 산술, 논리 연산을 할 때 EAX에 많이 넣고 사용한다.

        - 함수의 리턴 값을 저장하는 레지스터이다.

        (즉 EAX는 하나이기 때문에 리턴 값은 2개 이상이 될 수 없다.)



        EBX (Base Register)

        - 간접 번지 지정 시 사용된다.



        ※ 간접 번지 : int array[]={1,3,5}; 에서 3이라는 변수를 쓰고싶으면 array[1]을 사용해서 인덱스에 접근해 주

        는데 여기서 1이 간접 번지이다. array[1]을 풀어서 쓰면

        *(array+2)가 된다.



        ECX (Count Register)

        - 루프와 같은 명령의 반복수행이 필요로 할 떄 반복횟수 지정에 주로 사용한다.

        - C에서 사용하는 while, for문의 반복문과는 다르다.(Assembly에서 사용하는 반복)

        - ECX에 n을 넣으면 n번 돈다는 뜻이다.




        EDX (Data Register)

        - 간접 번지 지정에 사용되며, 곱셈 나눗셈을 할 때에는 보조 Accumulator로 사용 되어        지기도함.

        - EAX를 도와준다는 느낌이 강하다.

        - 2의 32승은 대략 42억 정도가 되는데, 어떤 값을 곱했을 때 그 결과가 42억이 넘어가면, EAX의 앞에 EDX가 붙어서

        도와준다. (범용 레지스터는 32bit라서 EAX로는 2의 32승,         약 42억 정도 밖에 표현하지 못한다.



포인터 레지스터(Pointer Register)

- 스택과 관련이 있는 레지스터이다.



        ESP (Stack Pointer)

        - 스택의 가장 윗 부분을 가리킨다.

        - Top Pointer라고도 한다.

        - Full Descending 방식을 사용하는 Intel Architecture의 경우, 가장 최근에 스택에 들어온 데이터를 가리킨다.



        EBP (Base Pointer)

        - 스택의 바닥을 가리킨다.

        - Stack Frame을 사용할 경우 현재 실행중인 함수를 호출한 함수가 사용하는 Stack Frame의 바닥을 가리킨다.



인덱스 레지스터 (Index Register)

- 문자열과 관련된 레지스터

- 다른 범용 레지스터와 마찬가지로 연산과 간접 번지 지정에 사용된다.

- 문자열을 비교하거나 전송하는 스트링 명령에서는 다음과 같이 사용된다.

        

        ESI (Source Index)

        - 복사 혹은 비교를 하는데 사용되는 Source 문자열을 나타낸다.



        EDI (Destination Index)

        - 복사 혹은 비교를 하는데 사용되는 Destination 문자열을 나타낸다.



------------------------------------------------------------------------------------

명령어



POP



ex) POP [Operand]

- ESP가 가르키는 곳에 저장된 내용을 Destination Operand 에 저장 후 ESP값 조정

( Ascending Stack : ESP값 감소, Descending Stack : ESP 값 증가 )



MOV



ex) MOV [Destination], [Source]

- 데이터 복사 ( 값 복사 )

용도:1. 레지스터 -> 메모리로 복사

      2. 메모리 -> 레지스터로 복사

      3. 레지스터 -> 레지스터로 복사

      4. 메모리 or 레지스터에 값을 넣음



※ 메모리 -> 메모리로 복사 시에는 사용하지 않는다!

   (메모리에서 메모리로는 복사가 불가능하다, 메모리 -> 레지스터 -> 메모리와 같은 방식으로    해야 가능하다

※ Destination Operand와 Source Operand의 크기가 다를 때는 사용하지 못한다.

  Hit : 15108     Date : 2013/07/18 01:51