MOVE 명령어
MOV(MOVe data)
- Source operand의 내용을 Destination operand로 데이터를 복사한다.
(두 번째 피연산자의 주소로 참조되는 데이터를 첫 번째 피연산자 주소로 전송한다.)
- Destinarion operand의 내용은 변하지만 Source operand의 내용은 변하지 않는다.
- 메모리를 참조하는 피연산자들의 크기가 반드시 일치해야 한다.
(두 피연산자의 크기가 모두 바이트, 워드, 더블 워드여야 한다.)
text:00401023(16진수)
- [ebp+var_C]: Destinarion operand: 공간이 와야 한다.
- 0Ah: Source operand: 값, 공간이 와야 한다.
text:00401027
- ebp + var_4: 주소 +4 값을 eax에 저장
MOVZX(Move with zero eXtention)
- Source operand를 Destination operand로 데이터를 복사한 후 나머지 비트를 0(Zero)으로 채운다.
- 부호가 없는 정수에만 사용된다. (unsigned)
- Destination operand는 반드시 레지스터가 되어야 한다.
- 바이트나 워드의 원시 피연산자를 워드나 더블 워드의 목적지 피연산자로 데이터를 전송할 수 있게 해 준다.
text:0040101 D
- ebx(4byte) 레지스터에 wordptr [ebp+var_4](2byte) 값을 저장한다.
- Byte = 1 byte / word = 2byte / D word = 4byte / Q word = 8byte (데이터의 크기를 의미)
- Destination Register에 그대로 복사하고 앞부분을 0으로 초기화시켜준다.
MOVSX(Move with Sign eXtention)
- Source operand를 Destination operand로 데이터를 복사한 후 나머지 비트 값을 부호 확장한다.
- 부호 있는 정수에만 사용된다.
- 바이트나 워드의 원시 피연산자를 워드나 더블 워드의 목적지 피연산자로 데이터를 전송할 수 있게 해 준다.
Text: 0040102 C
dx(2byte)에 byte ptr [ebp+var_4](1byte)를 저장한다.
- Source Register의 최상위 비트를 Destination Register 앞의 8bit에 채워 넣고 나머지 8bit에 값을 대입한다.
MOVS(Move data from string to string)
- ESI(SI)가 가리키는 주소에 있는 데이터를 EDI(DI)가 가리키는 주소로 복사한다.
- 방향 플레그(DF)가 1이면 ESI(SI)와 EDI(DI)는 감소하고 0이면 증가한다.
(한번 명령어를 실행할 때마다 값이 바뀐다.)
text: 00401052
- movsd (EDI, ESI): d가 붙어있기 때문에 4byte이다.
- 위에 두줄을 보면 esi와 edi에 값이 대입 대고 있다.
- ESI에 담긴 4byte의 데이터를 EDI에 저장한다.
- ecx에 담겨 있는 값만큼 rep(반복)을 수행한다.
산술 논리 연산
ADD
- Source operand를 동일한 크기의 Destination operand에 더한다.
- Source operand는 변하지 않으며 결과 값은 Destination operand에 저장된다.
Ex) ADD EAX ECX: EAX = EAX+ECX
SUB
- Destination operand에서 Source operand를 뺀다.
Ex) SUB EAX ECX: EAX = EAX-ECX
MUL
- 부호가 없는 AL, AX, EAX에 8, 16, 32 비트 연산자를 곱하는 명령어
- 연산 결과는 AX (1byte), DX: AX (4byte) 또는 EDX:EAX (8byte)에 저장된다 (operand size에 의존한다.)
Ex) MUL DX: DX * AX
IMUL
- 부호가 있는 곱셈 (signed)
- 곱셈 부호를 유지하는 것 외에는 MUL과 동일하다.
- 음수 부호 유지를 위한 상위 Bit의 Set은 Overflow로 취급하지 않는다.
DIV
- 부호가 없는 정수에 대해 8, 16, 32비트 나눗셈을 수행한다.
- 연산 결과가 저장될 레지스터의 크기보다 큰 경우 Integer Overflow 오류가 발생한다.
IDIV
- 부호가 있는 정수에 대한 나눗셈을 수행한다.
- 나눗셈 수행 전에 CBW(2byte), CWD(4byte), CDQ(8byte)를 통해 부호 비트를 확장한다. (부호 보존)
- cdq를 통해 나누기 하기 이전에 부호 비트를 확장해 준다.
- edx의 몫이 음수고 3C 나머지가 음수고 b0인 것을 확인할 수 있다.
INC
- 단일 operand에 1을 더한다.
INC EAX: EAX값을 1 증가시킨다.
DEC
- 단일 operand에 1을 감소시킨다.
DEC EAX: EAX값을 1 감소시킨다.
AND
- 두 개의 Operand에서 매칭 되는 비트 사이에 부울 AND 연산 수행 후 결과 값을 Destination operand에 저장한다.
- 선택된 bit를 Clear 하고 나머지를 유지할 때 사용할 수 있다.
- 앞에 4bit를 0으로 설정해서 결괏값을 0으로 나오게 설정한다 (Cleared)
OR
- 두 개의 Operand에서 매칭 되는 비트 사이에 부울 연산 OR 연산 수행 후 결과 값을 Destination operand에 저장한다.
- 선택된 비트를 Set 하고 다른 것을 유지할 때 사용할 수 있다.
XOR
- 두 개의 Operand에서 매칭 되는 비트 사이에 부울 배타적 OR 연산 수행 후 그 결과를 Destination operand에 저장한다. (같은 값 0, 다른 값 1로 설정된다.)
- XOR EAX EAX를 수행하게 되면 EAX값을 0으로 변경시킨다.
SHL(SHift Left)
- 피연산자 비트를 왼쪽으로 이동시키며 곱셈과 관련된 연산을 수행한다.
- SHL d1, 2: shift left 연산을 2번 수행 (기존 값에 *2 *2 = 40)
SHR(SHift Right)
- 피연산자 비트를 왼쪽으로 이동시키며 나눗셈과 관련된 연산을 수행한다.
- SHR d1, 1: shift right 연산을 1번 수행 (기존 값에 나누기 2 = 16)
★LEA, SCAS, STOS, REP, STACK, CALL, JUMP, RETN 정리를 보고싶다면 아래 링크 클릭★
https://peemangit.tistory.com/42
'Hacking & Security > Reversing' 카테고리의 다른 글
리버싱 분석 환경 차이점 (0) | 2019.10.17 |
---|---|
어셈블리 명령어 정리 (2) (1) | 2019.10.16 |
레지스터(Register) 개념, 종류 (3) | 2019.10.15 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