EntryPoint 값이 0인 악성 파일 분석

1. Overview
악성 파일을 분석하는 와중 EntryPoint 값이 0인 특이한 샘플이 발견되어 이에 대한 이야기를 다뤄볼까 한다.
상식적으로 생각하면 EntryPoint 값이 0이면 ImageBase, 즉 MZ 시그니처를 실행하려고 시도할 것이므로 Exception 이 발생할 것 같지만 놀랍게도 이 샘플은 정상적으로 악성 행위를 실행한다.
이 글에서는 해당 악성 파일의 악성 행위를 분석하지 않고, 어떻게 EntryPoint 값이 0임에도 실행이 가능한지에 대해서 중점적으로 다룰 것이다.
2. FileInfo
테스트 샘플에 대한 파일 정보는 다음과 같다.
- MD5 : 75FD3FCF3266F76055249B51B7F64F50
- SHA1 : 518E38246D25E56AD825DA47E6A7E5673ECFB8D3
- SHA256 : 329F4A561F3C7DAB1E278B247BB63C4BC89CE6190C0F23A8EFC3290E67FF53DE
- 파일 크기 : 106,496 바이트
VirtusTotal 에서는 66개 엔진 중 57개가 악성으로 진단하고 있다.

3. Analysis
CFF Explorer 로 샘플을 PE 파싱한 결과, Optional Header
의 AddressOfEntryPoint
값이 0임을 확인할 수 있다. 해당 프로그램에서는 이 값이 정상이 아니라 판단하여 Invalid
라는 붉은 문자열을 출력하고 있다.

EntryPoint 는 TLS 디렉토리가 없다는 가정 하에 가장 먼저 실행되는 유저 코드의 RVA 값을 가리킨다. RVA 는 프로그램이 메모리에 로딩된 후 결정되는 ImageBase로부터 떨어진 상대 주소 이므로, RVA 값이 0이란 말은 ImageBase 주소와 동일하다는 의미이며, PE 파일에서는 파일의 시작 지점인 MZ 시그니처가 존재하는 주소라는 뜻이다.
MZ 시그니처는 PE 파일임을 확인하는 매직 값일 뿐, 실행 가능한 코드가 아니기 때문에 이를 실행하려고 시도하면 Exception 이 발생할 가능성이 다분하다.
하지만 가상 환경에서 해당 샘플을 실행하고, Procmon 으로 모니터링한 결과 어떠한 Exception 도 발생하지 않은 채 악성 행위를 실행하는 것이 확인되었다.

사실 여부를 테스트하기 위해 x64dbg
를 실행하여 동적 분석을 진행해 보았다. 샘플은 파일명을 임의로 aa.exe
로 변경했다. 샘플은 0x400000 주소에 로딩되었으며, 예상대로 EntryPoint 도 ImageBase와 동일한 0x400000 주소였다. EntryPoint 에 MZ 시그니처 0x4D 0x5A 가 있는 것 또한 예상대로였다.

하지만 실제로 디버거로 샘플을 열어보니 흥미로운 점이 발견되었다. MZ 시그니처는 어셈블리어에 의해 dec ebp
, pop edx
라는 명령어로 번역되었으며, EntryPoint 로부터 멀지 않은 곳에 멀리 점프하는 jmp
코드가 발견되었다는 점이다.
놀랍게도 실제로 실행한 결과, MZ 시그니처의 명령어를 무리 없이 실행한 후 jmp
명령어의 목적지인 0x4139DE 주소에 무사히 도착했다. 이후 코드는 평범하게 악성 행위를 실행하는 코드로 가득했다.

4. Conclusion
예상과는 달리 EntryPoint 값이 0이어도 별다른 문제 없이 PE 파일을 실행 가능했다. 만약 EntryPoint 주소가 실행 권한이 있는 섹션에 속해 있지 않으면 필터링한다는 조건을 걸면 이런 샘플은 발견하지 못할 수 있다.
단순히 이번 Case 의 샘플뿐만 아니라 내 상식선에서 이상하다고 판단되는 샘플이어도 귀찮아 하지 말고 실행 가능 여부를 실제로 테스트해보아야 할 것이다.