| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- dualtable
- JavaScript
- 투빌리지
- 악성코드분석
- 취업준비
- 대학생
- 가차시스템
- Practicalmalwareanalysis
- 자바스크립트
- lab03-03.exe
- JS
- 리버싱
- 투두리스트
- N-ary Tree Preorder Traversal
- 다해요
- gamification
- 마을짓기
- 사이버보안
- TODOLIST
- 듀얼테이블
- 토이프로젝트
- leetcode
- 악코분
- 균형이진트리
- 릿코드
- to-do
- 코딩테스트
- orcle
- 사이드프로젝트
- toVillage
- Today
- Total
이것저것
lena tutorials 2, JUMP로 해결하기 본문
1. 실행파일 확인
reverseMe.exe 를 실행시키면 다음과 같이 나온다.

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

2. OllyDbg 실행하기

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

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

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 | 디버그 플래그, 트랩 플래그 | 참일 경우 한 명령이 실행할 때마다 인터럽트가 발생한다 (디버깅에 사용) |
에러메세지가 출력되는 곳부터 시작해서 천천히 위로 분기문을 기점으로 코드를 살펴보기로 했다.

Step over (F8)을 통해 그대로 진행을 한다면 "Evaluation period out of date. Purchase new license"를 마주하고 그대로 프로세스가 종료가 된다.
그렇기때문에 이 MessageBox 부분을 뛰어넘기기 위해
JNZ SHORT reverseM.0040109A 부분을 JMP SHORT reverseM.0040109A로 바꾸어주자

이제 사진 속 저 부분은 항상 넘어간다.
스크롤을 조금 더 내리다보면 다음과 같은 구간을 만날 수 있다. 내가 원하는 correct 메세지는 아니다. 피하고 싶다.

시작 부분을 눌러봤더니


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

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

스크롤을 더 내려봤더니 내가 원하는 correct 메세지를 출력하는 곳이 있었다.
마찬가지로, 시작부분을 눌러 어디에서 JUMP 되었는지 확인했다.

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

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

다시 Step over 를 진행하다보면


그 뒤로 진행을 하다보면 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 |