본문 바로가기

정보보안/리버싱

reverse_assembly 기본명령어 JNE&JNZ

@ 24_어셈블리(JNE&JNZ)

 - 분석 환경 : Windows7(32bit)
 - 분석 도구 : OllyDbg, VS2008


1. JNE&JNZ

 - 형식 : JNZ [Code Address]
 - 내용 : 비교 결과 값이 '0'이 아니면(ZF=0 설정된 경우), 해당 주소로 점프한다.
 - 예제 : JNZ 401140
 - 해석 : ZF=0 인 경우, 401140으로 점프한다.
 - 조건 : Operand 1 != Operand 2


 1) VS 2008을 이용하여 'jnz.exe' 파일을 제작한다.

 - 파일 -> 새로 만들기 -> 프로젝트 -> 빈 프로젝트 -> 위치(04_테스트) & 이름(jnz) -> 확인
 - '소스 파일' 우클릭 -> 추가 -> 새 항목 -> 'C++ 파일(.cpp)' 선택 -> 이름(jnz) -> 추가



 - 파일 -> 모두 저장 -> 닫기


 2) 'cl' 명령어를 이용한 최적화 컴파일 실시

 

2. ' jnz.exe' 파일을 'IDA Pro'를 이용하여 고급 정적 분석을 실시한다.

 

       -       CMP eax, [ebp-4] 하여 eax - [ebp-4] 의 값이 0인지 확인한 후, JNZ 401032 에 의하여 비교 결과값이 0이 아니면 401032 , 분기 2로 점프하고, 그렇지 않으면 다음 코드, 즉 분기1이 실행되는 것을 볼 수 있다.

 


2. 올리디버거를 이용한 'jnz.exe' 분석

 - 메모리 주소, 레지스터 저장 값, 스택 내용, 메모리 덤프 내용, 비교 및 분기 내용 확인

 

1) Main함수 찾기(F8)

 Main함수를 call하기 직전의 모습이다. Main함수의 주소는 401000임을 확인할 수 있다.

 

 

2) Main함수 진입(F7) – 함수 프롤로그, 함수 본체, 함수 에필로그 확인

 

 

<  함수 프롤로그  >

 

00401000  /$  55            PUSH EBP

00401001  |.  8BEC          MOV EBP,ESP

__________________________________________________________________________________________

 

< 함수 본체 >

 

00401003  |.  83EC 08       SUB ESP,8

-      다음과 같이 지역변수 num1,num2를 위한 공간 4byte * 2 만큼 ESP 를 위로 올려 공간을 마련해주는 작업을 한다.

 

00401006  |.  C745 F8 06000>MOV DWORD PTR SS:[EBP-8],6

0040100D  |.  C745 FC 02000>MOV DWORD PTR SS:[EBP-4],2

 

각 변수를  6 , 2  로 초기화해준다 .  이는 코드에서  int num1 = 6; int num2 = 2;  의 부분에 해당하는 내용이다 .

00401014  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]

-      다음과 같이 [EBP-8]의 값을 EAX에 대입한 후

00401017  |.  3B45 FC       CMP EAX,DWORD PTR SS:[EBP-4]

-      이 둘을 빼 결과값이 0인지 아닌지 비교하는 과정을 거치게 된다.

EAX의 값과 [EBP-4]값은 서로 다른 값을 가지고 있으므로, 비교 결과 값은 ‘0’이 아닌 값이 이되고,  ZF=0이 된다.

0040101A  |.  75 16         JNZ SHORT jnz.00401032

 

JNZ 에 의하여, 비교결과값이 ‘0’이 아니고, ZF = 0 이므로 다음과 같이 00401032로 분기하게 된다.

 

< 00401032 >

 

 

00401032  |>  6A 00         PUSH 0                               ; /Style = MB_OK|MB_APPLMODAL

00401034  |.  68 78814000   PUSH jnz.00408178                     ; |Title = "JNZ 명령어(점프O)"

00401039  |.  68 8C814000   PUSH jnz.0040818C            ; |Text = "Operand1 != Operand2(ZF=0) -> Jump"

0040103E  |.  6A 00         PUSH 0                                ; |hOwner = NULL

00401040  |.  FF15 E8804000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA

 

 

위와 같이 분기2에 해당되는 코드들을 실행하고, 메시지박스가 실행되며 아래와 같이 "Operand1 != Operand2(ZF=0) -> Jump"가 출력된다.

그 후, 함수에필로그가 진행되어 main함수는 소멸한 후, 메인 함수를 부른 명령어의 다음 주소로 리턴하게 된다.

00401046  |> \33C0          XOR EAX,EAX

________________________________________________________________________________________

<  함수 에필로그  >

00401048  |.  8BE5          MOV ESP,EBP

0040104A  |.  5D            POP EBP

 












00401000  /$  55            PUSH EBP

00401001  |.  8BEC          MOV EBP,ESP

00401000  /$  55            PUSH EBP

00401001  |.  8BEC          MOV EBP,ESP

00401000  /$  55            PUSH EBP

00401001  |.  8BEC          MOV EBP,ESP