본문 바로가기

정보보안/리버싱

reverse_assembly 기본명령어 JL

 27_어셈블리(JL) 

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


1. JL(JB 비슷함)

 - 형식 : JL [Code Address]
 - 내용 : Operand 1이 Operand 2보다 작은 경우 해당 주소로 점프한다.
 - 예제 : JL 401140
 - 해석 : Operand 1이 Operand 2보다 작은 경우 401140으로 점프한다.
 - 조건 : Operand 1 < Operand 2


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

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



#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "user32")

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nCmd)
{
int num1 = 2;
int num2 = 6;

if(num1>=num2) {
MessageBox(NULL, "Operand1 >= Operand2 -> Next Code", "JL 명령어(점프X)", MB_OK);
} else {
MessageBox(NULL, "Operand1 < Operand2 -> Jump", "JL 명령어(점프O)", MB_OK);
}
return 0;
}


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


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

 

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

 

cmp     eax, [ebp+var_4]

jl     short loc_401032

 

-  분기 직전 명령어를 보면 cmp와 jie인 것을 확인할 수 있다.

앞에서 했던 jle에서 e만 빠진 조건으로,  Operand 1 < Operand 2 임을 만족하면 해당 주소로 점프한다. 

따라서 아이다로 확인해봐도 앞에서 했던 흐름과 유사하게 분기 1, 분기2로 나뉜다. 


2. 올리디버거를 이용한 'jl.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 02000>MOV DWORD PTR SS:[EBP-8],2
0040100D  |.  C745 FC 06000>MOV DWORD PTR SS:[EBP-4],6

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


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

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

 

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

EAX와 [EBP-4] 를 비교하는 과정을 거친다.

CMP 한 결과 상태플래그의 변화

 

// 참고

 

-플래그:AF, CF, OF, PF, SF, ZF

대소 관계         CF         SF          ZF

op1>op2          0          0            0

op1=op2          0          0            1

op1<op2          1          1            0

 

0040101A  |.  7C 16         JL SHORT jl.00401032

 

JL에 의하여 해당 주소로 점프하게된다.

 

 


<  401032 _ 분기2  >


00401032  |> \6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401034  |.  68 74814000   PUSH jl.00408174                         ; |Title = "JL 명령어(점프O)"
00401039  |.  68 88814000   PUSH jl.00408188                         ; |Text = "Operand1 < Operand2 -> Jump"
0040103E  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
00401040  |.  FF15 E8804000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA

 

위와 같이 분기2에 해당되는 코드들을 실행하고, 메시지박스가 실행되며 아래와 같이 "JL 명령어(점프O)"가 출력된다.

이후, XOR을 통해 EAX를 0으로 초기화 시켜준 후, 함수에필로그가 수행되며 main함수는 종료된다.


00401046  |>  33C0          XOR EAX,EAX

_____________________________________________________________________________________________

 

<  함수에필로그  >
00401048  |.  8BE5          MOV ESP,EBP
0040104A  |.  5D            POP EBP

____________________________________          main함수 소멸 

 


0040104B  \.  C2 1000       RETN 10    ---> main함수 다음주소로 리턴 

 

 

 




 

'정보보안 > 리버싱' 카테고리의 다른 글

reverse_assembly SWITCH  (0) 2022.09.02
reverse_assembly 기본명령어 JG  (0) 2022.09.02
reverse_assembly 기본명령어 JGE  (0) 2022.09.02
reverse_assembly 기본명령어 JLE  (0) 2022.09.02
reverse_assembly 기본명령어 JNE&JNZ  (0) 2022.09.02