Lena's Reversing for Newbie 21 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
Downloads / Lenas Reversing for Newbies - Tuts 4 You
tuts4you.com
Tutorials Index: 21. Imports rebuilding
사용도구: 올리디버거 2.01, LordPE, Import REC
Lena's Reversing for Newbie 21(이하 원본파일) 분석해보자.
21단계는 분석할 파일이 4개이다.
1. UnPackMe_FSG2.0.exe
2. UnPackMe_UPX.exe
3. PCGuard4.06C_UnpackmeAll.exe
4. UnPackMe_WinUpack0.39.exe
첫 번째 UnPackMe_FSG2.0.exe 파일을 분석해보자.
오류로 생략..
두 번째 UnPackMe_UPX.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다.
올리디버거에 원본파일을 올리면 PUSHAD 명령어로 레지스터를 스택에 저장한다. 이후에 언패킹이 진행되고 OEP로 점프하기 전에 POPAD 명령어로 레지스터를 복구할 것이다.
따라서 PUSHAD 명령어가 수행된 후의 ESP 레지스터에 메모리 브레이크 포인트를 설정해두고 실행하면 위와 같이 POPAD 명령어가 수행되기 전에 중지된다. 즉, 다음 명령어인 JMP로 점프하는 지점이 OEP다.
이 곳이 OEP이므로 덤프하면 된다.
언패킹한 코드를 덤프하기 위해 OllyDumpEx 플러그인을 이용한다. Entry Point에 ImageBase를 뺀 값인 0x00001000을 입력하자.
위와 같이 Entry Point가 0x00401000인 것을 확인할 수 있다.
덤프한 파일을 실행하면 정상적으로 실행되지 않는다. 덤프하는 과정에서 IAT가 깨졌기 때문이다.
따라서 LordPE 도구로 손상된 IAT를 복구하면 된다. Rebuild PE 버튼을 클릭하여 덤프 파일의 PE 헤더를 리빌드해주자.
그럼 위와 같이 올리디버거로 실행하면 OEP부터 디버깅할 수 있다.
세 번째 PCGuard4.06C_UnpackmeAll.exe 파일을 분석해보자.
실행이 안되서 생략..
네 번째 UnPackMe_WinUpack0.39.exe 파일을 분석해보자.
원본파일을 실행하면 언팩하라고 한다.
올리디버거로 실행하면 위와 같이 언패킹을 하는 코드들이 나온다.
메모리 맵을 보면 text, data 등의 영역이 구별되어 있지 않다. 언패킹 코드와 OEP가 같은 영역에 있는 것 같다.
언패킹을 진행하다 보면 RETN 명령어를 만나서 어딘가로 점프한다.
함수 프롤로그가 나오는 것을 보니 이 곳이 OEP임을 추측할 수 있다.
덤프하기 위해 Import REC 도구를 사용하자. 원본파일을 실행하고 Attach하면 된다. 그리고 우클릭 - Advanced Commands - Select Code Section(s) 기능을 클릭하자.
그럼 위와 같이 사용되는 영역이 나오는데 첫 번재 영역만 선택하고 Full Dump 버튼을 클릭한다.
OEP에 0x00271B0 주소를 입력하고 AutoSearch 버튼을 클릭하면 RVA와 Size가 자동으로 설정된다. 그리고 Get Imports 버튼을 클릭하면 사용되는 dll들이 나오는데 valid가 NO 값인 것들을 수정해줘야 한다. Show Invalid 버튼을 클릭하자.
그럼 위와 같이 Invalid 값을 가지는 부분이 표시된다. 우클릭 - Cut thunk(s) 기능을 클릭하자.
그럼 위와 같이 모든 dll의 valid 값이 YES 값이 된다. Fix Dump 버튼을 클릭하여 저장해주자.
LordPE 도구로 불필요한 섹션을 정리하고 리빌드해주자.
PE Editor - Sections 버튼을 클릭하자.
2~3번 째 섹션을 우클릭 - wipe section header 기능으로 지워주고 Save 버튼으로 저장하자.
Rebuild PE 버튼을 클릭하여 리빌드하면 된다. 하지만 덤프가 제대로 되지 않는다.
올리디버거로 수정한 파일을 실행하면 OEP부터 디버깅을 진행할 수 있지만 섹션, IAT가 제대로 복구되지 않은 것인지 완전히 실행되지는 않았다. 다른 도구를 사용해서 덤프를 해봐야 한다.