packing, unpacking

ripemo·2025년 2월 12일

packer : PE 파일을 실행가능한 형태로 압축시켜주는 프로그램

  • 압축과 동시에 보호(anti-debugging, encryption 등) 기능 포함하면 protector
  • 단순히 파일의 사이즈만 줄여준다면 packer
  • protector의 안티리버싱 기법에는 anti-debugging, anti-vm(가상머신탐지), code-obfuscating(난독화), polymorphic code(다형성 코드), garbage code(더미 코드), debugger detection 등이 있음

주요기능

  • 실행 압축 기능은 실행하기 전에는 압축된 형태로 존재하고, 실행하는 도중에 이 부분의 압축을 해제하고 실행
  • 패커는 실행 파일의 코드 부분을 압축하고 이 부분의 압축을 해제하는 코드를 추가

언패킹 동작 방식

<UPX로 패킹된 실행파일>

  • unpacking code : UPX로 패킹된 파일을 언패킹할 때 필요한 코드영역
  • packed data : 패킹된 데이터가 들어있는 영역
  • empty space : 패킹된 데이터를 unpacking code를 이용해 언패킹된 데이터를 저장할 공간

<언패킹 과정>
1. 운영체제의 Loader가 패킹된 실행파일을 메모리에 로드
2. 패킹된 파일의 entry point 부터 프로그램이 시작됨. 패킹된 파일의 EP는 unpacking code 안에 있음.
3. unpacking code에서 packed data를 하나씩 읽어 압축을 풀고 empty space에 원본 코드 저장
4. 모두 unpacking 되면 original entrypoint 에서부터 프로그램이 다시 시작

UPX 패커

압축 실행 명령

upx.exe -o packed_file.exe original_file.exe

UPX 패킹의 구조

  • .TEXT 섹션과 .DATA 섹션이 패킹되고 섹션 이름이 변경됨
  • .TEXT 섹션(코드섹션)은 실행 압축되어 UPX0으로 변경, 언패킹 루틴은 UPX1에 저장

패킹의 증상

  • 섹션 Name이 일반적이지 않거나 패커의 이름을 가짐
  • 패킹된 데이터가 언패킹 되면서 저장되어야 하는 섹션이 필요하므로, 비어있는 섹션(RawSize == 0)이 존재하거나, (VirtualSize - RawSize)가 지나치게 큰 섹션이 존재.

    -> 패킹된 실행파일은 RawSize가 작으므로 로드되었을 때 VirtualSize가 Rawsize에 비해 비교적 커지게 된다.

  • EP가 가리키는 섹션이 .TEXT 섹션으로 실행권한을 가지는데, 다른 섹션에 실행권한이 있다.

    -> 패킹되지 않은 일반 실행파일은 코드섹션에 ep가 있지만 패킹된 파일은 데이터 섹션에 ep가 있음

  • EP가 가리키는 코드 섹션이 첫 번째 섹션이 아님
  • 파일 상에 존재하는 문자열과 메모리 상의 문자열에 차이가 남

UPX 언패킹

upx.exe -d -o unpacked_file.exe packed_file.exe

언패킹 과정

  • UPX1 섹션에서 코드(언패킹 루틴 코드)가 실행되는 동안 UPX0 섹션의 코드가 변경되고 있음
  • 언패킹 루틴이 완료된 후, UPX1 섹션에 저장되어있는 윈도우 API 문자열을 이용해 IAT 복구 후 OEP로 이동

수동언패킹

  • Characteristics 값 맨 앞에 E가 있으면 실행가능권한을 가지고 있는 것임.

  • 읽기(0x4)^쓰기(0x8)^실행(0x2) = 0xE

  • 언패킹 루틴

    • 현재 상태의 레지스터 값을 저장한 후에 수행되고 언패킹 과정이 모두 끝나면 저장된 레지스터 값을 복구
    • PUSHAD는 모든 레지스트를 스택에 저장, POPAD는 스택에 저장된 레지스터값을 복원
profile
hackyFrog

0개의 댓글