본문 바로가기

Hacking & Security/Reverse Engineering

ASPACK unpacking

문제를 풀다가 Aspack을 처음 접해서 해당 공부 내용을 남기고자 블로깅을 진행한다.

0x00. Packer

패커란 실행 파일 압축기를 의미한다, 정확한 명칭은 Run_Time Packer다.

'실행 압축'이란 실행 파일에 실행 코드를 원본 형태로 두지 않고 압축을 진행한 것을 의미한다.

또한 압축해제 코드를 실행 파일에 같이 넣어놓은것이다.

따라서 프로그램이 실행될 대 먼저 압축해제 코드가 진행되서 원본 실행코드 압축이 풀리고 실행이되어진다.

 

0x01. 패커 사용 목적

패커의 사용목적은 크게 두가지로 나뉜다.

첫번째 사용목적은 실행 파일의 크기를 압축하여 줄이고자 하는 목적

두번쨰 사용목적은 PE 파일 내부의 코드, 소스 등을 감추기 위한 목적이다.

 

0x02. 언패킹

EXEINFO와 같은 툴을 통해 살펴보면 Aspack이 적용된 프로그램들을 확인할 수 있다.

packing의 시작부분이 PUSHAD로 되어있어서 프로그램 시작시 레지스터를 모두 스택에 저장한다.

packing 매커니즘은 간단하게 설명하여 압축된 파일들을 해제하는 부분부터 진행되어진다.

즉 . 압축된 파일들을 해제하고 압축해제가 정상적으로 진행되면 최종적으로 원래의 OEP로 가게 되어 실행이 진행되는것이다.

[압축해제 루틴] -> [압축해제 완료] -> [정상 프로그램 실행] 의 순으로 진행된다.

이따라 하드에 존재하는 패킹된 파일의 크기가 작더라도 압축이 풀린 후 메모리에 로드되어질 때는 정상적인 크기로 올라가게 된다.

 

0x03. 예제 실습 ( CodeEngn basic 10 )

PUSHAD 명령어를 통한 레지스터 적재 | 정상코드 메모리에 복구 | POPAD 명령어를 통한 레지스터값 복구 | OEP로 분기

PUSHAD -> 압축 해제 -> POPAD -> RETN

 

위 루틴에 따르면 PUSHAD로 레지스터값들을 스택에 저장해놓은 후 원본코드가 모두 복구되면 메모리에 POPAD를 통하여

다시 레지스터 값을 참조하게 된다.

바로 이 점을 이용하여 PUSHAD 후 ESP값에 접근하는 지점 ( POPADD 명령어를 통한 접근)에 BP를 걸어놓으면 쉽게 

OEP 분기점 전으로 이동이 가능할 것이다.

 

프로그램 실행 후 정상적으로 메모리 및 레지스터가 복구된 다음 OEP로 분기하기 위해서 ' retn 0c' 라는 명령문을 살펴볼 수 있다.

해당 명령문을 찾아 들어간다.

 

RETN 0C 아래에 push를 하고 해당 위치로 리턴을 진행한다.

두 opcode에 BP를 걸고 프로그램을 실행한다.

 

 

프로그램 실행 결과 PUSH 0 -> PUSH 10.00445834로 변경되었다 다음 opcode를 진행하면 push 된 위치 (00445834)

 

즉, OEP로 뛴다.

 

따라서, OEP 는 00445834가 된다.

OEP로 점프하면 위와 같은 코드가 아닌 다른 코드가 보이는데 거기서 ctrl+a를 눌러 코드를 재분석 해주면 위 그림과 같은 코드를 확인할 수 있다.

 

 

Aspack :  UPX와 유사한 패킹 기법이나 선호도가 낮은 패킹기법.

 

언패킹 루틴 : PUSHAD -> 압축 해제 코드 -> POPAD -> RETN 과정으로 동작

'Hacking & Security > Reverse Engineering' 카테고리의 다른 글

Stolen Bytes  (0) 2019.09.26
x86 그리고 x64  (0) 2019.09.26
#1. Reverse Engineering  (0) 2018.09.21
Reverse Engineering 2  (0) 2017.11.23
Reverse Engineering  (0) 2017.11.23