어셈블리어와 악성코드

어셈블리어 명령어 [CMP, JMP, CALL]

YaluStar 2018. 11. 18. 00:30

어셈블리어 명령어 [CMP, JMP, CALL]



CMP (Compare)

두 피연산자를 비교하는 작업을 한다. Destination 피연산자에서 Source 연산자를 묵시적으로 빼서 값을 비교한다. 두 피연산자의 값이 같다면 결과는 0이 되고 ZF가 1로 세트된다. 다르면 ZF가 0으로 세트된다.


ZFZero Flag라고 하며 처음 상태일 때는 NZ(Not Zero)ZF가 0으로 세트된 상태이며  화면에 표시가 됩니다. 만약 계산 결과의 값이 0일 경우 ZF가 1로 세트되며, NZ가 ZR(Zero)변경됩니다.


사용 양식은 다음과 같습니다.

CMP Dest, Src

CMP reg, reg

CMP reg, imm

CMP mem, reg

CMP mem, imm

CMP reg, mem



실습 환경

VMware Workstation 15 Player (FREE 버전)

Windows XP Professional SP3 (32Bit)


CMD창을 열어 debug 명령어를 입력합니다.

-a 100

MOV AX, 2

CMP AX, 2


처음 초기 상태일 때는 Zero FlagNZ(Not Zero) 상태입니다.

MOV AX, 0002을 수행한 후에도 변화가 없습니다.

AX=0002가 들어가고 CMP로 AX가 0002값인지 비교합니다.

CMP로 비교할 때 묵시적으로 빼서 값을 비교하기 때문에 현재 AX=0002, 비교하려는 값=0002결과는 0000이 나오기 떄문에 Zero Flag가 활성화 되어 NZ에서 ZR로 변경됩니다.





다른 코드를 살펴보면 MOV AX, 2AX에 0002값을 넣어줍니다.

그리고 CMP로 AX랑 3을 비교하였지만, 결과 값으로 0이 아닌 다른 값, 즉 참이 아니라 거짓인 결과가 나와서 NZ는 ZR로 변하지 않고 NZ 상태를 유지하게 됩니다.

 





JMP

프로그램 카운터의 변경을 통해 실행 흐름을 이동할 수 있으며, 명령어들은 16비트, 32비트 또는 세그먼트:오프셋 포인터를 가집니다. 종류로는 상대, 조건부, 절대 그리고 간접 레지스터 점프가 있습니다.



실습 환경

VMware Workstation 15 Player (FREE 버전)

Windows XP Professional SP3 (32Bit)


CMD창을 열어 debug 명령어를 입력합니다.

-a 100

:0100  MOV AX, 2

:0103  CMP AX, 1

:0106  JE 110

:0108  MOV AH, 11

:010A  DEC AX





이어서 실행을 해봅니다.

먼저 MOV AX, 0002가 실행되어 AX=0002 값이 들어갑니다.

CMP로 AX와 0001을 비교하지만 거짓이므로 NZ 상태가 유지됩니다.

그리고 JZ(Jump Zero) 명령어JE (Jump if equal)와 같은 뜻의 명령어인데, 값이 같아서 ZF(Zero Flag)가 1로 셋팅된 경우, 즉 CMP의 결과가 참인 경우에 발동하는 명령어입니다.

값이 같을경우 0100 = 010A 주소 번지로 넘어가서 DEC AX 명령어를 수행하지만 다르기 때문에 바로 밑의 명령어를 수행합니다.

이어서 MOV AH,11 명령어AX=1102가 되고 마지막인 DEC AX 명령어가 실행되어 AX=1101이 됩니다.


그 외 JMP 명령어는 종류가 많지만, 나올때마다 확인하는 것으로 하겠습니다.



참고로 19E0:0100 JMP 100을 입력할 경우 현재 0100번지인데 JMP 100은 조건없이 100번지 주소로 이동하는 것이기 때문에 무한루프에 걸리게 됩니다.





CALL (Call a Procedure)

함수 호출시 사용되며, JMP 명령어 같이 프로그램 실행 흐름이 변경되지만 JMP 명령어와 다른 점은 되돌아올 리턴 어드레스(CALL 다음 명령)를 스택에 저장합니다. 되돌아올 주소를 저장하기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있으며, 호출한 함수가 일을 다 마치면 원래 위치에서 다시 프로그램이 실행될 수 있습니다.


사용 양식은 다음과 같습니다.

CALL mem16

CALL mem32

CALL reg



실습 환경

VMware Workstation 15 Player (FREE 버전)

Windows XP Professional SP3 (32Bit)


CMD창을 열어 debug 명령어를 입력합니다.

-a 100

:0100  JMP 0106

:0102  MOV AX, 0002

:0105  RET

:0106  MOV AX, 0001

:0109  CALL 0102

:010C CMP AX, 0002






코드를 실행해보겠습니다.

먼저 JMP 0106 명령어가 실행이 되어 :0106 주소로 이동하게 됩니다.

그리고 :0106에 있는 MOV AX, 0001 명령어를 실행합니다.

AX=0001로 바뀌고 CALL 0102 명령어를 실행합니다.

CALL 명령어를 실행하면 다음이였던 CMP 명령어가 아닌 :0102 주소에 있는 MOV AX, 0002 명령어가 실행이 됩니다.

AX=0002로 바뀌게 됩니다.





이어서 :0105 주소에 있는 RET 명령어를 실행하게 되면 CALL 명령어 다음에 있던 CMP 명령어를 수행하는 주소로 이동하게 됩니다.

CMP AX, 0002 명령어를 수행할 때 AX=0002 값을 가지고 있으므로 결과는 참이 되어 ZF(Zero Flag)가 1로 셋팅 되어 NZ가 ZR로 변경됩니다.






이상으로 어셈블리어 명렁어 CMP, JMP, CALL에 대하여 알아보았습니다.

감사합니다.


반응형