Iriton's log

[CodeEngn] Basic RCE - L08 본문

Reversing/Wargame

[CodeEngn] Basic RCE - L08

Iriton 2023. 11. 15. 10:13

OEP를 구하시오 Ex) 00400000

 

필요 개념 정리

  • OEP: Original Entry Point - 패킹된 파일의 실제 프로그램 시작 부분
  • OEP 이전의 실행 부분은 패킹된 파일이 메모리에 로드되어 압축을 푸는 명령어가 들어 있다.
  • UPX 패킹: PUSHAD로 레지스터 백업 → 아바축 해제 루틴 실행 → POPAD로 레지스터 값 복구 → OEP로 점프
  • UPX 패킹 파일 구조:[SECTION UPX1] - 압축 코드가 저장되어 있는 공간
  • [SECTION UPX0] - 메모리에 로드된 후 압축 코드가 해제될 공간
  • JMP: 압축 해제 루틴 맨 밑에 있는 원본 코드로 이동하기 위한 명령.
  • 이 명령이 실행되어 이동하는 주소가 원본 코드의 시작점인 OEP이다.
  • BP: Break Point - 값이 변경된 경우를 위한 정지점
  • Ollydbg 단축키F8: 한줄 실행 - 호출되는 함수의 내부동작까지는 보여지지 않음.F2: 원하는 코드에 Break를 걸 수 있음.
  • Ctrl + F2: 프로그램을 초기화 (실행한 코드를 원래대로)
  • F7: 한줄 실행- 호출되는 함수의 내부까지 타고 들어가 한줄 실행됨.
  • F9: 프로그램이 종료될 때까지 코드를 실행

 

풀이

문제에서 원하는 OEP에 대해 먼저 알아보자.

OEP는 Original Entry Point의 약자로, 패킹된 파일의 실제 프로그램 시작 부분이다.

OEP 이전의 실행 부분은 패킹된 파일이 메모리에 로드되어 압축을 푸는 명령어가 들어 있다고 한다.

 

해당 프로그램이 어느 언어로 컴파일 되었는지, 패킹, 크립팅, 프로텍팅 여부와 어느 툴에 의해 패킹되었는지 볼 수 있는 PEiD를 사용하여 열어 보자.

 

UPX로 패킹된 걸 볼 수 있다.

 

UPX 패킹 순서는 아래와 같다.

PUSHAD로 레지스터 백업 → 아바축 해제 루틴 실행 → POPAD로 레지스터 값 복구 → OEP로 점프

 

추가적으로 UPX 패킹 파일 구조는 아래와 같다.

[SECTION UPX0] - 메모리에 로드된 후 압축 코드가 해제될 공간

[SECTION UPX1] - 압축 코드가 저장되어 있는 공간

 

exe 파일을 실행시켜보면 볼 수 있는 평범한 계산기 프로그램이다.

여기서 얻을 건 없으니 코드 분석을 위해 디버거로 열어 봐야 한다.

 

앞서 살펴 봤던 UPX 순서에 포함되어 있던 PUSHAD가 바로 보인다.

패킹의 첫 구간인 거 같다.

그럼 이제 OEP로 점프되기 전인 POPAD를 찾아야 한다.

 

스크롤 내리다 보면 POPAD 명령이 보인다.

압축의 맨 끝 코드에 JMP와 함께 숫자가 적혀 있다.

여기서 JMP는 압축 해제 루틴 맨 밑에 있는 원본 코드로 이동하기 위한 명령이다.

이 명령이 실행되어 이동하는 주소가 원본 코드의 시작점인 OEP이다.

즉, 뒤에 JMP 뒤의 주소로 이동해서 OEP를 구해야 한다.

 

 

직접 언패킹을 해보기로 했다.

upx 파일 안에 언패킹 하고 싶은 파일인 08.exe를 넣어두고 해당 파일 주소 입력칸에 cmd 라고 치면 해당 파일에 접근되어 있는 명령 프롬프트가 실행된다.

upx.exe -d 08.exe 를 입력해주면

Unpacked 1 file이라고 뜬다. 언패킹이 된 것이다.

이 과정에서 올리디버거는 끄도록 한다.

 

 

다시 올리디버거를 켜봤다.

이때 맨 처음 시작되는 주소가 OEP가 된다.

즉 OEP는 01012475가 된다.

 

'Reversing > Wargame' 카테고리의 다른 글

[CodeEngn] Basic RCE - L10  (0) 2023.11.21
[CodeEngn] Basic RCE - L09  (1) 2023.11.21
[CodeEngn] Basic RCE - L06  (0) 2023.11.15
[CodeEngn] Basic RCE - L05  (1) 2023.11.15
[CodeEngn] Basic RCE - L04  (0) 2023.11.14
Comments