어셈블리어 정리 ( cmp & TEST & ZF & CF )

2018. 4. 4. 17:59악성코드 분석




레지스터에는 ZF,CF, 등등 여러가지 상태 플래그가 존재한다.

cmp와 TEST명령어는 ZF와 CF를 사용하므로 두가지 플래그에 대해 알아보자.


[1] 플래그

[3-1] ZF ( ZeroFlag )

이전 명령어의 연산결과의 값이 0 일경우에 ZF플래그는 "1" 로 set 되어진다.

연산결과 == 0 ---> " 거짓 " ---> ZF : 1

연산결과 != 0 ---> " 참 " ---> ZF : 0

ZF플래그를 통해서 이전 명령어의 참,거짓을 판별할 수 있다.


[3-2] CF ( CarryFlag )

연산 시 비트올림이나, 비트내림 발생 시 CF가 1로 set된다.

쉽게말하면, 두 숫자를 비교할 때 사용하는 플래그이다


[2] cmp arg1 arg2( 두 인자의 차를 이용한 비교 )


[ 연산1 ]

cmp eax,1실행--> "eax-1" 연산이 실행된다. ( *연산의 결과는 저장되어 지지 않는다! 다만, 이용할뿐이다. )

1
2
3
4
5
__asm{
    mov eax,1
    cmp eax,1
    je 0x12345678
}

cs


 ZF

CF 

arg1 > arg2 

 0

 0

arg1 < arg2

 0

 

arg1 == arg2

 1 0


eax-1연산의 결과값은 0이다. 따라서 ZF는 "1"로 set되어진다.

je ( Jump if Equal ) : ZF플래그를 확인하고 두 수의 동일여부를 확인한다. 

비교한 두 수가 같다면 jmp실행 ( == JZ (Jump if Zero ) )


[3] TEST arg1 arg2( 두 인자를 and연산자를 이용해 비교 )


* JZ ( Jump if Zero )

ZeroFlag : 1 set => Jmp발생

* JNZ ( Jump if Not Zero )

ZeroFlag : 0 set => Jmp발생

TEST명령어는 두개의 인자를 and연산을 실행한다. 


[ 연산2 ]

1
2
3
4
5
__asm{
mov eax,0
test eax,eax
jz 0x12345678
}
cs

test명령어는 주로 해당 값의 참,거짓을 판별할 때 사용되어진다.

How ? 0 과 0 을 and연산하면 0이다. 즉 0 인지 아닌지 판별할 때 사용한다

연산2에서 test eax,eax의 연산결과는 0이다.

연산결과 : 0 --> ZeroFlag : 1 set --> JZ조건 만족 --> 0x12345678 주소로 Jmp



'악성코드 분석' 카테고리의 다른 글

FSG 수동언패킹 [ Lena21 ]  (0) 2018.04.14
Upack 수동언패킹 [ Lena21 ]  (0) 2018.04.14
UPX 수동언패킹 [ Lena 21 ]  (0) 2018.04.10
Packing & Unpacking  (0) 2018.04.10
PE File Structure  (0) 2018.04.10