본문 바로가기

Reverse Engineering/CodeEngn Basic

[리버싱] CodeEngn Basic RCE L05

문제 설명


개념 설명

Detect it easy: 다운로드한 앱이 어떤 것으로 압축되어 있는지 알 수 있는 프로그램

Upx: 프로그램 파일을 더 작은 크기로 압축하고 실행하는데 사용

사용예시: upx –d –o 05_unpacked.exe 05.exe


풀이 과정 (30분)

정형된 풀이 과정이 아닙니다. 개인의 의견입니다.

1. 문자열 검색 (10분)

2. 분기점 찾기, dump에 저장된 정보 확인 (15분)

3. (심화) 스택 정보 확인하기 - 내가 입력한 값은 어디에 저장될까?


문제 풀이

일단 DIE로 이 앱의 유형을 확인해보자

 

이 앱은 UPX로 압축되어 있는 것을 알 수 있다


압축풀기

 

압축을 풀어주자

다음과 같이 upx 폴더 내부에서 cmd로 들어가서 

 

명령어를 입력해주면

 

압축을 풀 수 있다

 

압축이 풀린 앱을 한번 실행시켜보자

뭔가를 입력해야 될 것 같은 창이 나온다

 

Immunity debugger에도 한 번 넣어보자

 

시작코드를 확인했고 실행도 시켜봤는데 뭔지 모르겠다

 

이럴 떄는 text string을 찾아보자

v

이상한 문자열과 CrackMe가 보인다

여기로 들어가보자

 

들어가고 나서 일단 여기를 중점으로 봐야될 것 같으니 브레이크포인트를 걸어두자

이 함수의 시작점이다. 여기에 브레이크포인트를 설정해주자.

이제 실행시키고, 아무거나 입력해보자.

1234를 입력하고 계속 실행시켜보니 Wrong 이라는 문자열이 뜨는 부분으로 와지는걸 확인할 수 있다.

 

 

왜 그런지 궁금해서 다시 천천히 실행해보았더니

JNZ 함수에서 점프를 해 오류 부분으로 이동한 것을 확인했다.

 

JNZ(JMP if not zero)는 flag값이 0이 아니면 않으면 jmp를 하는 어셈블리어이다.

연산결과가 0이면 1, 연산결과가 1이면 0이된다.

더보기

**Chat GPT 요약본**

 

1. ZF(Zero Flag) 플래그란?

ZF는 연산 결과가 0이면 1, 0이 아니면 0이 되는 플래그야.

  • 예를 들어, SUB EAX, EAX 같은 명령어를 실행하면 EAX = 0이 되므로 ZF = 1이 돼.
  • 반대로 MOV EAX, 5처럼 0이 아닌 값을 설정하면 ZF = 0이야.

2. JNZ(Jump if Not Zero)란?

JNZ는 ZF가 0이면 점프하고, ZF가 1이면 점프하지 않는 명령어야.
즉, 연산 결과가 0이 아닐 때(즉, ZF = 0일 때) 점프함.

💡 JNZ 동작 정리

ZF 값상태JNZ 동작
0 연산 결과가 0이 아님 점프함
1 연산 결과가 0임 점프 안 함

3. "같다", "다르다"와 JNZ의 관계

보통 CMP(Compare) 명령어와 함께 쓰이는데, CMP A, B는 내부적으로 A - B를 실행한 뒤 플래그를 설정해.
이후 JNZ가 실행되면 다음과 같이 동작해:

CMP A, B 결과ZF 값JNZ 동작의미
A == B 1 점프 안 함 A와 B가 같음
A ≠ B 0 점프함 A와 B가 다름

즉, A와 B가 같으면(ZF = 1) 점프 안 하고, 다르면(ZF = 0) 점프함.
반대로 **JZ(Jump if Zero)**는 ZF = 1일 때 점프하므로 JNZ와 반대라고 보면 돼.


4. 예제 코드 분석

(1) 같은 경우

assembly
복사편집
MOV AX, 5 CMP AX, 5 ; 5 - 5 = 0 → ZF = 1 JNZ NOT_EQUAL ; ZF = 1 → 점프 안 함

✅ JNZ는 ZF = 0일 때만 점프하므로 여기서는 점프하지 않음.


(2) 다른 경우

assembly
복사편집
MOV AX, 5 CMP AX, 3 ; 5 - 3 = 2 → ZF = 0 JNZ NOT_EQUAL ; ZF = 0 → 점프함

✅ ZF = 0이므로 JNZ가 실행되어 NOT_EQUAL로 점프함.


5. 한 줄 정리

  • ZF = 1 → 연산 결과가 0 (같다) → JNZ 실행 X (점프 안 함)
  • ZF = 0 → 연산 결과가 0이 아님 (다르다) → JNZ 실행 O (점프함)

결국, "JNZ는 다르면 점프한다" 라고 기억하면 돼! 🚀

 

값을 맞춰서 Registered User로 써주자

 

그리고 아래 시리얼 부분도 비슷한 JNZ 함수가 있는것을 확인했다

 

둘다 똑같이 입력해주면,

성공이다