[Rev] 리버싱 · 작성: 2026-07-19 19:32:50 · 조회 1
패킹(Packing)은 원본 실행 파일을 압축하거나 암호화해서 별도의 스텁(stub) 코드로 감싸는 기법이다. 원래는 파일 크기를 줄이려는 목적이었지만, 정적 분석(strings, 디스어셈블)을 무력화하는 효과가 있어서 악성코드에서 분석 회피 목적으로 널리 쓰인다.
패킹된 파일을 실행하면:
즉 파일 상태에서는 원본 코드가 아예 존재하지 않고, 실행되는 순간에만 메모리에 나타난다. 그래서 파일을 그대로 디스어셈블해봐야 스텁 코드만 보이고 strings도 의미 있는 문자열을 거의 못 찾는다.
# Detect It Easy(DIE) — GUI/CLI 모두 지원, 패커/컴파일러 시그니처 DB 보유
diec ./target
# PEiD (Windows, 구식이지만 여전히 참고됨)
엔트로피(entropy)가 비정상적으로 높은 섹션이 있으면 압축/암호화되어 있다는 신호다. 많은 도구가 섹션별 엔트로피를 같이 보여준다.
UPX는 가장 흔한 오픈소스 패커라서 자체 언패킹 옵션이 있다.
upx -d ./packed_target
전용 언패커가 없다면, 실행시켜서 원본 코드가 메모리에 다 풀린 시점(OEP 도달 시점)을 잡아 그 순간의 메모리를 통째로 덤프한다.
VirtualAlloc(Windows) / mmap(Linux)처럼 새 실행 가능 메모리를 할당하는 API에 브레이크포인트를 건다jmp가 나타난다파일을 완전히 언패킹하지 않고, 그냥 디버거/Frida로 실행 중인 프로세스의 동작만 관찰하는 것으로 충분한 경우도 많다. 목적이 "정적 코드를 완전히 복원하는 것"이 아니라 "무슨 동작을 하는지 아는 것"이라면 이쪽이 훨씬 빠르다.
패킹된 파일을 만나면 먼저 알려진 패커인지부터 확인하고(DIE), 알려진 패커면 전용 도구로 몇 초 만에 끝나는 경우가 많다. 커스텀 패커일 때만 위의 수동 언패킹 과정이 필요하다 — 순서를 거꾸로 하면 시간을 많이 버린다.