- Manually Unpacking Morphine
- Computer/Reversing
- 2009/08/06 18:16
- Morphine Manually Unpacking, Morphine Unpacking, 모르핀 수동 언팩, 모르핀 언팩
번역 1차 수정 : 09/07/24
-----------------------------------------------------
1차 수정이 완료되었습니다.
저번에는 그냥 급하게 쓰느라 좀 번역을 제대로 못했는데.
이해하기 쉽게 말을 좀 더 풀어 쓰기 위해 노력했습니다.
아직 한 부분이 완벽하지 않습니다만..
그냥 설명도 그다지 자세하지 않으므로 그냥 넘어가셔도 무방할것 같습니다. (_ _)//
이 글은 2차 수정 이내로 수정을 마칠 계획입니다.
-----------------------------------------------------
1. 제목 : Manually Unpacking Morphine
2. 난이도 : 초급 - 상
3. 사용할 도구 :
Ollydbg v1.10 with Plugin(OllyDump,HideOlly)
PEid 0.93 이상
LordPE
4.강좌
EXE Target을 PEID로 오픈시켜 봅시다.
PEID로 열어보면 이렇게 감지가 됩니다
-------------------------------------------
Morphine 1.4 - 2.7 -> Holy_Father & Ratter/29A
-------------------------------------------
Morphine은 Anti Debugging 기술로 오직 IsDebuggerPresent() 만을 사용합니다.
IsDebuggerPresent 는 상당히 간단한 Anti Debugging 기술이라 상당히 쉽게 우회 할수 있습니다.
OllyHide 플러그인을 사용하면 쉽게 우회 가능합니다 ;)
자,이제 올리디버그로 Target을 열어봅시다 ! (로드 할 때 메세지 박스가 나타나면 YES 를 누르세요)
그러고 나면 밑에 처럼 EP(EntryPoint)에 있을 것입니다.(주의사항 윈도우 버전에 따라서 주소가 다를수 있습니다. 너무신경쓰지 않으셔 됩니다.)
00401596 > $ 7A 08 JPE SHORT NOTEPAD.004015A0 <-- EP
00401598 . 78 06 JS SHORT NOTEPAD.004015A0
0040159A . 7D 04 JGE SHORT NOTEPAD.004015A0
0040159C . 66:C1C5 60 ROL BP,60 ; Shift constant out of range 1..31
004015A0 > 66:83C8 00 OR AX,0
004015A4 . 50 PUSH EAX
004015A5 . 56 PUSH ESI
004015A6 . 81CE 00000000 OR ESI,0
004015AC . 5E POP ESI
004015AD . 58 POP EAX
004015AE . 81C7 00000000 ADD EDI,0
004015B4 . 55 PUSH EBP
004015B5 . 73 06 JNB SHORT NOTEPAD.004015BD
004015B7 . 55 PUSH EBP
004015B8 . 66:BD 8279 MOV BP,7982
004015BC . 5D POP EBP
004015BD > 5D POP EBP
004015BE . 83EA 00 SUB EDX,0
004015C1 . 60 PUSHAD
004015C2 . 8D05 2C010000 LEA EAX,DWORD PTR DS:[12C]
004015C8 . E9 1E000000 JMP NOTEPAD.004015EB
004015C1에 중단점(BP:BreakPoint)을 설치(?) 하도록 합시다. 그리고 실행을 시켜보세요(F9:Run)
아마 그러고 나면 올리디버그는는 004015C1에서 일시정지 할 것 입니다.
이제 브레이크 포인트를 해제하고 PUSHAD 에서 Trace into(F7)를 한번 눌러 주세요.
이제 ESP 레지스터를 봅시다.
오른쪽 클릭후 Follow in DUMP
올리디버그의 CPU창 아래에 있는 데이터 윈도우를 봅시다.
당신은 여기 있을것입니다.(아까도 윈도우 버전에 따라 다를수 있다고 언급드렸습니다)
0012FFA4 F7 03 00 00 D4 BB 12 00 F0 FF 12 00 C4 FF 12 00 ÷..Ô».ðÿ.Äÿ.
0012FFB4 00 F0 FD 7F 04 03 FE 7F B0 FF 12 00 00 00 00 00 .ðýþ°ÿ.....
0012FFC4 C7 14 E8 77 F7 03 00 00 D4 BB 12 00 00 F0 FD 7F Çèw÷..Ô»..ðý
0012FFD4 F0 0C DF F2 C8 FF 12 00 8F C8 53 80 FF FF FF FF ð.ßòÈÿ.ÈS?ÿÿÿÿ
0012FFE4 09 48 E9 77 10 12 E9 77 00 00 00 00 00 00 00 00 .Héwéw........
0012FFF4 00 00 00 00 96 15 40 00 00 00 00 00 ....–@.....
0012FFA4의 4bytes를 드래그 합시다 -> 오른쪽 클릭 브레이크포인트 선택-> Hardware on access->DWORD
그 후 Ctrl + F9 를 누르시고 Ctrl + F7을 눌러 줍시다.
그 다음에 한번 더 F9 를 누르게 되면 여기에 일시정지하고 있을것입니다. (밑에 참조)
004010E9 5E POP ESI ; 0012BBD4 <--
004010EA 5D POP EBP
004010EB 83C4 04 ADD ESP,4
004010EE 5B POP EBX
004010EF 5A POP EDX
004010F0 83C4 08 ADD ESP,8
004010F3 894C24 04 MOV DWORD PTR SS:[ESP+4],ECX
004010F7 FFE0 JMP EAX
004010F7 는 OEP에 가는 통로 입니다(Magic Jamp). 하드웨어 브레이크 포인트를 해제 하도록 합시다.
Debug 메뉴 선택->Hardware Breakpoints->Delete 해주세요
이제 004010F7로 Trace into (F7)합시다.
그러면 우리는 Original Entry Point (OEP)에 도착합니다.
01006AE0 6A 70 PUSH 70
01006AE2 68 88180001 PUSH NOTEPA_1.01001888
01006AE7 E8 BC010000 CALL NOTEPA_1.01006CA8
01006AEC 33DB XOR EBX,EBX
01006AEE 53 PUSH EBX
01006AEF 8B3D 4C110001 MOV EDI,DWORD PTR DS:[100114C] ; kernel32.GetModuleHandleA
01006AF5 FFD7 CALL EDI
01006AF7 66:8138 4D5A CMP WORD PTR DS:[EAX],5A4D
자 이제 과연 끝났을가요 후후..
일단 덤프를 하도록 합시다
음.. 멀 바꿔야 할까요 ? (EP를 바꾸어야 하겠죠? 또 주소번지수도 바뀌었죠 . (00400000 -> 01000000)
OllyDump 로 덤프를 하기 위해 창을 띄우게 되면 이 값을 볼수 있어요 ~
/////////////////////////////////////
Start address:00400000 Size: 15000
Entry Point: 1596 Modify:C06AE0
/////////////////////////////////////
자,Entry Point 를 OEP로 바꾸도록 합시다. (01000000-01006AE0=6AE0)
그리고 Start Address 는 01000000로 설정해주세요 ;) -(위에서 언급하였으므로 설명생략)
Rebuilding Import! 옵션은 체크해제 하시고 자 이제 덤프 !!
두둥.. 덤프 할 수 없답니다. -ㅁ- ; 히밤.(Ollydbg 닫지 말것 절대로)
그런다고 쫄까보나 LordPE로 깝쳐줍시다.
그런데도 안되는 군요 .. -_- IAT 가 정상이 아닙니다..(이 패커는 UPX처럼 IAT를 건드리지 않았음).
왜 이런일이 발생한 걸까?
올리디버그 메뉴에서 M(Memory Map)[Alt+M] 버튼 을 클릭 합시다.
그리고 Memory Image 내용을 봅시다.
아마 이걸 보고 있겠죠 ?
//////////////////////////////////////////////////////////////////////////////////
Memory map
Address Size Owner Section Contains Type Access Initial Mapped as
00010000 00001000 Priv RW RW
00020000 00001000 Priv RW RW
0011F000 00001000 Priv RW Guar RW
00120000 00010000 stack of mai Priv RW Guar RW
00130000 00001000 Map R R
00140000 00010000 Priv RW RW
00240000 00006000 Priv RW RW
00250000 00001000 Map RW RW
00260000 00016000 Map R R DeviceHarddiskVolume1WINDOWSsystem32unicode.nls
00280000 00034000 Map R R DeviceHarddiskVolume1WINDOWSsystem32locale.nls
002C0000 00041000 Map R R DeviceHarddiskVolume1WINDOWSsystem32sortkey.nls
00310000 00006000 Map R R DeviceHarddiskVolume1WINDOWSsystem32sorttbls.nls
00320000 00004000 Priv RW RW
00330000 00003000 Map R R DeviceHarddiskVolume1WINDOWSsystem32ctype.nls
00340000 00001000 Priv RW RW
00350000 00001000 Priv RW RW
00360000 00002000 Map R R
00370000 00003000 Priv RW RW
00380000 00002000 Map R R
00400000 00015000 Imag R RWE
00420000 00005000 Map R E R E
004E0000 00002000 Map R E R E
004F0000 00103000 Map R R
00600000 00066000 Map R E R E
01000000 00013000 NOTEPA_1 PE header Priv RWE RWE
70A70000 00001000 SHLWAPI PE header Imag R RWE
70A71000 0005B000 SHLWAPI .text code,import!s Imag R RWE
70ACC000 00001000 SHLWAPI .data data Imag R RWE
..................................이하 생략
//////////////////////////////////////////////////////////////////////////////////
위의 내용은 OEP 를 찾았을때 경우 입니다. -_-;////
헛다리 짚지 마세요. ////
//////////////////////////////////////////////////
이 패커는 내용물을 바꿔버립니다. (개히밤 패커)
그리고 올리디버그는 실행파일의 섹션이 오직 한 개라고 판단한다.(멍청한 올리 -_-)
시작 주소는 01000000이고 13000 사이즈라고 판단합니다.
또다른 올리디버그로 타겟을 열어봅시다(OEP 찾기전 00401596 가 EP인 상태)
그리고 Memory Image 를 봅시다 (실행하시면 아니되오),그럼 밑에 처럼 볼수 있습니다
//////////////////////////////////////////////////////////////////////////////////
Memory map
Address Size Owner Section Contains Type Access Initial Mapped as
00010000 00001000 Priv RW RW
00020000 00001000 Priv RW RW
0011F000 00001000 Priv RW Guar RW
00120000 00010000 stack of mai Priv RW Guar RW
00130000 00001000 Map R R
00140000 00010000 Priv RW RW
00240000 00006000 Priv RW RW
00250000 00001000 Map RW RW
00260000 00016000 Map R R DeviceHarddiskVolume1WINDOWSsystem32unicode.nls
00280000 00034000 Map R R DeviceHarddiskVolume1WINDOWSsystem32locale.nls
002C0000 00041000 Map R R DeviceHarddiskVolume1WINDOWSsystem32sortkey.nls
00310000 00006000 Map R R DeviceHarddiskVolume1WINDOWSsystem32sorttbls.nls
00400000 00001000 NOTEPAD PE header Imag R RWE
00401000 00013000 NOTEPAD .text code Imag R RWE
00414000 00001000 NOTEPAD .idata import!s Imag R RWE
77E60000 00001000 kernel32 PE header Imag R RWE
.....................................이하 생략
//////////////////////////////////////////////////////////////////////////////////
우리는
헤더(시작 주소 : 00400000 ,사이즈1000)
코드(13000 사이즈)
Import! 섹션(1000사이즈
을 보고 있습니다, [ 총 15000=13000(code)+1000(Import!)+1000(Header) ]
이것들을 잘 비교해봅시다
이것(앞에 것)은 2000 사이즈가 더 작음에도 불구하고
(13000=PE Header가 1000사이즈, 12000은 나머지 두개의 사이즈를 합한것)
나는 한 메모리의 이미지의 섹션이 모든 섹션을 포함할지도 모른다고 가정했다.
(막장 가정이네.. 증명이 없어 . 그냥 직접 실습 응?)
그러므로 저희는 Lord PE로 Partial Dump를 해보도록 합시다.
그리고 LordPE로 생성된 Partial Dump 파일의 섹션을 바르게 고쳐보도록 하죠.
LordPE 열고서 타겟 프로세스 오른쪽 마우스로 클릭하고 Dump partial 선택하시고 주소값을 채웁시다
(주소값 : 01000000 그리고 size 13000)
이제 LordPE Editior를 사용하여 고쳐 봅시다.
그리고 LordPE로 생성된 덤프파일의 섹션을 봅시다.
3개의 섹션이 있을것입니다.. .text (첫번째 섹션) 섹션의 값을 이렇게 바꿉시다
Virtual address=1000=Raw address =>
메모리 이미지에서 01000000에서 시작하는 오직 하나의 세그멘트를 보았다는 것을 기억합시다.
그러므로 PE HEADER 값 1000을 추가하자.
(해설이 좀 난해 합니다. 다음번에 다시한번 수정 고려 중 입니다. 죄송합니다. 대충 한 섹션안에 헤더 사이즈가 포함되어 있었으므로 1000을 쓴 것이라고 간단하게 생각합시다...)
PE헤더는 한 섹션안에 있다.
그리고 넌 01001000 (01000000+1000(헤더))을 가지고 있다 그러므로 01001000-01000000=1000
Virtual address=1000=Raw address => rember that in memory Image the only one
segment U saw was starting at 01000000,so add 1000 of the PE header that's inside it
and U have 01001000 so 01001000-01000000=1000
Virtual Size=Raw Size=12000 =>모든 세그멘트 사이즈는 13000이고 PE Header 1000은 하나의 섹션 안에 있다 가정한다
따라서 13000-1000=12000 이 남는다.
Flags:우리는 플래그 또한 써야한다(멍미)
왜냐면 이 섹션 코드는 Import! 섹션도 있음으로 -_-;.
우리 케이스의 경우 E0000020. - 자세한 언급이 안되어 있었습니다. -ㅁ-;
이제,나머지 섹션 PE Header들을 뜯어 고칩시다.
그리고 DUMPED exe를 실행시켜보면 실행이 됩니다.
저자 왈 :
이 패커 어렵지 않다 . 오직 덤핑할때 약간의 생각만 있으면 된다.
'Computer > Reversing' 카테고리의 다른 글
| QFile 광고 팝업을 제거 해보자 ! (0) | 2009/08/22 |
|---|---|
| 제가 만든 3중 패킹 UnpackMe 입니다. (0) | 2009/08/14 |
| Manually Unpacking Morphine (0) | 2009/08/06 |
| Warcraft 3 1.18 Memory Access Protection Remove (0) | 2009/08/06 |
| 곰인코더 언패킹에 관한 글 (0) | 2009/08/06 |
| CrackerKit 2.0 (0) | 2009/06/01 |





Recent comment