이것저것

lena tutorials 2, JUMP로 해결하기 본문

전공/악성코드분석

lena tutorials 2, JUMP로 해결하기

신쥔 2022. 9. 27. 04:25

1. 실행파일 확인

reverseMe.exe 를 실행시키면 다음과 같이 나온다.

 

한번에 정답이라니?

이 문제에 접근하기 위해서는 Keyfile.dat 라는 파일을 삭제한다. 삭제하면 아래와 같은 창이 뜬다.

평가판 만료됐대!

2. OllyDbg 실행하기

파일을 삭제함으로써 평가판이 만료가 됐다는 메세지가 떴기 때문에 CreateFileA 부분을 조금 확대해보자.

CreateFileA function (fileapi.h)
Creates or opens a file or I/O device.

Syntax, dwCreationDisposition?

dwCreationDisposition
존재하거나 존재하지 않는 파일 또는 장치에 대해 수행할 작업

3이 PUSH가 됐기때문에, 3이 들어왔을 때 수행되는 작업을 확인하면

파일이나 장치가 있는 경우에만 열고 지정된 파일이나 장치가 없으면 함수는 실패한다는 것을 알 수 있다.

자, 이제 본격적으로 Correct 메세지가 뜨도록 해보자.

 

분기점이 중요하다는 것을 강의를 통해 알게 됐으니, 우선 JUMP에 관한 모든 어셈블리 명령어를 정리를 해보았다.

JA Jump if (unsigend) above CF=0 and ZF=0
JAE Jump if (unsigned) above or equal CF=0
JB Jump if (unsigned) below CF=1
JBE Jump if (unsigned) below or equal CF=1 or ZF=1
JC Jump if carry flag set CF=1
JCXZ Jump if CX is 0 CX=0
JE** Jump if equal ZF=1
JECXZ Jump if ECX is 0 ECX=0
JG* Jump if (signed) greater ZF=0 and SF=OF (SF = Sign Flag)
JGE* Jump if (signed) greater or equal SF=OF
JL* Jump if (signed) less SF != OF (! = is not)
JLE* Jump if (signed) less or equal ZF=1 and OF != OF
JMP** Jump Jumps always
JNA Jump if (unsigned) not above CF=1 or ZF=1
JNAE Jump if (unsigned) not above or equal CF=1
JNB Jump if (unsigned) not below CF=0
JNBE Jump if (unsigned) not below or equal CF= 0 and ZF=0
JNC Jump if carry flag not set CF=0
JNE** Jump if not equal ZF=0
JNG Jump if (signed) not greater ZF=1 or SF != OF
JNGE Jump if (signed) not greater or equal SF != OF
JNL Jump if (signed) not less SF = OF
JNLE Jump if (signed) not less or equal           ZF=0 and SF=OF
JNO Jump if overflow flag not set OF=0
JNP Jump if parity flag not set PF=0
JNS Jump if sign flag not set SF=0
JNZ Jump if not zero ZF=0
JO Jump if overflow flag is set OF=1
JP Jump if parity flag set PF=1
JPE Jump if parity is equal PF=1
JPO Jump if parity is odd  PF=0
JS Jump if sign flag is set SF=1
JZ Jump if zero ZF=1

 

 

