본문 바로가기

INTERTLUDE/리버싱 스터디

Codeengn Basic RCE 7

Codeengn Basic RCE 7

Q. 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우 시리얼이 생성될 때 CodeEngn은 '어떤 것'으로 변경되는가

 

해당 문제를 풀기 위해서는, 우선 C 드라이브의 이름을 -> CodeEngn으로 변경해 주는 과정이 필요하다. 

변경한 이후에는, 7-Zip File Manager로 압축을 풀고 DIE로 파일 정보를 확인해보려고 한다. 

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

프로그램을 실행시키다 보면, 해당 화면이 나타난다. 일단 무작위로 "1357" 이라는 수를 입력해 보았다. 

 

입력한 후에, 우클릭 > Search for > All referenced text strings 과정을 통해 스트링을 살펴보면

이러하게 나타남을 알 수 있다. 4562-ABEX와 L2C-5781 이라는 수상한 문자들도 확인해 볼 수 있다. 

일단 Error! 화면이 나타났기에, 해당 줄의 코드를 살펴보고 싶어서 더블 클릭해보았다. 

 

해당 코드를 통해, Error (실패했을 때 나타나는 메세지박스)와 Well Done (성공했을 때 나타나는 문자를 확인할 수 있었다.)  더불어 주의 깊게 볼 부분은 004010FC이다. -> 왜냐하면 EAX를 0과 비교 후에 00401117로 갈지 / 그냥 내려갈지를 결정하는 분기 지점이기 때문이다. 

  • 디스어셈블 창에서 CMP EAX, 0 명령(주소 004010FC)을 찾고 그 명령 자체에 BP(브레이크포인트) 를 설정
  • 다시 프로그램을 재실행(F9)하거나 Continue 하면, BP에서 멈춤. 
  • 레지스터 창을 확인: EAX 값이 0인지 아닌지 확인.                                                                                                                             :오답 입력 시 EAX ≠ 0(예: EAX = 1) → ZF = 0 → JE 불발 → 다음 명령(에러 루틴) 실행.

-> 결과 확인: 오른쪽에 Error message box (“The serial you entered is not correct!”)가 뜨는 것을 확인.

더불어 코드를 통해 알 수 있는 것은, String2 = "" 부분에 내가 입력한 잘못된 Serial number였던 1357이 들어가 있다는 것이다. 

그렇다면 여기에서 힌트를 얻어서,

 

String2는, 

  • 사용자가 입력한 값. 여기서는 테스트로 넣은 "1357" 이고. 
  • 프로그램은 항상 “내부에서 만든 정답(String1)”과 “사용자가 입력한 값(String2)”를 비교한다는 것을 알 수 있다.

그렇다면 String1은, 

  • 프로그램이 내부적으로 생성한 정답 시리얼이라고 추측해볼 수 있다. 
  • 여기서 핵심은, 원래 C드라이브 이름 "CodeEngn"이 EqfgEngn으로 변형된 후,
    앞뒤로 "L2C-5781", "4562-ABEX" 같은 문자열 조각(우리가 아까 스트링에서 수상하게 봤던 부분!)이 붙어서 최종 시리얼이 만들어진 것이라고 파악해 볼 수 있음. 
더보기

CALL lstrcmpiA : 두 문자열을 대소문자 구분 없이 비교하는 함수 (같으면 EAX=0 반환, 다르면 EAX≠0 반환.) 


동작 원리

  1. 입력이 정답일 때 (String2 == String1)
    • EAX = 0 → CMP EAX,0 → Zero Flag(ZF) = 1
    • JE 00401117 조건이 만족 → 점프 발생
    • 00401117 주소의 루틴 실행 → “Well Done!” 성공 메시지 출력
  2. 입력이 오답일 때 (String2 ≠ String1)
    • EAX ≠ 0 → CMP EAX,0 → Zero Flag(ZF) = 0
    • JE 조건 불충족 → 점프하지 않고 그대로 아래 실행
    • 00401101 ~ Error 루틴 실행 → “The serial you entered is not correct!” 메시지 출력

String1에 담긴 " L2C-5781EqfgEngn4562-ABEX" 문자열을 입력하였을 때, 성공화면 확인할 수 있다. 

곧, ' CodeEngn'은 'EqfgEngn'으로 변경 되었음을 확인할 수 있다. 

문제 해결 완-료 

'INTERTLUDE > 리버싱 스터디' 카테고리의 다른 글

Codeengn Basic RCE 19  (0) 2025.10.08
CodeEngn Basic RCE 4  (0) 2025.10.07
Codeengn Basic RCE 10  (0) 2025.09.30
Codeengn Basic RCE 8  (0) 2025.09.30
Codeengn Basic RCE 6  (0) 2025.09.30