Codeengn Basic RCE 13
Q. 정답은 무엇인가?
Codeengn Basic RCE 13번 문제를 풀기 위해서, 먼저 13.exe 문제 파일을 다운로드하였다.
7-zip을 이용하여 압축을 해제한 다음,

DIE 결과, 이 파일은 . NET Assembly로 제작된 프로그램임을 알 수 있었다.
.NET 프로그램은 네이티브 바이너리가 아니라 IL(Intermediate Language)로 구성되어 있기 때문에,
일반적인 디스어셈블러 대신 dnSpy, ILSpy, dotPeek 같은. NET 디컴파일러를 사용하는 것이 적절하기 때문에,
이 문제를 풀 때에는 dnSpy를 사용하였다.

dnSpy로 파일을 열어보면, 프로그램이 Entry Point(메인 함수) 위치를 주석으로 표시해주고 있다.
해당 위치를 더블클릭해 내부 코드로 들어가 보면 다음과 같은 main 함수 코드를 확인할 수 있다.

이러한 main 함수 코드를 확인할 수 있었다.
main 함수 흐름은 크게 3단계다.
① 변수 정의
- cipherText : 암호화된 문자열(Base64 형태)
- passPhrase : 패스프레이즈
- saltValue : salt 값
- initVector : AES 초기화 벡터(IV)
- keySize : 256bit
- hashAlgorithm : MD5
- passwordIterations : 키 스트레칭 횟수(1024)
모두 복호화를 위한 핵심 파라미터들이다.
② 암호문 복호화 → text에 저장
text = RijndaelSimple.Decrypt(cipherText, passPhrase, saltValue,
hashAlgorithm, passwordIterations, initVector, keySize);
즉, 실제 비교 대상은 사용자가 입력하는 값 == 복호화 결과(text)이다.
③ 사용자가 입력한 값(a)과 text 비교
if (a == text)
정답이 text와 일치하면 루프 탈출 → 성공 메시지 출력.
결국 우리가 찾아야 하는 건 Decrypt() 함수의 결과라는 것을 알 수 있다.
그래서 콘솔 입력 라인 근처에 Breakpoint를 걸고 디버깅을 실행해 보았다.
디버깅 중 text 변수를 확인해 보면 다음과 같은 값이 들어있다.

"Leteminman"
즉, Decrypt 결과가 바로 패스워드라는 뜻이기에,
이를 입력하면 "Well Done!"이 출력됨을 확인할 수 있다.

문제 해결 성-공!

'INTERTLUDE > 리버싱 스터디' 카테고리의 다른 글
| Codeengn Basic RCE 11 (0) | 2025.11.26 |
|---|---|
| Codeengn Basic RCE 17 (0) | 2025.11.20 |
| Codeengn Basic RCE 20 (0) | 2025.11.17 |
| Codeengn Basic RCE 16 (1) | 2025.11.11 |
| Codeengn Basic RCE 15 (0) | 2025.11.11 |