Self-Improvement

리버싱 기초 3 (어셈블러 명령어) 본문

리버싱 기초

리버싱 기초 3 (어셈블러 명령어)

JoGeun 2018. 10. 23. 18:47

*데이터 이동


- MOV : 데이터 복사

 설명

  MOV 목적지, 소스 : 소스의 내용을 목적지로 복사한다

 예시

 명령어 : MOV EAX, ECX

 연산 전 : EAX(00400020), ECX(00400030)

 연산 후 : EAX(00400030), ECX(00400030)


- MOVZX : 0을 확장하여 데이터 복사

 설명

  소스의 내용을 목적지로 복사하고, 목적지 나머지 부분을 0으로 채운다. 목적지에 32bits 레지스터가 온다면 소스에는 16bits 레지스터가 온다.

 예시

 명령어 : MOVZX EAX, CX

 연산 전 : EAX(89ABCDEF), ECX(12345678)

 연산 후 : EAX(00005678), ECX(12345678)



- MOVSX : 부호를 확장하여 데이터 복사

 설명

  소스의 내용을 목적지로 복사하고, 목적지 나머지 부분을 소스 부분의 맨 처음 비트로 채운다. 목적지에 32bits 레지스터가 온다면 소스에는 16bits 레지스터가 온다.

 예시

 명령어 : MOVSX EAX, CX

 연산 전 : EAX(89ABCDEF), ECX(12345678)

 연산 후 : EAX(00005678), ECX(12345678)

※ MOVSX에서 CX는 ECX의 하위 16비트 값을 의미하며 바이너리로 변환시 "0101 0110 0111 1000"이 된다. 부호 비트로 사용되는 최상의 1비트인 "0"으로 EAX 레지스터 상위 16비트를 채운다.


- LEA : 주소 복사

 설명

  소스의 주소를 목적지로 복사한다. 목적지에는 레지스터만 올 수 있다.

 예시

 명령어 : LEA EAX, [ESP-4]

 연산 전 : EAX(89ABCDEF), ESP(0018FF88)

 연산 후 : EAX(0018FF84), ESP(0018FF88)





*산술 연산자


- ADD : 덧셈

 설명

  목적지와 소스의 내용을 더해서 목적지에 저장한다.

 예시

 명령어 : ADD EAX, ECX

 연산 전 : EAX(00000002), ECX(00000001)

 연산 후 : EAX(00000003), ECX(00000001)


- SUB : 뺄셈

 설명

  목적지에서 소스의 내용을 빼서 목적지에 저장한다.

 예시

 명령어 : SUB EAX, ECX

 연산 전 : EAX(00000004), ECX(00000001)

 연산 후 : EAX(00000003), ECX(00000001)


- MUL : 부호 없는 곱셈

 설명

  EAX 레지스터의 내용에 소스의 내용을 곱해서 EAX 레지스터에 저장한다. 결과 값이 커서 목적지에 다 들어가지 못할 때는 EDX 레지스터에 넘치는 상위 비트 값을 저장한다.

 예시

 명령어 : MUL ECX

 연산 전 : EAX(00077777), ECX(00077777), EDX(00000000)

 연산 후 : EAX(4861D951), ECX(00077777), EDX(000037C0)


- IMUL : 부호 있는 곱셈

 설명

 1. EAX 레지스터에 목적지의 내용을 곱해서 다시 EAX 레지스터에 저장한ㄷ. 결과 값이 커서 목적지에 다 들어가지 못할 때는 EDX 레지스터에 넘치는 값을 저장한다.


 2. 목적지와 소스의 내용을 곱해서 목적지에 저장한다. 결과 값이 커서 목적지에 다 들어가지 못할 때는 EDX 레지스터에 넘치는 값을 저장한다.


 3. 정수와 소스의 내용을 곱해서 목적지에 저장한다. 결과 값이 커서 목적지에 다 들어가지 못할 때는 EDX 레지스터에 넘치는 값을 저장한다.

 예시

 명령어 : IMUL ECX, EBX, -4(6BCB FC)

 연산 전 : ECX(00000003), EBX(00000004)

 연산 후 : ECX(FFFFFFF0), EBX(00000004)


- DIV : 부호 없는 나눗셈

 설명

  EAX 레지스터 값을 소스의 내용으로 나누어서 몫은 EAX 레지스터에 저장하고 나머지는 EDX 레지스터에 저장한다. DIV 연산을 테스트해서 원하는 값을 얻으려면 EDX 레지스터 값을 먼저 0으로 변경해야 한다.

 예시

 명령어 : DIV ECX

 연산 전 : EAX(0000000A), ECX(00000003), EDX(00000000)

 연산 후 : EAX(00000003), ECX(00000003), EDX(00000001)


- IDIV : 부호 있는 나눗셈

 설명

 1. AX 레지스터 값을 소스의 내용으로 나누어서 몫은 AL 레지스터에 저장하고 나머지는 AH 레지스터에 저장한다.


 2. DX와 AX 레지스터 값을 소스의 내용으로 나누어서 몫은 AX 레지스터에 저장하고 나머지는 DX 레지스터에 저장한다.

 

 3. EDX와 EAX 레지스터 값을 소스의 내용으로 나누어서 몫은 EAX 레지스터에 저장하고 나머지는 EDX 레지스터에 저장한다.

 예시

 명령어 : IDIV ECX

 연산 전 : EAX(FFFFFFF7), ECX(00000002), EDX(00000000)

 연산 후 : EAX(7FFFFFFFB), ECX(00000002), EDX(00000001)


- INC : 1증가

 설명

 목적지에 있는 데이터를 1만큼 증가 시킨다.

 예시

 명령어 : INC ECX

 연산 전 : ECX(00000002)

 연산 후 : ECX(00000003)


- DEC : 1감소

 설명

 목적지에 있는 데이터를 1만큼 감소시킨다.

 예시

 명령어 : DEC ECX

 연산 전 : ECX(00000003)

 연산 후 : ECX(00000002)


- NEG : 부호 반전

 설명

 목적지에 있는 데이터의 부호를 바꾼다. 2의 보수를 취한다.

 예시

 명령어 : NEG ECX

 연산 전 : ECX(FFFFFFFC) -4

 연산 후 : ECX(00000004)


'리버싱 기초' 카테고리의 다른 글

함수 호출 규약  (0) 2018.11.03
MOV vs LEA  (0) 2018.10.28
리버싱 기초 4 (어셈블러 명령어)  (0) 2018.10.23
리버싱 기초 2 (어셈블리어)  (0) 2018.10.20
리버싱 기초 1 (메모리, 레지스터)  (0) 2018.10.20