Codeengn Basic RCE 15
Q. Name이 CodeEngn일 때 Serial을 구하시오
해당 문제를 풀기 위해, 먼저 15.exe 파일을 다운로드하였다.
7-zip을 통해 압축을 풀고, DIE 파일로 열어보았다.

DIE를 통해서, 해당 파일이 UPX로 패킹이 되어 있지 않다는 사실을 알 수 있다.
만일 패킹이 되어 있다면 언패킹 과정을 거쳐야 하지만, 그렇지 않기에 Immunity Debugger로 가서 바로 파일을 열어주었다.


F9 키를 누르고 프로그램을 실행 시켜보았더니, 위에처럼 Name과 Serial number를 입력하는 칸이 나타났다.
나는 아직 'Name' 값이 'CodeEngn' 이라는 것은 알지만 아직 'Serial number'는 모르기에,
임의로 '1111' 이라는 숫자를 넣어보았다.

그다음에, (우클릭 > Search for > All referenced strings)을 통해 문자열을 확인해 보았다.
이전 문제의 유형들과 비슷하게 해당 문자열 근처에서 분기가 일어날 것 같다고 생각하여서
해당 코드들 근처를 살펴보기로 하였다.
1) 성공/실패 분기 찾기
성공 메시지(MessageBoxA) 바로 위에서 분기를 확인:
00458831 CMP EAX, DWORD PTR DS:[45B844]
00458837 JNZ SHORT 00458854 ; 같지 않으면 실패로 분기
- 의미: EAX 값과 메모리 [45B844](프로그램 내부 목표값)을 비교
- JNZ = Not Equal이면 점프이므로, 두 값이 같을 때는 점프가 발생하지 않고 곧바로 성공 메시지 루틴으로 진입하게 된다.
- 곧, EAX == [45B844] 을 만족해야 바로 성공 메시지가 뜬다는 것이 핵심이다.
참고(일반형): CMP EAX, DWORD PTR DS:[XXXX]는 EAX와 주소 XXXX에 있는 4바이트 값을 비교한다는 의미이다.
** 본 문제의 실제 주소는 [45B844]

2) 레지스터 값 확인
분기 지점(00458831)에 BP 설정 → F9 키를 눌러 프로그램 재실행
-> Name=CodeEngn, Serial=1111 입력 후 정지 시점에서 레지스터/메모리 확인

(1) EAX: 사용자 입력
- 1111 입력 시 EAX = 0x0457→ 디버거는 16진으로 보여주므로,
- 0x0457 = 1111(dec)→ 즉 우리가 입력한 값이 정수로 파싱 되어 EAX에 저장되었다는 사실을 확인할 수 있다.

(2) [45B844]: 내부 목표값
- 하단 Hex dump에서 [45B844] = 60 61 00 00 확인
- 리틀엔디언이므로 실제 값은 0x00006160
- 공학용 계산기를 통하여서 16진수를 → 10진수로 변환하면 '24928' 임을 알 수 있다.
3) 검증 과정

이를 토대로, Name: CodeEngn, Serial: 24928 입력 →
→ JNZ가 발생하지 않아 실패 경로로 점프하지 않고→ 성공 메시지가 뜨는 것 확인 가능!

문제 해결 성-공!
'INTERTLUDE > 리버싱 스터디' 카테고리의 다른 글
| Codeengn Basic RCE 20 (0) | 2025.11.17 |
|---|---|
| Codeengn Basic RCE 16 (1) | 2025.11.11 |
| Codeengn Basic RCE 14 (0) | 2025.11.07 |
| Codeengn Basic RCE 12 (0) | 2025.11.07 |
| Codeengn Basic RCE 19 (0) | 2025.10.08 |