악성코드 분석/리버스 엔지니어링

패킹과 언패킹

IT공부 2020. 4. 10. 19:21
반응형

프로그램 코드 크기를 줄이려고 압축하거나 프로그램 분석을 어렵게 만들려고 암호화하는 것을 패킹(Packing)이라고 합니다. 

단순 압축하는 것을 컴프 레싱(Compressing), 암호화하는 것을 프로텍팅(Protecting)이라고 구분 

 

 

컴프 레싱(Compressing)

 

실행 코드를 압축해서 PE 파일의 특정 섹션에 저장하고 프로그램이 실행될 때 공간에 압축을 풀어 실행하는 구조

 

 

프로텍팅(Protecting)

 

실행 파일을 암호화해서 분석을 어렵게 만드는 기술이다. 실행코드는 암호화된 상태로 배포되고, 실행 시점에 복호화되어 동작을 수행한다.

 

 

Packer 

Compressor         Protector
파일 소형화  코드 난독화 
저용량 실행 파일 생성 내부 실행 로직 보호
프로그램 실행 속도 저하  프로그램 크기 증가 , 프로그램 실행 속도 저하 
   
   

 

대표적인 오픈소스 패킹 도구로는 upx(Ultimate packer for executables)가 있다.

 

UPX 패킹된 파일 

 

언패킹에 필요한 코드 영역과 패킹된 데이터가 들어가 있는 영역(Packed data), 언패킹 된 데이터가 저장될 빈 공간(Empty Space)으로 구성된다.

1. 운영체제의 로더가 실행 파일을 메모리의 로딩 

 

2. 진입점(Entry point)으로부터 프로그램이 실행되며, 패킹된 파일의 진입점은 언패킹 코드 영역에 들어 있다.

 

3. 언패킹 코드는 패킹된 데이터를 하나씩 읽어 압축을 풀고,  비어있는 공간에 원본 데이터를 정장

 

4. 모든 코드가 언패킹 되면 원 진입점(Original Entry point)에서부터 프로그램을 다시 시작 

 

 

                                                                   

 UPX로 패킹된 파일과 엔트리 포인트 

 

1. PUSHAD 명령어로 시작한다.  PUSHAD 명령어는 모든 레지스터의 값을 스택으로 백업하는 동작을 수행 

 

2. PUSHAD 명령어 다음으로는 언패킹 코드가 따라온다.  압축된 데이터를 풀어 메모리 특정 영역에 저장한다. 

 

3. 언패킹이 끝나면, POPAD 명령어를 수행하여 스택에 저장된 레지스터 값을 다시 복구 

 

4. 이제 OEP로 점프하여 프로그램의 본래의 기능을 수행한다. 

 

 

IAT(Import Address Table)

 

윈도 응용 프로그램은 DLL 형태의 시스템 라이브러리를 사용하는데, 프로그램이 실행되면서 필요할 때 DLL을 불러와서 사용한다. 

 

어떤 DLL에서 어떤 함수를 참조하는지에 대한 정보가 PE 헤더의 IAT에 저장되어 있다. 

 

Olldbg에서 dump 하여 dump 파일을 실행하면 ,  오류가 발생하는데, 실행파일을 로딩하면서 DLL과 함수를 링크해야 하는데, 이 작업이 수행되지 못하여 원래의 실행 파일에 저장된 IAT 정보를 새로운 파일에 알맞게 갱신해 줘야 한다. 

 

LoadPE라는 도구를 사용하여 IAT 테이블을 복구할 수 있다.