..

강의 노트 - 패킹과 언패킹

Ch 1. 기초 정적분석 기법

2024-04-04(목) | 보안위협탐지및분석

1. 패킹

패킹(Paking)은 멀웨어 작성자가 탐지 및 분석을 회피하기 위해 사용하는 기술이다. 패킹은 멀웨어의 실행 코드를 압축하거나 암호화하는 과정이고, 언패킹은 런타임에 원래 코드를 복원하는 과정입니다. 패킹과 언패킹의 방법을 공부하면서 멀웨어 분석 기술을 향상시키고 악성 소프트웨어의 동작과 기능을 이해할 수 있다.

멀웨어 작성자의 경우, 패킹은 멀웨어의 크기를 줄이고, 코드를 난독화하고, 서명기반 탐지도구를 우회하는데 도움을 준다. 반대로 멀웨어 분석가는 언패킹을 통해 숨겨진 코드를 밝히고, 멀웨어 패밀리를 식별하고, 정적 및 동적 분석을 수행할 수 있다. 하지만 패킹과 언패킹은 단점도 가지고 있다.

멀웨어 작성자에게 패킹은 멀웨어의 복잡성과 오버헤드를 증가시키고, 코드를 언패킹 도구에 노출시킬 수 있다. 멀웨어 분석가의 경우, 멀웨어가 자체 수정 코드, 다층 패킹, 맞춤형 패커와 같은 언패킹 방지 기술을 사용했을 때 이를 언패킹하는데 많은 시간이 들고 어려움을 겪을 수 있다1.

1.2 패킹 파일

패킹된 파일은 이런 구조를 가지고 있다.

img1

정적 분석 도구는 프로그램의 최상단에서부터 분석을 시작한다. 그러니 정적 분석 도구는 래퍼 프로그램만 분석할 수 있다.

1.2.1 PEiD를 이용한 패커 탐지

PEiD를 이용하면 이 응용프로그램을 빌드할 때 사용했던 패커나 컴파일러를 찾을 수 있다. 실습 코드 중 Lab01-01.exe 실행 파일을 확인해보았다. 이 실행 파일은 지난 주 실습 시간에 확인했듯이 악성 프로그램이다.

image-2

화살표로 표시된 된부분을 보면 이 실행파일이 MS Visual C++ 6.0로 작성된 것을 확인할 수 있습니다.

패킹된 프로그램은 프로그램이 어떻게 작성되었는지 알 수 없기 때문에 패킹된 방법에 대한 정보만을 확인할 수 있다.

1.2.2 UPX로 패킹하기

명령 프롬프트에 ‘java’를 입력해보았다. 그리고 ‘C#’도 입력해보았다.

image image-3 이 차이는 각각의 실행 경로가 환경 변수로 등록되어 있는지의 여부에 따라 나타난다.

명령 프롬프트는 환경 변수를 기반으로 동작하기 때문이다.

UPX 패킹을 하기 위해 이 경로를 환경 변수에 등록해주어야 한다.

image-4

UPX 프로그램이 설치된 경로를 시스템 변수 path에 추가한다. image-5

명령 프롬프트는 그 당시의 환경변수값을 가져온다. 환경변수를 새로 적용했으니 cmd를 껐다가 다시 켜준다.

이제 파일을 패킹해보자. 패킹할 파일이 있는 경로로 이동한다.

image-6

upx <프로그램.exe>를 입력하여 프로그램을 upx 방식으로 패킹할 수 있다.

image-7

PEiD로 다시 프로그램을 열어 제대로 패킹 되었는지 확인하자. image-8

다시 언패킹을 해보자.

image-9


2. PE 파일 포맷

PE 포맷은 윈도우 운영체제에서 사용되는 실행파일, DLL, object 코드, FON 폰트 파일 등을 위한 파일 형식이다. PE 포맷은 윈도우 로더가 실행 행가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체이다. PEview를 이용해 PE 파일을 점검해보자.

먼저 아래 링크에서 PEview를 설치한다. http://wjradburn.com/software/

설치 후 아까 사용한 Lab01-01.exe 파일을 열어보자.

image-10

image-11 좌측에서 볼 수 있는 파일의 헤더와 섹션은 이런 의미를 가지고 있다.

  • .text : CPU가 실행하는 명령어
  • .rdata : 임포트와 익스포트 정보
  • .data : 전역 데이터
  • .rsrc : 아이콘, 이미지, 메뉴, 문자열 같은 실행 파일의 일부

  1. Linkedin - What are the best tools and resources for learning code packing and unpacking methods? https://www.linkedin.com/advice/3/what-best-tools-resources-learning-code-packing