본문 바로가기

2. Reversing (리버싱)

[2023.11.04] 리버싱 5주차 팀활동

강의 12~ 수강 및 CodeEngn Basic RCE 07, 08 문제풀이를 진행하였다.

 

NT Header

NT Header는 모든 Windows PE 파일의 시작 부분에 나타나는 데이터 구조이다. 이는 파일의 크기, 유형, 및 진입 지점 등 파일에 대한 정보를 포함한다.

 

NT Header 구성요소

  • 도스 헤더 (DOS Header) : DOS Header는 NT Header의 첫 번째 섹션으로 MS-DOS와의 호환성을 위해 사용된다. 이는 파일이 MS-DOS 모드에서 실행될 경우 실행되는 MS-DOS 스텁 프로그램을 포함한다. DOS Header에는 또한 COFF Header로의 포인터도 포함한다.
  • COFF 헤더 (COFF Header): COFF Header는 NT Header 의 두 번째 섹션으로, UNIX 시스템에서 사용되는 COFF 파일 형식을 기반으로 한다. 이는 파일에 대한 정보(ex: 기계 유형, 섹션 수 및 타임스탬프)를 포함한다. COFF Header에는 또한 Optional Header로의 포인터도 포함된다.
  • 옵션 헤더 (Optional Header): Optional Header는 NT Header의 세 번째 섹션으로, 파일에 대한 추가 정보(ex: 이미지 베이스, 진입 지점 주소 및 섹션 정렬)를 포함한다.

 

Optional Header

Optional Header에는 Windows 운영 체제가 파일을 올바르게 로드하고 실행하는 데 중요한 여러 필드가 포함된다.

 

  • Image Base: 이 필드는 이미지가 메모리에 로드되어야 하는 기본 메모리 주소를 지정한다. 64K의 배수이며 일반적으로 0x400000으로 설정된다. 기본 주소가 이미 다른 모듈에 의해 점유된 경우 운영 체제는 이미지를 다른 메모리 주소로 재배치한다.
          
  • Address of Entry Point: 이 필드는 이미지에서 실행 가능한 코드의 시작 주소를 지정한다. 이 주소는 Image Base 필드에 지정된 값인 이미지의 기본 주소에 상대적입니다. 운영 체제가 이미지를 로드할 때 프로그램 실행을 시작하기 위해 이 주소로 제어를 전송한다.
       
  • Base of Code: 이 필드는 이미지에서 코드 섹션의 시작 주소를 지정한다. 코드 섹션은 실행 가능한 코드가 포함된 파일의 일부다. 주소는 이미지의 기본 주소에 상대적이며 코드 섹션에 있는 각 명령의 절대 메모리 주소를 계산하는 데 사용된다.
          
  • Base of Data: 이 필드는 이미지에서 데이터 섹션의 시작 주소를 지정한다. 데이터 섹션은 전역 변수와 같은 초기화된 데이터를 포함하며 섹션의 각 데이터 항목의 절대 메모리 주소를 계산하는 데 사용된다.
          
  • Section Alignment: 이 필드는 이미지에서 섹션의 바이트 정렬을 지정한다. 값은 2의 거듭제곱이고 512 이상이어야 한다. 섹션 정렬은 각 섹션이 지정된 값의 배수인 주소에서 시작하도록 하는 데 사용되며, 이는 메모리 페이지 폴트 수를 줄여 성능을 향상시킬 수 있다.
          
  • File Alignment: 이 필드는 디스크에 있는 이미지의 바이트 정렬을 지정한다. 값은 2의 거듭제곱이고 최소 512여야 한다. 파일 정렬은 각 섹션이 디스크에 정렬되도록 하는 데 사용되며, 이는 디스크 I/O를 줄여 성능을 향상시킬 수 있다.
          
  • Size of Image 이 필드는 모든 헤더와 섹션을 포함하여 메모리의 이미지 크기를 지정한다. 이미지가 로드될 때 운영 체제에서 이미지에 대한 메모리를 할당하는 데 사용된다.
          
  • Subsystem: 이 필드는 Windows GUI, 콘솔 또는 네이티브와 같이 이미지가 실행될 하위 시스템을 지정한다. 운영 체제는 이 필드를 사용하여 이미지를 초기화하는 방법을 결정하고 실행할 적절한 환경을 제공한다.
          
  • Stack Reserve/Commit and Heap Reserve/Commit: 이 필드는 운영 체제가 이미지에 할당해야 하는 스택 및 힙 메모리의 크기를 지정한다. 예약 값은 이미지에 필요할 수 있는 총 메모리 양을 지정하고 커밋 값은 즉시 사용할 수 있는 초기 메모리 양을 지정한다.

CodeEngn Basic RCE 07 풀이

 


실행시키면 해당 창이 뜬다.

아무 문자를 입력하면 not correct 창이 뜬다.

  • GetVolumeInformationA 함수 → 드라이브 정보를 검색 

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa

 

  • lstracat 함수 → 문자열 합치기

이름을 CodeEngn으로 변경해주면

GetVolumeInformationA 이후 40225C에 CodeEngn이 들어간 것을 볼 수 있고

4562-ABEX 와 합쳐진다.

 

 

이후 연산을 통해 EqfgEngn4562-ABEX로 바뀌고

L2C-5781이 EqfgEngn4562-ABEX와 합쳐져 시리얼 넘버는 L2C-5781EqfgEngn4562-ABEX이 된다

 

구하는 값은 EqfgEngn

 

CodeEngn Basic RCE 08 풀이

 

실행 프로그램의 OEP를 구하는 문제이다

OEP란 Original Entry Point로, 패킹된 파일의 실제 프로그램의 시작 부분을 의미한다.

 

파일을 실행시켜보면 계산기로 보이는 창이 뜬다.

 

Exeinfo 프로그램을 이용해 파일의 정보를 알아보면

패킹된 파일임을 알 수 있다.

 

패킹된 파일을 upx 툴을 이용해 언패킹 시켜준다.

upx -d 08.exe를 입력한다.

Exeinfo 프로그램을 이용해 다시 파일의 정보를 살펴보면 맨 아래에 Not packed라 뜨는 것을 보아 무사히 언패킹 된 것을 알 수 있다.

 

언패킹 된 파일을 Olludbg를 이용해 디버깅 해주면

파일의 첫 시작 부분인 OEP를 찾아낼 수 있다.

 

답은 01012475