Codeengn Basic RCE 14
Q. Name이 CodeEngn 일 때 Serial을 구하시오 (이 문제는 정 답이 여러 개 나올 수 있는 문제이며 5개의 숫자로 되어있는
정답을 찾아야함, bruteforce 필요) Ex) 11111
해당 문제를 풀기 위해, 14.exe 문제 파일을 다운로드하여주었다.
7-Zip File Manager로 압축을 풀고 DIE로 파일 정보를 확인해보려고 한다.

압축을 푼 다음에, DIE로 확인해 보니 파일이 패킹이 되어 있음을 알 수 있다.

그래서 upx-4.2.4-win64 폴더 내에서, CMD를 열고 언패킹 명령어를 입력하였다.
** 언패킹 명령어 : upx -d -o (저장할 파일명) (원본 파일명)
Immunity Debugger로 14_unpac.exe 오픈 → F9 실행하면 아래와 같은 Name/Serial 입력 다이얼로그가 뜨는 것을 알 수 있다.

우리는 Name이 CodeEngn이라는 것은 알지만, Serial Number는 모르기에 일단 임의로 '1111'을 입력해 보기로 하였다.
그러하였더니, 이러한 화면이 나타나기에 내가 잘못된 시리얼 넘버를 입력하였구나.라는 사실을 알 수 있었다.
이번에도 (우클릭 > Search for > All referenced strings)을 통해 문자열을 확인해 보았다.

MessageBoxA()를 출력하는 코드 근처로 가서 살펴보았다.
12번 문제와 비슷하게, 이번 문제도 성공/실패 메시지와
MessageBoxA 호출들을 기준으로 위쪽으로 핵심 분기 지점이 있을 것이라 판단하여, 핵심 분기 지점을 찾아보았다.
1) 성공/실패 분기 위치 확인

성공을 출력하는 메시지 박스 직전에 분기문이 있음을 확인할 수 있었다.
00401339 POP ESI
0040133A CMP EAX, ESI
0040133C JNZ SHORT 00401353 ; 다르면 실패로 점프
- EAX == ESI → 점프하지 않음 → 성공 경로(“Good Job”)
- EAX != ESI → JNZ 로 실패 경로(“Wrong …”)
2) 입력 → 레지스터(EAX) 반영 확인

분기 지점 0040133A에 BP 설정 → Name=CodeEngn, Serial=1111 입력 후 정지 상태에서 레지스터 확인:
- EAX = 0x0457 (디버거가 16진수로 값을 보여주기에, 그래서 이를 10진수로 확인해 보기 위해 공학용 계산기로 계산함.) -> 16진수 0x0457 == 10진수 1111 (사용자 입력이 정수로 파싱되어 EAX에 로드됨)
- 실제로는 내가 임의로 입력한 '1111'의 값이 정수로 EAX에 로드된 것임을 확인할 수 있었다. 즉, 프로그램은 사용자 입력값을(정수) 받아 EAX에 대입한 뒤 ESI와 비교를 하는 함수라는 것이다.
그렇다면 ESI에 들어있는 값은 무엇일까?

- ESI = 0x129A1
→ 16진수 0x129A1 == 10진수 76193 (프로그램이 내부에서 계산/준비한 목표값) - 성공 메시지를 출력하기 위해서는, EAX(입력 Serial) == ESI(목표값) → Serial = 76193.

Name : CodeEngn , Serial Number : 76193을 입력해 보았다.

그랬더니, Good Job!이라는 성공 메시지가 나타났음을 알 수 있었다.
정답 :
Name: CodeEngn
Serial: 76193

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