-
[Lenas Reversing for Newbies] 21Wargame/dreamhack.io 2021. 4. 11. 01:48
지난 20번 실습에 이어 packer에 의해 IAT가 망가진 경우 ImportREC이라는 툴을 활용해 복구하는 작업을 진행한다. 이번 실습에서는 다음과 같은 파일들을 언패킹 한 후 dump 뜨는 연습을 한다.
- RegisterMe.exe(Lenas 강의 초반에서 IAT 개념을 설명하기 위한 예제일 뿐이므로 제외시켰다.)- UnPackMe_FSG2.0.exe
- UnPackMe_UPX.exe
- PCGuard4.06C_UnpackmeAll.exe
- UnPackMe_WinUpack0.39
모든 언패킹 작업은 기본적으로 다음과 같은 과정을 거친다.
(1) OllyDbg 플러그인 등으로 기본적으로 덤프
(2) 문제가 있을 경우, ImportREC을 통해 문제가 있는 부분을 탐색
(3) 문제가 있는 부분을 직접 OllyDbg로 확인한 후, IAT 주소 재설정
1. UnPackMe_FSG2.0.exe
우선 PEiD로 파일을 열어보자. (사실 언패킹이 목적인 실습으로 굳이 PEiD로 열어보지 않아도 되지만, 이후에 실제 프로그램을 분석할 때는 동적 분석을 하기 전에 사전 분석을 먼저 해두는 편이 맞는 것 같아 습관을 들이려 한다.)
PEiD FSG 2.0이라는 패커로 패킹되었다. 이제 OllyDbg로 파일을 열어보자.
EP ESP에 하드웨어 BP를 설정하는 방식으로 OEP를 찾아내 보려고 했지만 통하지 않았다. Ctrl+F8을 통해 트레이싱하다 보면 특정 루프를 계속 돌고 특정 점프문은 실행 안 되는 것을 확인할 수 있는데 해당 지점에 BP를 설정하고 실행해보면 OEP로 가는 명령어임을 알 수 있다.
디버깅 F7을 눌러 실행해보자.
OEP 위와 같이 OEP에 도달한 것을 확인할 수 있다. 옵션에서 OllyDbg 분석을 제거하면 아래와 같은 코드가 나타난다.
OEP 플러그인을 통해 dump를 뜨고(rebuild IAT 옵션 해제) dump 된 파일을 실행하면 정상적으로 실행되지 않는 것을 확인할 수 있다. Import REConstructor를 실행시켜보자.
ImpREC 1.7e 위와 같은 인터페이스를 갖는 IAT 조정 프로그램이다. 상단의 콤보박스 컨트롤을 이용해 현재 실행 중인 프로세스를 attach 하고 IAT를 수정하면 된다. 디버깅 중이던 파일을 선택해보자.
OEP 설정 우선 OEP를 설정해주어야 한다. OEP가 메모리 상에서 00404000 주소를 가지므로 IAT Infos needed 메뉴란의 OEP를 4000으로 수정한 후, 우측의 IAT AutoSearch 버튼을 눌러보자.
IAT 발견 위와 같이 무언가 발견되었다고 나온다. IAT의 주소가 11E8이라고 나오므로, OllyDbg의 dump창에서 ImageBase 값을 보정한 004011E8 주소로 이동해보자.
IAT 아래쪽 동그라미 친 부분을 살펴보면 확실히 import 된 함수들의 주소가 나열되어 있는 것을 확인할 수 있다. 그러나 위쪽 동그라미가 가리키는 부분도 따라가 보면 함수들의 주소임을 확인할 수 있다. 상단 ImpRec에서 상단 동그라미가 가리키는 주소인 1198로 RVA를 수정해보자.
IAT 수정 빨간색 표시한 부분을 수정한 후, (RVA 수정, Size는 적당히 임의의 값을 주면 된다고 한다) Get Imports 버튼을 누르면 위와 같이 두 개의 Invalid 한 Function이 있다고 나타난다. 우측의 Show Invalid 버튼을 클릭하면 해당 함수들의 정보가 나타난다.
Invalid 함수 1 Invalid 함수 2 Ptr 값을 살펴보면 짐작이 되겠지만 잘못된 값을 지닌 함수다. ImpREC에서 우측 마우스 클릭-> Cut thunks 메뉴를 통해 삭제해주자. 해당 작업이 완료되었으면 하단의 Fix Dump를 통해 잘못된 덤프 파일을 선택해주면, 해당 덤프 파일의 수정본이 이름에 언더바('_')가 추가되어 생성된다. 다음과 같이 문제없이 실행되는 것을 확인할 수 있다.
dump 완료 2. UnPackMe_UPX.exe
PEiD로 파일을 열어보자.
PEiD UPX 패커로 패킹된 것을 확인할 수 있다. 리버싱 핵심원리에서 처음으로 소개되었던 패커다. 이제 OllyDbg로 파일을 열어보자.
EP 역시 UPX 패커로 패킹된 파일답게 PUSHAD 명령어로 시작하고 있다. 해당 명령어를 실행한 후, 다음 POPAD를 만날 때 멈추게 하기 위해 하드웨어 BP를 ESP 레지스터에 설정하고 실행해보자.
OEP 직전 OEP로 가기 직전의 점프 명령어에서 BP에 적중한다.
OEP 하던 대로 덤프를 떠서 실행해보면 역시 오작동하는 것을 확인할 수 있다. ImpRec로 실행 중인 프로세스를 열어보자.
IAT AutoSearch OEP를 보정해주고 IAT AutoSearch 버튼을 누르자 위와 같이 무언가 발견되었다고 나타난다. OllyDbg dump 창에서 해당 지점인 00485278 주소로 이동해보자.
IAT 언뜻 보기에는 주소가 잘 잡힌 듯하다. 스크롤을 조금 올려보자.
IAT ? 그러자 위와 같이 또 다른 import 된 함수 주소가 나타난다. 새로 발견된 주소인 850D8로 RVA를 수정하고 Get Imports 버튼을 눌러보자.
IAT 수정 후 위와 같이 딱히 Invalid 하다고 나타나는 부분도 없으므로 바로 Fix Dump 버튼을 눌러 새로운 덤프를 생성해보자.
dump 정상적으로 실행되는 것을 확인할 수 있다.
3. PCGuard4.06C_UnpackmeAll.exe
PEiD로 파일을 열어보자.
PEiD PC-Guard 4.03이라는 패커로 패킹되었다. OllyDbg로 파일을 열어보자.
EP CLD 명령어 다음에 PUSH EBP 명령어가 나타난다. ESP가 변화하므로 PUSH EBP 명령어가 수행된 직후에 하드웨어 BP를 ESP 레지스터에 설정하여 F9를 이용해 실행하다 보면 다음과 같은 곳에 도달한다.
OEP...? Ctrl+A를 통해 분석을 해보겠다.
OEP 위와 같이 OEP에 도달하였다. F9를 누르면 다음과 같이 흥겨운 음악과 함께 깜찍한 프로그램이 실행된다.
프로그램 실행화면 OEP를 찾았으므로 00401000 주소에 하드웨어 BP를 설정한 후 실행한 후, 덤프를 떠보자. 덤프 된 파일은 역시 정상적으로 실행되지 않으므로 ImpREC를 통해 열어보자.
IAT 수정 IAT 정보에 대해 OEP를 1000으로 수정하고 IAT AutoSearch를 누르자 위와 같은 정보가 나타난다. 405000 주소로 OllyDbg에서 이동해보면 별다른 문제가 없어 보인다. 바로 Fix Dump 버튼을 통해 덤프 파일을 수정하면 정상적으로 프로그램이 실행되는 것을 확인할 수 있다.
4. UnPackMe_WinUpack0.39
PEiD로 파일을 열어보자.
PEiD Upack 패커로 패킹된 것을 확인할 수 있다. 리버싱 핵심원리에서도 다뤘던 패커로, 굉장히 어려웠던 기억이 난다. OllyDbg로 파일을 열어보자.
EP...? 악명 높은 패커 답게 실행시키자마자 예외를 발생시켜 ntdll로 이동하게 만든다. 메모리 맵을 열어보자.
메모리 맵 위와 같이 PE header 하나의 섹션만 인식되는 것을 확인할 수 있다. 해당 영역에서 직접 EntryPoint를 찾아보자.
EP Entry Point가 1018이라고 나와있다. 프로그램을 다시 실행시킨 후, 401018 지점에 BP를 설정한 후 F9를 누르면 BP에 적중하는 것을 확인할 수 있다.
BP 적중 F8을 이용하여 트레이싱하다 스크롤을 내려보면 다음과 같이 RETN 명령어가 있는 것을 확인할 수 있다. 해당 지점에 BP를 걸고 실행시켜보자.
BP 적중 BP에 적중한다. F7을 눌러 OEP로 점프하는지 확인해보자.
OEP OEP로 점프했다. 이전 예제 파일들과 똑같이 덤프 하고, ImpREC으로 연 후, OEP를 보정해주고 IAT AutoSearch를 통해 IAT를 탐색하고, Get Imports 기능으로 함수들을 Import 하면 정상적으로 IAT가 수정된다. 마지막으로 Fix Dump를 통해 새로운 덤프 파일을 만들면 정상적으로 실행되는 것을 확인할 수 있다. (OEP를 찾는 과정은 어렵지만 다행히 IAT 보정 작업은 그리 어렵지 않다.)
5. Comment
ImpREC을 이용해 다양한 파일들의 IAT를 보정해주는 연습을 해보았다. 오랜만에 PE 구조, IAT, DLL 등에 관련된 내용을 복습할 수 있었다.
반응형'Wargame > dreamhack.io' 카테고리의 다른 글
[Lenas Reversing for Newbies] 23 (0) 2021.04.17 [Lenas Reversing for Newbies] 22 (0) 2021.04.13 [Lenas Reversing for Newbies] 20 (0) 2021.04.04 [Lenas Reversing for Newbies] 19 (0) 2021.04.01 [Lenas Reversing for Newbies] 18 (0) 2021.03.29