패킹을 "실행 파일을 압축한 것"이라고만 알면, 압축된 파일이 어떻게 "압축이 풀린 뒤에도 정상 실행"되는지, 그리고 왜 정적 분석 도구(strings, objdump)가 패킹된 바이너리 앞에서는 거의 무용지물이 되는지를 놓치게 된다.
구조 레벨: 패킹된 바이너리의 이중 구조
패킹된 실행 파일은 원본 코드/데이터를 압축(또는 암호화)해서 자기 안에 데이터로 품고 있는 "스텁(stub)" 프로그램이다. 파일의 엔트리 포인트(OEP가 아니라 패커의 엔트리 포인트)는 원본 프로그램이 아니라, 압축 해제 로직으로 이어진다.
- OS 로더가 파일을 실행하면 패커의 압축 해제 스텁이 먼저 실행됨
- 스텁이 파일 안에 데이터로 품고 있던 압축된 원본 코드/데이터를 메모리 상에서 압축 해제
- 압축 해제된 원본 코드를 메모리의 다른(또는 같은) 영역에 써넣음
- 스텁이 원본 프로그램의 진짜 시작 주소(OEP, Original Entry Point)로 점프
- 이 순간부터는 원본 프로그램이 마치 원래부터 그 자리에 있었던 것처럼 정상 실행됨
strings/objdump가 패킹된 파일에 무력한 이유가 여기 있다 — 파일 안에 정적으로 저장되어 있는 건 압축된 바이트일 뿐, 원본 코드/문자열이 아니기 때문이다. 원본은 오직 런타임에, 메모리 상에서만 잠깐 그 모습을 드러낸다.
언패킹: OEP를 찾아서 메모리 스냅샷을 뜨는 것
언패킹의 핵심 아이디어는 간단하다 — "압축 해제가 다 끝나고, 원본 코드로 점프하기 직전"의 메모리 상태를 그대로 덤프하면, 그게 사실상 원본 바이너리다.
- OEP 찾기: 디버거로 실행하며, 스텁이 압축 해제를 마치고 원본으로 점프하는 지점(대개 스택 값이 크게 바뀌거나,
jmp/call 대상이 스텁 코드 영역 밖의 새로 써진 메모리 영역을 가리키는 지점)을 찾는다. UPX 같은 잘 알려진 패커는 관용적인 패턴("popad" 직후의 큰 점프 등)이 있어 도구(upx -d)로 자동 언패킹이 되는 경우도 많다
- 메모리 덤프: OEP에 브레이크포인트를 걸고 그 시점의 프로세스 메모리를 통째로 파일로 떠낸다(
Scylla, ProcDump 등의 도구)
- Import Table 재구성: 여기가 가장 까다로운 부분이다 — 압축 해제 과정에서 원본의 IAT(Import Address Table, 어떤 외부 함수를 어디서 가져오는지 기록한 표)가 스텁에 의해 임시로 다르게 채워져 있는 경우가 많아서, 덤프한 메모리만으로는 어떤 함수가 어떤 라이브러리의 몇 번째 함수였는지 정보가 소실되어 있다.
Scylla 같은 도구가 메모리를 스캔해서 실제 라이브러리 함수 주소와 대조해 IAT를 다시 만들어준다(IAT rebuilding)
- 이렇게 재구성한 덤프 파일이 이제 정상적인 정적 분석 도구로 열리는 "언패킹된" 바이너리다
왜 이 기법이 악성코드/DRM에 널리 쓰이는가
- 정적 시그니처 탐지 회피: 안티바이러스가 알려진 악성코드의 바이트 패턴을 시그니처로 탐지하는데, 패킹하면 파일의 바이트 패턴 자체가 압축 알고리즘 결과로 완전히 바뀌어서 같은 악성코드도 매번 다른 패커/다른 키로 패킹하면 시그니처 탐지를 손쉽게 우회할 수 있다
- 리버싱 난이도 상승: 원본 코드가 정적 분석 단계에서 아예 안 보이므로, 분석가는 반드시 동적 분석(언패킹)을 먼저 거쳐야 한다는 진입 장벽이 생긴다
- 안티 디버깅과의 결합: 패커 스텁 안에 안티 디버깅 로직을 심어두는 경우가 흔해서, 언패킹 시도 자체가 디버거에 의해 탐지되어 막히기도 한다
여기서 끝나지 않는다
- 실전 악성코드 분석에서는 언패킹 이후에야 비로소 정적 분석 글에서 다룬 문자열·심볼 분석이 의미를 가진다 — 언패킹은 "리버싱의 준비 단계"이지 목적 자체가 아니다
- 최신 패커는 단순 압축을 넘어, 코드 자체를 가상 머신(VM) 바이트코드로 변환해 인터프리터로 실행하는 **VM 기반 보호(VMProtect, Themida)**까지 발전했다 — 이 경우 OEP를 찾아 덤프하는 것만으로는 부족하고, VM 인터프리터 자체를 분석해야 하는 훨씬 어려운 문제로 확장된다
패킹을 "압축"이 아니라 **"원본 코드가 오직 런타임 메모리에만 잠깐 존재하도록 만드는 실행 시점 지연 기법"**으로 이해하면, 왜 언패킹의 핵심이 압축 해제 알고리즘 분석이 아니라 **"OEP를 찾아 그 순간의 메모리를 캡처하는 타이밍 문제"**인지가 같은 논리로 설명된다.