본문 바로가기

리버스-엔지니어링

리버싱 레나 튜토리얼21 - UPX UnPackMe

반응형
리버싱 레나 튜토리얼20 - UnPackMe


이번 문제는 저 프로그램의 패킹을 풀고 덤프를 뜨는 것이 목적이다.


올리디버거에서 디버깅을 하다보면 아래 코드가 보인다.



(PUSHAD) 레지스터 값을 스택에 백업하고
(POPAD) 스택에 저장된 값을 다시 레지스터에 저장한다.

언패킹 중 레지스터 변경 방지를 위해 백업/복구와 유사한 절차를 수행한다.
PUSHAD ~ POPAD 부분에서 언패킹을 수행하며
스택에서 레지스터들이 꺼내지는 순간 OEP로 진입한다.

POPAD까지 실행하고 Dump debugged process를 통해 언패킹된 프로세스를 추출한다.



프로그램 실행이 되지 않아 Rebuild Import를 각각 체크/체크해제를 하고 Dump를 진행하였지만
아래와 같은 오류가 발생한다.



위 좌측 사진은 Rebuild Import를 설정했을 때 발생한 오류다.
원인은 아래와 같다.
프로그램은 특정 API를 실행하고자 할 때 Import Address Table(IAT)를 불러온다.
패커 사용 시 대부분 원래의 IAT를 삭제하거나 변조하기 때문에
프로그램이 제대로 실행되기 위해서는 원본 IAT를 복구해야 한다.

➽ Import Address Table(IAT)
프로그램이 어떤 라이브러리에서 어떤 함수를 쓰는지 기술한 테이블

이때 Rebuild Import 기능을 사용하면 IAT를 자동으로 복구해주지만
해당 프로그램에서는 제대로 복구하지 못한 것으로 생각된다.
우측 사진의 오류 메시지는 프로그램 실행에 필요한 IAT가 누락됐기 때문에 발생한 오류다.
따라서 PEview로 원본 파일과 덤프한 파일을 비교하여 어떤 항목이 누락됐는지 확인한다. 



(우측-원본파일)과 비교해보면 좌측의 언패킹된 파일은 리소스 영역의 IMPORT Hints/Names 가 없다.
따라서 원본 실행파일의 IAT를 별도로 추출해서 덤프된 파일에 덮어 씌운다.

ImportREC 툴을 이용하면 Address Tables를 복원할 수 있다.
올리디버거에서 원본 파일을 실행 후 언패킹된 상태에서
아래 프로그램을 열어서 Active Process에 등록한다.



IAT 정보에 OEP를 입력하기 전에 Peview에서 확인해야 할 항목이 있다.



Image Base - 프로세스의 가상메모리 시작 주소를 지정한다.

프로그램 시작 시 Image Base Data + Size of initialized Data가 OEP인데
Import REC에 OEP는 Size of InitData(1000)만 작성한다.
OEP부터 가져올 값을 Size 항목에서 지정한다.
이후 AutoSearch - Get Imports를 실행하여 원본 파일의 모듈을 불러온다.



Hex Dump를 하여 Import된 모듈을 적용할 덤프파일을 선택한다.
추출한 덤프파일에 적용하고나면 아래 보이는 것처럼 

삭제된 IAT가 복구되므로 프로그램 정상 실행이 가능하다. 




반응형