Lena's Reversing for Newbie 20 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
Downloads / Lenas Reversing for Newbies - Tuts 4 You
tuts4you.com
Tutorials Index: 20. Packers and protectors : an introduction
사용도구: 올리디버거 2.01, LordPE, Detect It Easy 2.04
Lena's Reversing for Newbie 20(이하 원본파일) 분석해보자.
20단계는 분석할 파일이 8개이다. 그리고 패킹과 관련된 프로그램들이다.
1. UnPackMe_CrypKeySDK5.7.exe
2. UnPackMe_EZIP1.0.exe
3. UnPackMe_eXPressor1.3.0.1Pk.exe
4. UnPackMe_MEW1.1.exe
5. UnPackMe_NsPack3.5.exe
6. UnPackMe_NoNamePacker.d.out.exe
7. UnPackMe_Exe32Pack1.42.exe
8. UnPackMe_Fusion3.0.00.c.exe
첫 번째 UnPackMe_CrypKeySDK5.7.exe 파일을 분석해보자.
원본파일을 실행하면 언패킹하라고 한다.
올리디버거로 원본파일을 열어보면 0x0046B6DE 주소부터 디버깅이 되는데 언패킹을 진행할 것이다.
0x0046B6DE ~ 0x0046B6E8 주소까지 어떠한 함수를 호출하고 0x004271B0 주소로 점프한다.
위와 같이 메모리 맵을 보면 0x00401000 주소부터 텍스트 영역이고 0x0046D000 주소부터 a_nice day라는 섹션 영역이다. 따라서 [사진 1-2]에서 확인한 함수들은 언패킹하는 함수들일 것이다. 그리고 0x0046B6F9 주소에서 0x004271B0 주소로 점프하는 것은 OEP로 점프하는 것이라고 생각할 수 있다.
위와 같이 0x004271B0 주소를 보면 함수 프롤로그를 확인할 수 있다.
언패킹한 코드를 덤프하기 위해 OllyDumpEx 플러그인을 이용한다. Entry Point에 ImageBase를 뺀 값인 0x000271B0을 입력하자.
위와 같이 Entry Point가 0x000271B0인 것을 확인할 수 있다.
다음은 LordPE 도구로 불필요한 섹션을 제거하고 손상됐을 수 있는 IAT 테이블 복구해야 한다. PE Editor 버튼을 클릭하여 덤프한 파일을 불러오자.
Sections 버튼을 클릭해보자.
섹션 중에 Have, a nice, day! 세 개의 섹션이 있는데 언패킹을 하는 섹션들이다. 필요없기 때문에 우클릭 - wipe section header 기능을 클릭하여 지워주자.
그리고 위 화면으로 돌아와서 Rebuild PE 버튼을 클릭하자.
그럼 위와 같이 파일 사이즈가 감소한 것을 알 수 있다.
두 번째 UnPackMe_EZIP1.0.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다.
올리디버거로 원본파일을 실행하면 바로 JMP 명령어로 0x004682DC 주소로 점프한다.
0x004682DC 주소로 점프하면 함수 프롤로그가 보이는데 이후에 언패킹을 할 것으로 예상된다.
함수가 끝날 때쯤 보면 0x00468688 주소에서 EAX 레지스터의 값으로 점프한다. 이 때 EAX 레지스터의 값은 0x004271B0이다.
메모리 맵을 보면 0x00401000 주소부터 텍스트 영역이므로 0x004271B0 주소가 OEP임을 알 수 있다.
언패킹이 완료되고 0x004271B0 주소로 점프하면 위와 같이 함수 프롤로그가 보인다. 이 곳이 OEP이다.
OllyDumpEx 플러그인으로 덤프를 하면 된다. Entry Point에 ImageBase를 뺀 값인 0x000271B0을 입력하자.
위와 같이 Entry Point가 0x000271B0인 것을 확인할 수 있다.
LordPE 도구를 이용하여 손상될 수도 있는 IAT를 복구하면 된다.
Rebuild PE 기능을 통해 파일 사이즈가 93%정도로 작아졌다.
세 번째 UnPackMe_eXPressor1.3.0.1Pk.exe 파일을 분석해보자.
원본파일을 실행하면 메시지 박스가 2개 뜬다.
올리디버거로 원본파일을 열어보면 함수 프롤로그가 보인다. 언패킹이 수행될 것이다.
함수 에필로그 전에 [사진 3-1]의 메시지 박스가 뜬다. 언패킹 중에 메시지 박스가 뜨는 것이다.
0x0046BDE7 주소에서 EAX 레지스터의 값을 주소로 점프한다. 이 때 EAX 레지스터의 값은 0x004271B0이다.
메모리 맵을 보면 텍스트 영역이 보이지 않는데 이유는 모르겠다.
0x004271B0 주소를 보면 함수 프롤로그가 보인다. 이 곳이 OEP임을 알 수 있다.
OllyDumpEx 플러그인으로 덤프를 뜨면 된다. Entry Point에 ImageBase를 뺀 값인 0x000271B0을 입력하자.
위와 같이 Entry Point가 0x000271B0인 것을 확인할 수 있다.
*OEP가 0x004271B0 주소임은 알겠는데, 정확히 복구가 되지 않는다. 실습 환경이 문제인지 도구를 잘 못쓴건지 모르겠다. 나중에 다시 봐야함.
네 번째 UnPackMe_MEW1.1.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다.
올리디버거로 원본파일을 실행하면 함수 프롤로그를 확인할 수 있다. 언패킹이 수행될 것이다.
1~3번 프로그램과 달리 리턴 전에 점프하지는 않는다. 대신 현재 스택 값이 0x004001D4 주소이기 때문에 0x004001D4 주소로 리턴한다.
0x004001D4 주소로 리턴하면 스택 값이 0x004271B0 주소로 바뀐다.
(Ctrl+G) 단축키로 해당 주소로 이동해보자.
함수 프롤로그가 보인다. 이 곳이 OEP일 것이라고 생각된다.
OllyDumpEx 플러그인으로 덤프를 뜨자. Entry Point에 ImageBase를 뺀 값인 0x000271B0을 입력하자.
위와 같이 Entry Point가 0x000271B0인 것을 확인할 수 있다.
다섯 번째 UnPackMe_NsPack3.5.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다.
올리디버거로 원본파일을 열어보면 PUSHFD, PUSHAD 명령어를 수행한다. PUSHAD 명령어는 레지스터들을 스택에 저장하는 것인데, 언패킹 하기전에 레지스터 값을 백업해 놓는 것이다. 따라서 언패킹을 수행하고 OEP로 점프하기 전에 POPAD 명령어가 수행될 것이다.
따라서 우클릭 - Search for - All commands... 기능을 클릭하여 popad 명령어를 검색해보자. 그리고 모든 popad 명령어에 브레이크 포인트를 설정하면 된다.
그리고 실행하면 위와 같이 0x0046D615 주소의 POPAD 명령어를 수행하기 전에 중지될 것이다. 0x0046D617 주소를 보면 0x004271B0 주소로 점프한다.
0x004271B0 주소를 보면 함수 프롤로그가 보인다. 따라서 이 곳이 OEP일 것이다.
OllyDumpEx 플러그인으로 덤프를 뜨자. Entry Point에 ImageBase를 뺀 값인 0x000271B0을 입력하자.
위와 같이 Entry Point가 0x000271B0인 것을 확인할 수 있다.
그런데 덤프한 파일을 실행하면 위와 같이 메시지 박스가 뜬다.
LoarPE 도구를 통해 손상된 IAT 테이블을 복구해보자.
위와 같이 Rebuild하면 IAT 테이블이 복구되고 파일 사이즈도 98%로 감소한 것을 확인할 수 있다.
그럼 위와 같이 정상적인 메시지 박스를 확인할 수 있다.
여섯 번째 UnPackMe_NoNamePacker.d.out.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다.
올리디버거로 원본파일을 실행하면 위와 같다. 5번 프로그램과 마찬가지로 PUSHAD 명령어를 수행한다.
따라서 언패킹이 수행되고 POPAD 명령어가 수행될 것이다.
우클릭 - Search for - All commands... 기능으로 POPAD 명령어를 검색하고 브레이크 포인트를 설정해주자.
그리고 실행하면 아무 내용이 없은 메시지 박스가 뜨는데, 안티디버깅 때문이다.
올리디버거 상단 메뉴 중 Debug - Pause 기능을 클릭하고 Debug - Execute til user code 기능을 클릭한다. 그리고 메시지 박스의 확인 버튼을 클릭하면 위와 같이 메시지 박스 함수 호출 직후 주소에 중지된다.
0x0046BB43 주소의 CALL 명령어에 의해 메시지 박스 함수가 호출된 것이다. 그리고 윗 부분을 보면 같은 주소 0x0046C0CF 주소로 점프하는 JZ 명령어가 3개 보이는데, 이 중 마지막 0x0046BB1F 주소의 명령어를 패치해보자.
위와 같이 0x0046BB1F 주소에 브레이크 포인트를 설정하고 JZ 명령어를 JNZ 명령어로 패치하자. 그리고 실행하면 위와 같이 메시지 박스가 뜨는 것을 확인할 수 있다.
마찬가지로 Execute til user code 기능으로 [사진 6-6]의 메시지 박스가 어디서 호출된 것인지 찾아보자. 올리디버거 상단 메뉴 중 Debug - Pause 기능을 클릭하고 Debug - Excute til user code 기능을 클릭한다. 그리고 메시지 박스의 확인 버튼을 클릭하면 위와 같이 메시지 박스 함수 호출 직후 주소에 중지된다.
0x0040E515 주소의 CALL 명령어에 의해 메시지 박스 함수가 호출된 것이다.
(Alt+K) 단축키를 눌러서 콜 스택을 살펴보자. 가장 먼저 호출된 부분인 0x0041BB18 주소로 이동해보자.
콜 스택에 대한 설명은 다음 링크를 참고하면 된다.
참고 링크: https://ko.wikipedia.org/wiki/%EC%BD%9C_%EC%8A%A4%ED%83%9D
콜 스택 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 상향 축적 스택의 콜 스택 레이아웃. 콜 스택(call stack) 이란 컴퓨터 프로그램에서 현재 실행 중인 서브루틴에 관한 정보를 저장하는 스택 자료구조이다. 또한 실행 스택(execution stack), 제어 스택 (control stack), 런 타임 스택 (run-time) 스택 혹은 기계 스택 (machine stack) 이라고도 하며, 그냥 줄여서 스택 (the stack) 이라고도 한다. 소프트웨어 프로그램
ko.wikipedia.org
해당 주소로 이동하면 함수 프롤로그가 보인다. 브레이크 포인트를 설정하고 다시 실행하면 리턴 주소를 알 수 있다.
0x00427302 주소가 리턴 주소이므로 해당 주소로 이동해보자.
위와 같이 0x004272FD 주소의 CALL 0x0041BB18 명령어에 의해 [사진 6-9]의 함수가 실행된 것이다.
현재 루틴에서 윗 부분을 살펴보면 함수 프롤로그가 보인다. 브레이크 포인트를 설정하고 다시 시작해보자.
이번엔 리턴 주소가 커널 주소인 것으로 보아 현재 루틴이 OEP라고 생각된다. 이 곳을 덤프하면 될 것 같다.
OllyDumpEx 플러그인으로 덤프르 뜨자. Entry Point에 ImageBase를 뺀 값인 0x000271B0을 입력하자.
위와 같이 Entry Point가 0x000271B0인 것을 확인할 수 있다.
하지만 덤프 파일을 실행하면 위와 같이 잘못된 메시지 박스가 뜬다.
LordPE 도구로 IAT 테이블을 복구해봤지만 여전히 안된다. OllyDumpEx 플러그인 옵션에 따라서 파일마다 다르게 덤프해야 하는 것 같다.
*나중에 다시 봐야함
일곱 번째 UnPackMe_Exe32Pack1.42.exe 파일을 분석해보자.
원본파일을 실행하면 위와 같다.
올리디버거로 원본파일을 열어보면 EAX 레지스터를 CMP 연산 후 0x00417012 주소로 점프한다. 그리고 EBP 레지스터의 값을 스택에 저장한다. ESP 레지스터의 값은 4bytes 증가할 것이다.
이후에 언패킹이 수행될 것이고 EBP를 복구하기 위해 ESP 레지스터에 접근할 것이다.
따라서 PUSH EBP 명령어를 수행하고 ESP 레지스터의 값에 하드웨어 브레이크 포인트를 설정하고 실행하면 언패킹 이후 OEP로 점프하기 전에 중지될 것이다.
PUSH EBP 명령어를 수행하면 ESP 레지스터의 값은 0x0018FF84 값이다.
해당 값이 가리키는 값에 하드웨어 브레이크 포인트를 설정하고 실행해보자.
그러면 위와 같이 0x0041882A 주소로 점프하기 전에 ESP 레지스터의 값을 CMP 연산한다.
0x0041882A 주소로 점프하면 EAX 레지스터의 값을 주소로 한 번 더 점프한다. 이 때 EAX 레지스터의 값은 0x0040A000 값이다.
0x0040A000 주소로 점프하면 명령어들이 이상하다. [사진 7-3]에서 ESP 레지스터의 값에 하드웨어 브레이크 포인트를 설정하고 중지된 후에 점프하였기 때문에 이 곳이 OEP라고 생각된다. 그런데, 명령어들이 정상적으로 복구되지 않은 것인지 실습 환경때문인지 모르겠다.
OllyDumpEx 플러그인으로 덤프하려고 했지만 섹션 정보도 제대로 뜨지 않는다.
*나중에 다시 봐야함
여덟 번째 UnPackMe_Fusion3.0.00.c.exe 파일을 분석해보자.
원본파일을 실행하면 프로텍트, 압축, 암호화가 걸려 있다.
Softlocx, Crunch 프로텍터인데 못 풀겠다.
*나중에 다시 봐야함