Easy Unpack
Finding the original entry point of a packed binary and dumping it once the unpacking stub has run.
Packer 는 실행 파일을 “압축·암호화·변형”해서 분석과 리버싱을 어렵게 만드는 보호 기술입니다. 패커는 주로 리버싱 해킹을 막기 위해 사용합니다.
그리고 언패커란, 패커에 의해 변형·암호화·압축된 실행 파일을 실행 흐름을 따라가며 메모리 상에서 원본 코드가 완전히 복원된 시점, 즉 OEP(Original Entry Point) 를 찾아 정상적인 프로그램 분석이 가능하도록 만드는 모든 행위·기술·도구를 의미합니다.
여기서 저는 아이다로 코드를 분석하겠습니다. IDA 의 Graph View 를 기준으로 실행 흐름을 분석해 보면, 초기 엔트리 포인트에서는 XOR, INC, CMP, JZ/JMP 와 같은 반복적인 루프와 의미 없는 분기 코드들이 다수 관찰됩니다. 이러한 패턴은 패커의 전형적인 복호화 루틴(packer stub) 으로, 실제 프로그램 로직이 아니라 메모리 상에서 원본 코드를 복원하기 위한 준비 단계에 해당합니다.
특히 상단의 루프들은 ecx 를 증가시키며 특정 메모리 영역에 대해 XOR 연산을 반복 수행하고 있으며, 조건 분기를 통해 동일한 루프 구조를 여러 번 순환합니다. 이 구간에서는 정상적인 함수 호출, API 사용, 프로그램 로직의 흐름이 전혀 나타나지 않으며, 제어 흐름 또한 인위적으로 복잡하게 분산되어 있습니다. 이는 정적 분석을 방해하기 위한 패킹 코드의 특징적인 모습입니다.
이러한 복호화 루틴이 종료된 이후, 실행 흐름은 여러 분기를 거쳐 하나의 지점으로 수렴하게 되며, 그 지점이 바로 0x401150 입니다. 이 주소를 기준으로 IDA 는 START OF FUNCTION CHUNK FOR start 라는 표시와 함께 정상적인 함수 구조 분석을 다시 시작합니다.
0x401150 이후의 코드에서는 다음과 같은 변화가 명확히 관찰됩니다.
- 의미 없는 루프와 난독화 분기 구조가 사라짐
lodsb,cmp,jnz등 정상적인 로직 흐름을 가지는 명령어 등장- 실제 조건 판단 및 데이터 처리 코드가 나타남
- 이후 코드 흐름이 프로그램의 논리 구조를 형성하기 시작함
이는 패커 stub 이 모든 복호화 및 메모리 재배치를 완료한 뒤, 제어 흐름을 원본 프로그램의 시작 지점, 즉 OEP 로 넘겼다는 강력한 증거입니다.
x32 디버거를 사용하고 싶으면 이런 방법 또한 있다. Easy Unpack Me 메인 함수에서 EP 주소로 내려간다. 코드를 내려가다 보면, 똑같은 방법으로 의미 없는 분기들이 한 곳으로 모이는 포인트가 보인다.
즉 다시 401150 가 OEP 라고 알 수 있다는 거다. 그러므로 Flag 는 401150 다.


