본문 바로가기

INTERTLUDE/리버싱 스터디

Codeengn Basic RCE 5

Codeengn Basic RCE 5

Q. 이 프로그램의 등록키는 무엇인가

 

이번 주차의 예제 문제를 풀기 위해서는,

1) Detect it easy (DIE)

2) UPX 언패킹

3) VMUnpacker 

--> 먼저 3개의 디버깅 툴을 설치하는 과정이 필요하다. 

DIE에 다운로드한 5.exe 파일을 넣어보면, 사진과 같이 나타남을 알 수 있다. 

우리는 DIE를 통해서, 1) 실행되는 운영 체제와 2) 패킹 여부와 패킹 프로그램에 대해 확인할 수 있는 것이다. 

사진과 같이 패커: UPX로 되어 있다면 -->  UPX로 패킹이 되어 있구나 생각하면 된다.

 

** 만일 패킹이 되어 있다면, 패킹 파일을 Immunity Debugger에서 바로 열면 실행이 되지 않고, 언패킹 과정을 거친 후에

Immunity Debugger 에서 파일을 열어야 정상 실행이 가능하다.   

 

** 언패킹 방법 

아까 다운로드한 upx-4.2.4-win64 폴더에 압축을 풀 exe를 넣고, cmd를 켜서 명령어를 입력한다. 

더보기

 (upx –d –o [저장할 파일명] [원본 파일명])

여기에서 –d는 upx로 압축된 파일 해제 명령이고, -o는 압축 해제 후 생성될 파일 명을 설정하는 명령어이다. 

해당 과정을 거친 이후에, 정상적으로 언패킹이 성공한 것을 확인할 수 있다. 

이제 Immunity Debugger에서 파일을 열어 실행해 보자. 

 Immunity Debugger 에서 파일을 열고 F8키를 눌러 실행하다 보면, 위처럼 해당 화면이 나타난다. 

여기에서 대략적으로 user name과 serial number 값의 입력이 필요하구나 ~ 정도를 예측해 볼 수 있다. 

이후에 우클릭 > Search for > All referenced strings를 열어보면, 

누가봐도 user name과 serial number와 같이 보이는 수상한 값이 나타남을 알 수 있다. 

 

그래서 user name와 serial number 부분에 입력해 보면, 이전에는 Wrong ~ , 이라고 나타났는데, 지금은 Successfully의 화면이  나타남을 알 수 있다. 일단 문제의 정답 찾기에는 성공한 것이다.

그렇지만, 코드에 대해 조금 더 알아보고자 한다. 

 

두가지 입력값을 모두

넣었다면, No name entered, No serial entered 코드를 건너뛰어서 올바른 값인지 / 틀린 값인지 비교하게 된다. 

 

    • Zero Flag (ZF):  ZF 는 CPU 플래그 레지스터의 한 비트로, 연산 결과가 0인지 여부를 기록함.                                            
      • 연산 결과 = 0 → ZF = 1
      • 연산 결과 ≠ 0 → ZF = 0     
    • JNZ (Jump if Not Zero)
      • 조건 분기 명령어
      • 의미: “ZF=0 이면 점프해라”
      • 즉, 두 값이 다를 때 점프
      • 반대로 값이 같아 ZF=1이면 점프하지 않고, 다음 명령으로 그냥 진행합니다.
더보기

(1) 첫 번째 JNZ (00440F39)

  • CMP [UserInput], "Registered User" → 유저명 비교
  • 다르면 → ZF=0 → JNZ 00440F8C로 분기  (wrong 창 함수로 실행)
  • 같으면 → ZF=1 → JNZ 점프 안 함(조건 불충족) → 다음 명령으로 진행

(2) 두 번째 JNZ (00440F56)

  • CMP [SerialInput], "GFX-754-IER-954" → 시리얼키 비교
  • 다르면 → ZF=0 → JNZ 00440F72로 분기 (wrong 창 함수로 실행)
  • 같으면 → ZF=1 → JNZ 점프 안 함(조건 불충족) → 바로 밑의 Congrats 함수 실행

위의 과정들을 통해, 문제에서 요구하는 등록키는 GFX-754-IER-954임을 확인할 수 있다. 

문제 해결 완-료