본문 바로가기

INTERTLUDE/리버싱 스터디

Codeengn Basic RCE 13

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