문제 설명

개념 설명
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을 찾아보자

이상한 문자열과 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 동작 정리
| 0 | 연산 결과가 0이 아님 | 점프함 |
| 1 | 연산 결과가 0임 | 점프 안 함 |
3. "같다", "다르다"와 JNZ의 관계
보통 CMP(Compare) 명령어와 함께 쓰이는데, CMP A, B는 내부적으로 A - B를 실행한 뒤 플래그를 설정해.
이후 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) 같은 경우
✅ JNZ는 ZF = 0일 때만 점프하므로 여기서는 점프하지 않음.
(2) 다른 경우
✅ ZF = 0이므로 JNZ가 실행되어 NOT_EQUAL로 점프함.
5. 한 줄 정리
- ZF = 1 → 연산 결과가 0 (같다) → JNZ 실행 X (점프 안 함)
- ZF = 0 → 연산 결과가 0이 아님 (다르다) → JNZ 실행 O (점프함)
결국, "JNZ는 다르면 점프한다" 라고 기억하면 돼! 🚀


값을 맞춰서 Registered User로 써주자
그리고 아래 시리얼 부분도 비슷한 JNZ 함수가 있는것을 확인했다
둘다 똑같이 입력해주면,

성공이다
'Reverse Engineering > CodeEngn Basic' 카테고리의 다른 글
| [리버싱] CodeEngn Basic RCE L08 (0) | 2024.09.19 |
|---|---|
| [리버싱] CodeEngn Basic RCE L06 (0) | 2024.09.19 |
| [리버싱] CodeEngn Basic RCE L04 (0) | 2024.09.15 |
| [리버싱] CodeEngn Basic RCE L03 (1) | 2024.09.15 |
| [리버싱] CodeEngn Basic RCE L02 (0) | 2024.09.15 |