Security/Reversing

packing과 unpacking

bonggang 2019. 9. 11. 00:05

Packing(실행 압축)

패킹(packing)은 쉽게 말해 코드의 압축을 뜻한다.

실행 압축이란 것은 실행 파일 내부에 코드를 압축, 해제하는 코드를 포함하고 있어서 평소에는 코드가 압축된 상태로 존재하다가 파일을 실행 시킬 경우 압축이 풀어지며 정상적인 원본코드가 메모리에 적재되는 것이다.

(이러한 이유로 메모리상에 올라간 코드를 덤프 떠서 리버싱하기도 한다)

 

패킹의 목적은 파일 사이즈 압축(Compress)과 원본 코드 보호(Protect) 크게 2가지로 나뉜다.

Compressor의 경우 파일의 크기를 줄여 배포를 쉽게 하는 것이 주목적이기 때문에 악성코드에서 빠른 배포를 위해 자주 활용된다. 하지만 별다른 Anti-Reversing 기법이 적용되지 않아 언패킹이 쉽다.

Protector의 경우 실행파일을 보호하는 것이 목적이기 때문에 Anti-Reversing 기법이 적용되어 있다. 코드 가상화 기법과 난독화 기법을 주로 많이 활용하기에 언패킹이 까다롭고 분석이 어렵다.

 

패킹된 파일을 실행 시 압축을 매우 빨리 풀어서 실행시키는데 이 때 엔트리 포인트(시작하는 주소)는 복호화 코드 부분이다. 비어있는 섹션(메모리공간)에 압축된 파일을 압축해제 시켜서 실행하는 구조이며 복호화가 끝날 경우 압축이 풀린 데이터로 JMP한다.

 

Unpacking

패킹된 파일을 Packer를 통해 Unpaceked 상태로 만드는 것을 뜻한다.