본문 바로가기

0x00 /0x01 Reversing

- 실행 압축

# 이번에는 실행 압축이라는 내용입니다. 




# 실행 압축 

- 실행 압축은 말 그대로 실행 파일을 압축하는 것을 의미합니다. 실행 파일 압축을 줄여 실행 압축이라고도 부릅니다.

  시중에 수많은 실행 파일 압축 프로그램이 존재하며, 이러한 프로그램들은 MS-DOS 시절부터 존재했다고 합니다.

  그리고 실행 압축으로 압축된 실행 파일은 일반 압축 파일과는 다르게 압축을 직접 풀어주지 않고, 압축이 된 

  상태로 실행이 가능합니다. 

[ 일반 압축과 실행 압축의 비교 - 출처 : 리버싱핵심원리 ] 



# 실행 압축 목적

- 원래 실행 압축은 옛날 DOS OS를 주로 사용하던 시절에 부족한 보조기억장치(HDD,FDD) 공간을 조금이나마 더 확보하기

  위한 목적으로 사용되었다고 합니다. 

  그러나 현재는 하드디스크 및 장치들이 많이 좋아져서, 요즘에 실행 압축을 사용하는 목적은 예전과 많이 달라졌습니다.

  요즘에는 실행 압축을 함으로써, 실행 파일의 내부 코드와 리소스(문자열, API name String)등을 감추기 위한 용도로 

  사용합니다. 


  예를 들어본다면, 악성파일을 제작자가 안티바이러스 프로그램들을 우회할 방안으로 실행 압축을 한다는 말이죠.

  안티바이러스 프로그램의 악성파일 진단 기법 중 하나가 파일의 시그니처 혹은 특정 위치의 데이터를 데이터베이스화

  하여 검사 대상 파일과 비교하는 방식인데, 이러한 진단 기법을 우회하기 위해 사용되기도 합니다.

  또한 악성파일이 아닌, 자신이 만든 프로그램이 크랙되지 않도록, 즉 코드 및 리소스를 보호하기 위한 용도로도 사용되고

  있습니다.




# 실행 압축에서는 패커라고 불리는 유틸리티와 프로텍터라고 불리는 유틸리티가 있습니다. 

   패커와 프로텍터에 대해서 간단하게 알아봅시다.




# 1.1 패커

- 패커는 실행 파일 압축기를 의미하며, 정확한 명칭은 Run-Time 패커라고 불립니다. (PE 파일 전문 압축기)


# 1.2 패커의 사용 목적

- PE 파일의 크기를 줄이는데에 사용합니다.

- PE 파일의 내부 코드와 리소스를 감추기 위해 사용합니다.


# 1.3 패커 종류

- 패커는 2가지 종류로 나눌 수 있는데, 평범한 PE 파일을 만들어 내는 순수한 의도의 패커와 의도적으로 원본 

  파일을 크게 변형하고, PE 헤더를 심하게 훼손시키는 불순한 의도의 패커로 나눌 수 있습니다.

  (불순한 의도의 패커란, Virus, Trojan, Worm과 같은 악성 프로그램을 위한 패커를 의미합니다)


- 순수한 의도의 패커(VirusTotal에서 진단 안됨) : UPX, ASPack 등

- 불순한 의도의 패커(VirusTotal에서 진단됨)     : UPack, PESpin, NSAnti 등



# 2.1 프로텍터

- 프로텍터는 PE 파일을 리버스 엔지니어링으로부터 보호하기 위한 유틸리티입니다. 

- 따라서 단순히 실행 압축만 하는 것이 아니라, 리버싱을 막기 위한 다양한 기법(Anti-Debugging, Anti-Emulating,

  Code Obfuscating, Polymorphic Code, Garbage Code, Debugger Detection 등)이 추가되는 것 입니다. 


- 위에서 언급한 리버싱을 막기 위한 다양한 기법들은 쓰레기 코드를 추가한다던가, 특정 압축 알고리즘을 이용하여

  소스 코드와 리소스를 보호하는 그러한 기법들입니다. 


# 2.2 프로텍터의 사용 목적

- 프로텍터를 소개하면서 언급했듯이 프로그램을 리버싱하지 못하게 막는데에 사용 목적이 있습니다.

- 특히 상용적인 프로그램을 크랙하여, 불법적으로 사용하는 것들을 방지하기 위해서 사용하는 것 입니다.


# 2.3 프로텍터 종류

- 프로텍터의 종류로는 상용 프로텍터, 공개용 프로텍터로 나눌 수 있으며, 또한 전문적으로 악성 코드에서만

  사용되는 프로텍터들도 있습니다.

- 상용 프로텍터의 예로는 ASProtect, Themida, SVKP 등이 있으며, 공개용 프로텍터로는 UltraProtect, Morphine 등이

   있습니다.







#  calc.exe 파일을 UPX를 이용하여 실행 압축해보겠습니다.


[ 그림 1 ] UPX 실행 압축 프로그램을 이용한 calc.exe 파일 실행 압축

- 보시는 것 처럼 압축율과 파일의 크기 변환, 파일 포맷형식 등을 확인 할 수 있습니다.



# 실행 압축 전의 calc.exe 파일과 실행 압축 후의 calc_upx.exe 파일이 어떻게 차이가 나는지 확인해보도록 해요.



[ 그림 2 ] PE View를 이용하여 비교

- 우선 눈에 확연하게 차이가 나는 것을 볼 수 있는데요, 바로 섹션 헤더부터, 섹션부분입니다.

   6개였던 섹션 헤더 부분은 3개로 줄었구요, 섹션부분 역시 6개에서 3개로 줄었습니다.



# 조금 더 자세하게 살펴봅시다.



[ 그림 3 ] PE View - 실행 압축 전과 후의 첫 번째 섹션 헤더의 Virtual Size 와 Size of Raw Data 값

- Virtual Size 값은 메모리에서 섹션이 차지하는 크기를 의미하죠, 그리고 Size of Raw Data 값은 파일에서 섹션이 차지하는 크기

  입니다. 그런데 UPX 압축 후의 파일을 살펴보면 Size of Raw Data가 0인 것을 확인할 수 있습니다. 즉, 첫번째 섹션인 UPX0 섹션은

  파일에서 크기가 0이라는 것이라는 겁니다. 파일에선 0인데 메모리 로딩되었을 땐, 9C000의 크기를 가지네요.

  즉, 이말은 upx로 압축된 실행 파일인 calc_upx.exe 파일은 실행을 함으로써, PE 파일이 메모리에 로딩되면서 압축이 

 해제된다는 점을 추측할 수 있습니다. 그리고 압축 해제가 완료되면 원본의 EP 코드를 실행하게 되는 것 입니다.



# 이번 포스팅은 여기까지 하구요. 다음 포스팅에서 UPX 실행 압축된 파일을 실제로 디버깅해보도록 하겠습니다.








# 참고 도서 및 참고 자료


- 리버싱 핵심원리

http://www.hauri.co.kr/information/issue_view.html?intSeq=109&page=9&article_num=108 

  (하우리 보안이슈 분석 - 실행압축과 악성코드)