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 } |
ZF |
CF |
|
arg1 > arg2 |
0 |
0 |
arg1 < arg2 |
0 |
1 |
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 |