정보보호 공부

[악성코드] PE 파일(포맷) Part 2 - PE 파일 구조 (feat. IAT, 라이브러리)

모카롤 2021. 8. 23. 18:08

 

앞선 글에서 PE 파일 개념 및 생성과정에 대해 살펴봤었다. 이번 글에서는 PE 파일 구조를 살펴보려고 한다.

만약 PE 파일 개념 및 생성과정을 확인하지 않았다면 PE 파일(포맷) Part 1 - PE 파일 개념 및 생성과정을 확인하고 오길 바란다. 

 

 

※ 해당 블로그 정리 글은 강병탁 교수님의 악성코드 수업 자료를 기반으로 작성되었으며,

그 외 참고 자료는 본 글 마지막에 정리해두겠습니다. 참고 부탁드립니다. ※

 

 


PE 파일 구조

 

32비트 PE구조 (위키피디아)

 

32비트의 PE구조는 위의 사진과 같다. 꽤 복잡하고 뭐가 너무 많다. 이렇게 PE 파일 구조를 하나하나 살펴보면 끝이 없고, 결국 길을 잃게 되고 만다. 따라서 실제로 PE 분석 툴을 만들 때 많이 참고하고 공부했던 부분들을 위주로 정리하려고 한다. 총 3가지로 나눠서 정리했으며, 본 글에는 두 번째인 NT 헤더에 대해 자세히 다루려고 한다.

 

※ 첫번째 DOS 헤더는 PE 파일(포맷) Part 1 - PE 파일 개념 및 생성과정 참고 부탁드립니다. ※

 

 


2. NT Header

 

File Heaer 구조체

 

NT 헤더는 위처럼 크게 File Header와 Optional Header로 나눌 수 있다. 일단 File Header를 먼저 살펴보면 아래와 같다.

 


File Header

File Header 구조체

 

필자에게 위 파일 헤더 구조체 중 가장 중요한 것을 3가지 고르라고 한다면 Machine, NumberOfSections, TimeDateStamp를 꼽을 것 같다. 

 

  1. Machine : 실행 가능한 CPU
  2. NumberOfSections : 섹션의 수
  3. TimeDateStamp : 파일을 빌드한 날짜

 

여기서 섹션의 수로 패킹 여부를 추측해볼 수도 있는데, 대게 exe 파일들은 섹션이 4, 5개 이상 존재한다. 하지만 보안상의 문제로 패킹을 해서 배포할 경우, UPX의 경우에는 대게 3개의 섹션으로 줄게 되어 NumberOfSections의 값을 보고 패킹 여부를 추측할 수도 있다. (물론 간단하게 빌드한 exe 파일의 경우에는 섹션이 적을 수 있다.)

 

또한 TimeDateStamp를 통해서 해당 exe 파일의 빌드 날짜가 언제인지 판단할 수 있다. 하지만 간혹 보안상의 문제로 해당 필드의 값을 무의미한 값으로 덮어두는 경우도 있다고 한다. (ex. 1800년대)

 

 


Optional Header

 

Optional 헤더에서 가장 중요하게 볼 부분은 아무래도 IAT이다. IAT를 이해하려면 라이브러리라는 개념을 알고 있어야 하기 때문에 라이브러리부터 살펴보도록 하자.

 

1. 라이브러리

 

라이브러리이미 만들어 놓은 함수나 기능을 정리해 놓은 도서관이라고 보면 좋을 것 같다. c언어를 이용해 코딩할 때, 맨 위에 include 하는 것들이 바로 라이브러리들이다. 개발자들은 이미 만들어 놓은 함수(ex. printf, scanf)를 사용하기 위해서 라이브러리를 가져와서(include) 개발을 하게 된다. 그렇다면 결국 빌드할 때, 내가 코드에 써놓은 함수가 어디 라이브러리에 속해 있는지를 알아야 컴퓨터가 빌드를 해줄 것이다. 따라서 어떤 라이브러리를 참고하면 좋은지 우리가 코드 맨 위에 적게 되는 것이다. 그러면 컴퓨터는 해당 라이브러리들을 보고 링킹을 하게 된다.

(링킹이란 개념이 생소하다면 PE 파일(포맷) Part 1 - PE 파일 개념 및 생성과정 참고!)

 

그리고 라이브러리는 크게 정적 라이브러리와 동적 라이브러리로 두가지 종류가 존재한다. 

 

  • 정적 라이브러리 : 사용하는 라이브러리를 링킹할 때 바이너리에 아예 포함시키는 것으로 해당 PE 파일을 실행시킬 때, 굳이 라이브러리를 찾아볼 필요가 없어 실행 속도가 빨라진다는 장점이 있다. 
  • 동적 라이브러리 : 흔히 말하는 DLL(Dynamic Linking Library)로 사용하는 라이브러리를 IAT에 적어놓고 나중에 필요할 때 참고해서 사용한다. 따라서 실행시 속도는 느려도 프로그램의 크기가 상대적으로 작아진다는 장점이 있다. 

 