플래그 기호 이름 의미
Z 제로 플래그 연산 결과가 0일 경우에 참이 된다
C 캐리 플래그 부호 없는 숫자의 결과가 비트 범위를 넘어섰을 때 참이 된다
A 보조 캐리 플래그 연산 결과 하위 니블(4bits(에서 비트 범위를 넘어섰을 때 참이 된다
V / O / W 오버플로 플래그 부호 있는 숫자의 연산 결과가 비트 범위를 넘어섰을 때 참이 된다
N / S 네거티브 플래그, 사인 플래그 연산 결과가 음수일 때 참이 된다
I / E 인터럽트 플래그 이 플래그가 참일 경우에만 인터럽트 요구를 받아들인다
P 패리티 플래그 연산 결과에서 1로된 비트의 수가 짝수일 경우 참이 된다
D 디렉션 플래그 문자열 조작에서 참일 경우 주소 레지스터 값이 자동으로 감소하고, 거짓일 경우 자동으로 증가한다
D / T 디버그 플래그, 트랩 플래그 참일 경우 한 명령이 실행할 때마다 인터럽트가 발생한다 (디버깅에 사용)

 

에러메세지가 출력되는 곳부터 시작해서 천천히 위로 분기문을 기점으로 코드를 살펴보기로 했다. 

JNZ, ZF가 0이 아니라면 그대로, 아니라면 Jump!

Step over (F8)을 통해 그대로 진행을 한다면 "Evaluation period out of date. Purchase new license"를 마주하고 그대로 프로세스가 종료가 된다.

그렇기때문에 이 MessageBox 부분을 뛰어넘기기 위해

JNZ SHORT reverseM.0040109A 부분을 JMP SHORT reverseM.0040109A로 바꾸어주자

 

JNZ를 JMP로

이제 사진 속 저 부분은 항상 넘어간다.

스크롤을 조금 더 내리다보면 다음과 같은 구간을 만날 수 있다. 내가 원하는 correct 메세지는 아니다. 피하고 싶다.

시작 부분을 눌러봤더니

어딘가에서 JUMP되었음을 확인할 수 있다. 스크롤을 올려 확인해보자!
도착하니 이 곳

바로 위에 JNZ가 있어 저 JNZ는 어디로 이동하는거지 확인을 해봤더니

바로 아래 JMP를 뛰어넘을 수 있게되어있다.

그래서 항상 뛰어넘게 하기 위해

JNZ를 JMP로 수정!

스크롤을 더 내려봤더니 내가 원하는 correct 메세지를 출력하는 곳이 있었다.

마찬가지로, 시작부분을 눌러 어디에서 JUMP 되었는지 확인했다.

004010D8을 시작으로 다시 천천히 스크롤을 올려 모든 분기점을 확인해보았다. 분기점이 모여있는 곳을 발견했다.

정확한 확인을 위해 이번에도 Step over (F8)을 통해 확인해보았는데, JNZ에서 넘어가지 못하면 JMP에서 걸려 에러메세지를 띄우게 된다.

그렇기때문에 JMP를 항상 뛰어넘을 수 있도록

JNZ를 JMP로 바꿔준다.

다시 Step over 를 진행하다보면

이 구간에서 계속 반복됨을 확인할 수 있는데
JE를 JMP로 바꿔주면 루프문을 탈출 할 수 있다.

그 뒤로 진행을 하다보면 JL을 만날 수 있는데, 부분이 도달하는 곳은 에러메세지이기 때문에

이 부분을
이렇게 바꾸어준다.

004010D8의 JMP를 만나면!

도착!
해결했다.

 

 

 

 

 

출처

https://ko.wikipedia.org/wiki/%EC%83%81%ED%83%9C_%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0

 

상태 레지스터 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 상태 레지스터 또는 플래그 레지스터는 마이크로프로세서에서 다양한 산술 연산 결과의 상태를 알려주는 플래그 비트들이 모인 레지스터이다. 주로, 조건문과

ko.wikipedia.org

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea

 

CreateFileA function (fileapi.h) - Win32 apps

Creates or opens a file or I/O device. The most commonly used I/O devices are as follows:\_file, file stream, directory, physical disk, volume, console buffer, tape drive, communications resource, mailslot, and pipe. (ANSI)

learn.microsoft.com

 

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

기초정적분석하기, Lab 01-02.exe  (0) 2022.11.06
오랜만에 쓰는, Lena tutorials 3!  (0) 2022.10.04
IAT 총정리  (0) 2022.10.04
과제 1주차 abex crackme 2  (0) 2022.09.18
과제 1주차 abex crackme 1  (0) 2022.09.17