본문 바로가기

Analysis

25. Rich Header

PE 구조에서 DOS 헤더와 COFF 헤더 사이에는 2가지 Stub이 존재한다. 하나는 DOS Program으로써, 대부분 파일에 적혀있듯 This program cannot be run in DOS mode 가 DOS Stub이다.

 

DOS Stub은 실행되지 않는 부분, 도스모드에서 실행을 방지하기 위한 부분이라고 대부분 알고있지만 사실은 도스모드에서 실행되는 부분이다. 최근 프로그램들은 모두 윈도우에서 동작하기 때문에 도스모드에서 실행될 경우에는 "This program cannot be run in DOS mode"라고 출력한 다음 종료하도록 설계해둔 것이다.

 

다른 하나는 Rich Header 인데, 리치헤더는 Rich 문자열 앞부분에 이어져있다. Rich 문자열 앞 부분은 모두 체크섬을 이용해 xor 연산으로 인코딩 되어 있는 상태이다. Rich 문자열 뒤 4바이트가 체크섬이다. 해당 리치 헤더에 대해서는 공식적인 언급은 아예 없고, 공식적인 문서 또한 공개된 바가 없다.(그만큼 숨겨져있다기보다는 굳이 공개하지 않은 느낌이다.)

 

체크섬을 이용해서 리치헤더 영역의 인코딩을 모두 디코딩해주고 나서는 해당 프로그램을 컴파일 할 때 사용한 링커 등의 정보를 알 수 있다.

 

처음 4+12바이트는 시그니처+제로패딩 으로 이루어진다. 시그니처는 DanS 라는 문자열이다.

이후 n x 8 바이트는 @Comp.id 블럭으로써 해당 프로그램을 컴파일할 때 사용한 컴파일러의 종류를 해당 값에 따라 알 수 있다.

마지막 8+x바이트는 푸터이다.

 

 

아래는 실제 해당 영역을 따라가면서 디코딩해본 것이다.

 

먼저, 아래 빨간 부분이 바로 리치헤더 영역이다.

리치헤더 영역

 

위에서 말한 것과 같이 리치헤더 영역은 Rich라는 문자열로 끝나게 되고 그 뒤는 체크섬이 따라오는 형식으로 구성된다.

Rich 문자열
체크섬 값

 

해당 체크섬 값을 이용해서 리치헤더 영역을 디코딩하게 되면 DanS 라는 시그니처 문자열이 먼저 등장하게 되고, 이후에는 제로패딩 영역 이후에 컴파일러 아이디 블럭, 푸터 블럭이 따라오게 된다 해당 값을 기반으로 컴파일러 번호 등을 찾아서 매칭하게 되면 프로그램을 컴파일 할 때 사용한 컴파일러, 링커 등의 종류를 알 수 있게된다.

디코딩

 

사실 리치헤더는 조작이 매우 쉽다고 알려져있다. 실제로 악성코드 중에서는 해당 리치헤더 영역 자체를 날려버린 악성코드도 몇 봤다. 그럼에도 리치헤더가 주목되고 있는 이유는 TI에서 어느정도 쓸모가 있기 때문이라고 생각한다. 건드려지지 않았다는 가정만 한다면 프로그램을 컴파일할 때 사용한 컴파일러나 링커등과 같은 특징점을 손쉽게 추출할 수 있고, 악성코드 간 연관으로 자리잡을 수 있기 때문이다.

반응형

'Analysis' 카테고리의 다른 글

27. Monero coin stealer  (0) 2019.11.26
26. Sodinikibi(Specialist)  (0) 2019.11.21
24. Lazarus's HWP(CES 참관단)  (0) 2019.10.25
23. Lazarus, 연애심리테스트.xls  (0) 2019.10.24
22. Kimsuky's HWP malware  (6) 2019.10.21