프로세스 다시 덤프하기 – PE 파일 구조 재구성, ImportREC

프로세스 다시 덤프하기 – PE 파일 구조 재구성

앞서 Ollydbg를 이용해 패킹된 프로그램을 수동으로 따라가면서 분석하여 OEP를 찾았지만, 현재 패킹된 상태이기 때문에 프로그램을 종료 후 다시 분석을 진행하게 되면 또 다시 처음부터 분석하여 패킹을 해제해야 한다. 이는 참 불편한 작업이라 할 수 있다. 이를 방지하기 위해 프로그램의 패킹을 해제하고 새로 발견한 OEP 기준으로 프로그램을 다시 빌드 하여야 한다.

여기서는 이 부분에 대해 애기해 보도록 하겠다.

공개용으로 많이 사용되는 UPX를 이용해 PE 파일을 재구성 해보도록 하자. PE 파일 재구성시 ImportREC라는 도구가 추가로 필요하다. ImportREC는 IAT 복구를 도와주는 도구로, 패커들이 IAT를 기본구조와 다르게 만들어서, OEP를 찾아 파일을 재구성하는 것만으로는 정상 실행되지 않을 때 많이 이용하게 된다.

이 ImportREC는 분석가 사이에서 유명한 도구이므로 공식 사이트가 없어 필자 블로그에 업로드 해 두었다.

http://blog.naver.com/allmnet/150139250375

ImportREC외에도 PE 파일을 재구성하는 PE 빌드를 해주는 도구가 필요하다, 이러한 용도로 LordPE도 유용하다. 다음 사이트에서 LoadPE는 다운로드 가능하다.

http://www.woodmann.com/collaborative/tools/index.php/LordPE

Ollydbg는 기본적으로 덤프가 가능하지만, 간혹 데이터를 정상적으로 읽어오지 못하는 경우가 있다. Ollydump라는 플러그인을 이용하면 현재 EIP시점으로 쉽게 파일을 덤프 받을 수 있다. 다음 경로에서 다운로드 하여 Ollydbg 플러그인 디렉토리에 넣자.

http://www.openrce.org/downloads/details/108/OllyDump

Ollydbg 플러그인 경로는 Options à Appearance à Directories 에서 확인하고 변경할 수 있다.

[그림] Appearance 메뉴를 통해 Ollydbg 도구에 대한 환경 설정을 할 수 있다

LoadPE는 PE 파일 구조를 변경하거나, 재구성하는 작업을 진행할 수 있다. 여기서는 UPX로 패킹했던 파일을 패킹 해제하고 이 상태로 파일을 재구성하는 방법에 대해 알아본다. 패킹 파일 해제에 대해서는 앞서 진행하였으니 자세한 내용은 해당 내용을 참고하기 바라고, 여기서는 OEP를 찾은 시점부터 진행하겠다.

↓초기 스택 위치에 재접근할 때 일시 정지하도록 하자.

[그림] ESP 레지스터에 하드웨어 브레이크포인트를 걸어 찾은 OEP

OEP 지점인 100739Dh에 EIP가 위치하였을 때, 조금 전 다운로드한 플러그인인 Dump debugged process를 이용해 프로그램을 덤프 하도록 하자. 어셈블리 창에서 마우스 우클릭을 통해 진행할 수 있다.

[그림] OEP를 기준으로 덤프를 생성

덤프 진행시 현재 언패킹된 상태를 새로운 PE 구조로 변경되는 정보를 확인할 수 있다. 3부에서 진행했던 PE 파일 구조의 내용들을 한번 확인해 보면 이해가 더 쉽다.

그리고 Ollydump로 IAT도 다시 구성할 수가 있는데, Rebuild Import를 이용할 수 있다. 간단히 현재 메모리에서 JMP와 CALL을 검색해 매치시키는 방식으로 검색하여, UPX는 정상적으로 IAT를 구성할 수 있지만, Redirect API(API를 호출하기 위해 여러 번 점프) 기능이 내장된 패커의 경우 정상적으로 IAT를 구성할 수 없으므로 체크를 해제하고 Dump 버튼을 누르자.

↓현 상태에서는 프로그램 실행하기 위해 필요한 PE 구조 중 IAT 구조가 맞지 않아 실행되지 않는다.

↓IAT를 조금 더 자세히 확인해 보면, 패킹된 상태의 IAT주소인 101CE04h UPX가 패킹을 해제할 때 사용하는 API들에 대한 정보만 존재하고, 언패킹이 완료된 이후 실제 이용하는 API는 1001000h에 위치하고 있음을 확인할 수 있다.

[그림] RVA 1000 위치의 IAT 정보를 이용한다

따라서 ImportREC를 이용해 IAT 구조를 재조정해야 할 필요가 있다. ImportREC는 현재 프로그램의 메모리에서 정보를 가져와 IAT를 재구성하므로, 현재 디버깅 중인 Notepad를 닫지 말고 ImportREC를 실행하자. 그리고 실행 중인 프로세스 리스트 중에 노트 패트를 찾아 선택한 후, 우리가 찾은 OEP 주소인 EIP 레지스터의 주소 중 RVA값인 739dh를 입력하고 Autosearch 버튼를 눌려주면, 자동으로 현재 메모리 상태에서 이용 가능한 IAT를 찾는다.

정상적으로 찾았다면 Get Import버튼을 눌려 IAT가 정상적으로 형성되었는지 확인하자.

프로세스 다시 덤프하기 – PE 파일 구조 재구성

[그림] 새로 찾은 OEP를 입력하고 AutoSearch를 통해 현재 IAT를 확인할 수 있다

일부 패커는 IAT를 보호하여 자동으로 검색되지 않을 때도 있다. 이를 위해서 ImportREC에서는 수동으로도 IAT의 상대경로를 Ollydbg로 직접 확인하여 입력할 수 있으며, Show Invalid 버튼은 현재 확인한 IAT 내용 중 일부 오류가 부분에 대해 확인해주는 기능으로, 해당 내용이 맞는지 IAT 확인 창에서 Disassemble / HexView를 이용해 확인하거나, 분석을 통해 오류 부분을 잘라내거나 수동으로 편집하여 고정할 수 있다. 잘못된 내용이 없다면, Ollydbg로 덤프한 파일을 Fix Dump 버튼을 통해 덤프파일에 확인된 IAT를 추가하자.

[그림] 실제 코드를 확인하여, 올바른 API인지 확인할 수 있다

이제 거의 끝까지 온 것 같다. ImportREC를 이용하여 덤프파일을 새로 세션이 추가만 되었을 뿐, 이를 적용하지 않은 상태이므로, IAT의 수정된 내용을 이제 LordPE를 이용해 PE 파일을 재구성할 차례이다. LordPE는 PE 파일 구조 조정이나 다시 빌드와 같은 PE 파일 편집에 특화된 도구이다.

[그림] LordPE를 이용하여 PE 파일을 다시 빌드할 수 있다

정상적으로 실행되는지, PE 파일을 재구성한 노트패드를 실행하면, 정상적으로 실행되는 것을 확인할 수 있으며, ImportREC를 통해 mackt라는 새로운 세션에 IAT가 위치되어 있는 것을 확인할 수 있다.

이처럼 PE 구조는 프로그램 실행 조건에 맞도록 필수 구성 요소만 맞춰주게 되면, 프로그램을 실행하는 것에는 문제가 없다는 것을 다시 한 번 확인할 수 있다.

[그림] PEview로 확인한 ImportREC로 추가한 세션

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.