2. IAT(Import Address Table)

 

동적 라이브러리 설명을 보면 알 수 있듯이, IATDLL 동적 라이브러리를 사용하기 위해 필요한 테이블이다. 

즉, 윈도우 운영체제는 PE 파일을 실행시킬 때, optional header의 IAT에 적힌 라이브러리 및 API 정보를 확인 후, 실행시 필요한 라이브러리를 사용할 수 있게 준비해서 PE 파일을 실행시키게 된다.

 

따라서 해당 파일이 어떤 DLL 혹은 함수(API)를 사용하는지 알 수 있기 때문에 분석하려는 PE 파일이 어떤 행위를 할 수 있는지 예측이 가능하다. 따라서 IAT는 PE 파일을 분석하는 데 매우 중요하다.

 

 

예를 들어서 필자가 다운 받은 exe 프로그램의 IAT를 확인했는데, 여기에 아래 세 가지 API가 적혀있었다고 보자.

 

  1. WTSEnumerateSessionsW : 세션 정보 검색 API
  2. Keybd_event : 키를 누르는 API
  3. ReadProcessMemory : 다른 프로그램의 메모리를 읽는 API

 

일단 첫번째 API인 WTSEnumerateSessionsW의 경우에는 누가 자신의 PC에 붙어있는지 확인할 수 있는 API다. 대게 악성코드의 경우에는 admin이 들어와 있는지 확인하는 용도로 사용한다. 

두 번째 API인 Keybd_event는 mouse_event API와 함께 원격 조정에 사용할 수 있는 API이다. 즉, 원격 조작을 하고 싶어 하는 악성코드 및 프로그램이 있다면 해당 API를 사용할 확률이 높을 것이다.

세 번째 API인 ReadProcessMemory는 다른 프로그램의 메모리를 읽는 것인데, 보통은 다른 프로그램의 메모리를 쉽게 보여주지 않는다. 왜냐하면 메모리에 중요 정보들이 바이너리로 풀려서 실행되기 때문에 보안상 문제가 있기 때문이다. 그래서 대게 ReadProcessMemory API의 경우에는 백신이 많이 사용한다. 백신의 경우에는 메모리 위에 악성코드나 악성프로그램이 올라가서 실행 중인지 판단을 해야 하기 때문이다. 그리고 악성코드도 해당 API를 많이 사용한다. 왜냐하면 다른 프로그램들을 제어하고 싶어 하기 때문이다. 

 

따라서 위 세가지 API를 사용하는 것으로 보아 필자가 다운로드한 프로그램은 악성 프로그램일 확률이 높으므로 실행 전에 백신 프로그램에 돌려봐야 할 것이다. 

 

 

위처럼 PE 파일 분석에 IAT는 꽤 중요한 부분이다. 따라서 필자가 PE 파일 분석 툴을 만들때도 PE 파일의 NT헤더 중 Optional 헤더의 IAT 정보는 다 나열해서 살펴볼 수 있도록 했었다. 추후 PE 파일의 행위를 추측해보고 싶다면 해당 API를 구글링 해서 확인해보면 되기 때문이다. 

 

 


 

이렇게 PE 헤더 세 파트 중 마지막 파트만 남았다! 

 

실은 한꺼번에 올리는 것이 굳이 다시 찾아보지 않아도 되고 더 편할 것 같다는 생각이 들기도 했지만 역시 나눠서 올리는 것이 옳다는 생각이 들었다.

일단 글이 너무 길어져도 읽기 싫어지는 것이 사람의 심리기도 하고, 솔직히 필자의 경우에는 구글링 하다 보면 A 개념을 찾다가 관련된 B를 몰라서 다시 찾고, 또 C도 찾으며 꼬리를 물다 보면 찾던 것이 무엇인지 모르게 되는 상황이 너무 많았다. 그래서 관련된 개념을 같이 정리하다보니 글이 길어져 나눌 수밖에 없기도 했다.

 

무엇이 더 편할지는 개인의 취향이지만, 필자와 취향이 비슷한 사람이 어딘가에서 이런 글을 찾고 있을지도 모른다는 생각에 무리해서 글을 늘려본다. 이런 글이 취향이던 아니던 PE 파일이 궁금해 들어온 모든 분들에게 조금이나마 도움이 되었길 바란다! :)

 

 

 

참고자료

  1. 리버스 엔지니어링 바이블  코드 재창조의 미학 (강병탁 저)
  2. Python pefile 모듈 : https://github.com/erocarrera/pefile 
  3. 헤더 정보 : https://53c-hi.tistory.com/category/%EB%A6%AC%EB%B2%84%EC%8B%B1?page=2
  4. 헤더 정보 : https://furysecurity.tistory.com/32?category=712491
  5. 헤더 구조체 공식 문서 : https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_section_header