[시스템] 변태 패커, Upack

@codemaru · June 26, 2015 · 2 min read

PE 포맷의 각종 잘(?!) 사용되지 않는 Size 필드들을 가지고 장난쳐서 파일을 오버레이 시키곤 하는 변태 패커 중에 Upack이 있다. 자세한 설명은 이 글을 참고하도록 하고,… 언젠가 나도 한 번 당했었는데 웬만한 필드는 다 계산해서 사용하기에 문제가 없다고 생각했는데 섹션 헤더를 구하는 부분에 문제가 있었다. 흔히 별 생각 없이 아래와 같은 코드를 사용하고 있었는데 이게 Upack으로 패킹된 파일에는 문제가 된다.

PIMAGE_NT_HEADERS nt = 적절한 NT 헤더 포인터;  
PIMAGE_SECTION_HEADER sec;  
sec = (PIMAGE_SECTION_HEADER) GetPtr(nt, sizeof(*nt));  

OptionalHeader에 SizeOfOptionalHeader 필드가 있는데 그 값이 일반적인 값이라면 위 코드는 큰 문제 없이 동작한다. 그런데 Upack은 다르다. SizeOfOptionalHeader를 가지고 장난질을 치기 때문에다. 그래서 아래와 같이 해당 필드 값을 토대로 계산을 해 주어야 정확한 섹션 헤더 위치를 얻을 수 있다.

#define \  
GetSectionHeaderFromNt(nt) \  
((PIMAGE_SECTION_HEADER) \  
GetPtr(&(nt)->OptionalHeader, (nt)->FileHeader.SizeOfOptionalHeader))  

덧) 자매품 UPX의 함정도 있다 ㅋㅋ~

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중