본문 바로가기

INTERTLUDE/리버싱 스터디

Codeengn Basic RCE 12

Codeengn Basic RCE 12

 

Q. Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다. 이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면

파일을 HexEdit로 오픈 한 다음 0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다.

문제 : Key값과 + 주소영역을 찾으시오. Ex) 7777777????????

 

해당 문제를 풀기 위해, 12.exe  문제 파일을 다운로드 받아주었다.

 7-Zip File Manager로 압축을 풀고 DIE로 파일 정보를 확인해보려고 한다.

DIE를 통해서, 해당 파일이 UPX로 패킹이 되어 있지 않다는 사실을 알 수 있다.

만일 패킹이 되어 있다면 언패킹 과정을 거쳐야 하지만, 그렇지 않기에 Immunity Debugger로 가서 바로 파일을 열어주었다. 

 

F9 키를 누르고 프로그램을 실행 시켜보았더니, 위에처럼 key를 입력하는 칸이 나타났다.

나는 아직 'key' 값을 잘 모르기에, 임의로 '11111' 이라는 숫자를 넣어보았다. 

 

또한, 코드의 흐름을 살펴보면

GetModuleHandleA → DialogBoxParamA 순으로 키 입력 다이얼로그를 생성한다는 것을 알 수 있었다.

 

그 다음에는, 

(우클릭 > Search for > All referenced strings) 과정을 통해 문자열을 확인해보고

MessageBoxA()가 출력되는 구문의 근처 코드로 이동하였다. 

1) 성공 / 실패 분기 지점 찾기 

 

  • 문자열(Referenced strings)에서 성공 메시지(Congratulation 등) 를 단서로 호출 근처를 역추적.
  • 바로 위에서 분기 조건 확인:
    • 0040107D   CMP EAX, 7A2896BF
      00401082   JNZ SHORT ...
  • EAX == 0x7A2896BF 이면 점프하지 않고 성공 경로(= 성공 메시지 출력)
  • EAX != 0x7A2896BF 이면 실패 경로로 점프
  • 여기서 0x7A2896BF는 즉시값(상수) 이며, 정답(Key)과 직접적으로 연결 된다는 것 파악 가능 -!                                 

2) 입력 → 레지스터(EAX) 반영 확인

 

 

 

분기 위치(0040107D)에 BP 설정 → F9 실행 -> 다이얼로그에 11111 입력 후 멈춘 시점 레지스터 확인.

 

  • EAX = 0x2B67
    → 16진수 0x2B67 = 10진수 11111
    즉, 사용자 입력 정수가 그대로 EAX에 로드되어 비교된다.

3) 정답(키) 산출 — HEX → DEC

 

  • 계산기로 변환했을 때
  • 0x7A2896BF (hex) = 2049480383 (dec)
  • 곧, 우리가 찾는 Key의 값은,  2049480383 임을 확인할 수 있다. 

그렇다면 key 값을 구했다면,

이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하기 위해서 파일을 HexEdit로 오픈해보았다. 

 

4) 성공 메시지 → Key로 바꾸기 (HxD Overwrite)

  • HxD로 12.exe 파일을 열어 성공 메세지 문자열이 있는 구간을 찾아보았다.
  • 우리는 성공 메세지 대신 key 값이 표시되도록 덮어쓰려고 하기에, 원래의 성공 메세지 위에 key 값을 적어주었다.                   -> 그러면 기존의 문자열이 key 값으로 덮어쓰이게 된다. (Overwrite 과정) 
  • 해당 ASCII 영역을 Key 문자열 2049480383로 덮어쓴 뒤, 문자열 끝에는 반드시 00(NULL terminator)을 유지해주었다.  
  • 그렇다면 우리가 바꾼 파일이 잘 실행 되는지 확인하기 위해서, 변경 사항을 포함하여 다시 저장을 하고 파일을 열어보았다. 
더보기

** 주의사항 ** 

  • 0040107D 같은 값은 가상주소(VA), 0x0D3B는 파일 오프셋(raw offset) 이다. 둘은 직접 일치하지 않는다.
  • 오버라이트 시 원래 문자열 길이를 넘기지 말고, 마지막에 NULL(00) 을 유지해야 한다.

5) 실행 검증

 

 

  • 수정 후 저장 → 실행하면, → Congratulation (성공 메시지) 대신에 2049480383 (key 값) 이 MessageBox의 텍스트로       출력되는 것을 확인할 수 있었다. 
  • Key: 2049480383
  • 파일 오프셋(주소영역): 0x0D3B ~ 0x0D45
  • 답(Key값과 + 주소영역) : 20494803830D3B0D45

 

문제 해결 성-공! 

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

Codeengn Basic RCE 15  (0) 2025.11.11
Codeengn Basic RCE 14  (0) 2025.11.07
Codeengn Basic RCE 19  (0) 2025.10.08
CodeEngn Basic RCE 4  (0) 2025.10.07
Codeengn Basic RCE 7  (0) 2025.09.30