############################################
stolen bytes가 있는 버전에 대한 해법입니다.
############################################
대상 : 입문용+
타겟 : Web Stream Recorder v1.0 Beta 3 (http://www.sytexis.com/) or here
도구 : Soft-Ice 4.05 B334
Ice-Dump
Pe-Editor 1.7
ImportRec & Revergine 1.6 final
Hiew 6.x (핵스 에디터)
환경 : Win 98 SE
이번에 살펴볼 것은 ASProtect 1.23 RC4 - 1.3.08.24 입니다. 가장 최근 버전이죠.
이 버전의 가장 큰 어려움은 stolen bytes 를 찾는 것입니다. 사실 stolen bytes
는 예전 copywrite님이 올리신 '새로운 형태의 Asprotect' 라는 글에서 예견되었던
것입니다. 다만 그 문서의 타겟이 되었던 프로그램의 경우 stolen bytes 가 지워지지
않아, iceDump 의 LastBranch를 통해 찾아갈 수 있었습니다. 하지만 지금의 경우는
조금 다릅니다. 즉 stolen bytes가 OEP로 점프된 이후에는 junk code 들로 인해 코드가
변경되기 때문에 알 수가 없습니다. 그럼 이제 stolen bytes 에 대해 알아보죠.
원래 프로그램은 통상,
8BEC MOV EBP,ESP
6AFF PUSH FFFFFFFF
6800000000 PUSH 00000000 ; needs updating
6800000000 PUSH 00000000 ; needs updating
some codes.........
이런식으로 시작됩니다. 그런데 asprotect의 경우 이러한 시작부분을 미리 실행시킨 후 some codes 부분으로 바로 점프해옵니다. 또한 위 코드 중 push 00000000 부분에서 00000000 는 프로그램마다 다른 값이 들어가므로, 이것을 아는 것이 중요합니다. 즉 stolen bytes를 모른체로 덤프를 해봤자 소용이 없음을 뜻하죠. 또한 사실 새로운 형태의 asprotect의 경우에도 이러한 stolen bytes만 밝혀내면 예전과 동일한 방식으로 언팩킹이 가능합니다. 그럼 실제적인 작업을 시작해보죠.
1. 우선은 OEP를 찾아야 합니다. 이 OEP는 기존의 방법대로 /tracex를 이용해서 찾을 수 있습니다. 다만 새로운 버전의 경우 auto tracer trick(ATT)가 여러번 있어, 여러번 리턴을 해줘야 하는 번거로움이 있습니다. 이 ATT라는 것은 사실 별 문제가 되지 않습니다. 그것들의 루틴을 살펴보면, 바로 리턴되는 것이 특징이죠. 귀찮을 뿐이지 문제가 되진 않습니다. 하지만 /tracex를 사용할 경우 시간이 오래 걸립니다. 언팩킹에서 이러한 작업은 상당히 지루한 것이죠. 특히나 다시 덤프해야 할 때 정말 짜증납니다.
그래서 우린 copywrite 님의 빠른 OEP 접근법을 사용할 겁니다. 자 시작해보죠. 우선 다음과 같이 중단점을 설정하고,
bpx createfilea do "dd esp+38"
그리고 나서 프로그램을 실행시킨 후 데이터 윈도창의 주소가 asprotect 루틴이 나올 때까지 F5를 눌러줍시다. 그러고 나면,
EAX=0068FCE9 EBX=0003676B ECX=01015E18 EDX=0003676B ESI=0003676B
EDI=FFFFFFFF EBP=0068FCC0 ESP=0068FC80 EIP=BFF77B5B o d I S z a P c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FCB8 01015E18 01003CBB 0068FDF4 01003D6A .^...<....h.j=..
0177:0068FCC8 000015A6 0068FF68 01003F4B 0068FDF4 ....h.h.K?....h.
0177:0068FCD8 00FF0000 00FD0000 01004138 00000000 ........8A......
0177:0068FCE8 5C3A4390 474F5250 204D4152 454C4946 .C:\PROGRAM FILE
0177:0068FCF8 59535C53 49584554 4F532053 41575446 S\SYTEXIS SOFTWA
0177:0068FD08 575C4552 53204245 41455254 4552204D RE\WEB STREAM RE
0177:0068FD18 44524F43 575C5245 43455253 4544524F CORDER\WSRECORDE
-----KERNEL32!GetFullPathNameA+0046--------------------------------------PROT32-
016F:BFF77B56 E94C500000 JMP BFF7CBA7
KERNEL32!CreateFileA
016F:BFF77B5B 57 PUSH EDI
016F:BFF77B5C 6827010000 PUSH 00000127
016F:BFF77B61 2BD2 SUB EDX,EDX
016F:BFF77B63 684320FABF PUSH BFFA2043
016F:BFF77B68 64FF32 PUSH DWORD PTR FS:[EDX]
016F:BFF77B6B 648922 MOV FS:[EDX],ESP
016F:BFF77B6E 8B7C2414 MOV EDI,[ESP+14]
016F:BFF77B72 2BC0 SUB EAX,EAX
016F:BFF77B74 8D48FF LEA ECX,[EAX-01]
016F:BFF77B77 F2AE REPNZ SCASB
016F:BFF77B79 8B4C2420 MOV ECX,[ESP+20]
016F:BFF77B7D E305 JECXZ BFF77B84
016F:BFF77B7F 8A01 MOV AL,[ECX]
016F:BFF77B81 8A410B MOV AL,[ECX+0B]
016F:BFF77B84 648F02 POP DWORD PTR FS:[EDX]
016F:BFF77B87 83C408 ADD ESP,08
016F:BFF77B8A 5F POP EDI
016F:BFF77B8B E978790000 JMP BFF7F508
KERNEL32!SetFileAttributesA
016F:BFF77B90 2BD2 SUB EDX,EDX
016F:BFF77B92 68EB1FFABF PUSH BFFA1FEB
016F:BFF77B97 64FF32 PUSH DWORD PTR FS:[EDX]
016F:BFF77B9A 648922 MOV FS:[EDX],ESP
016F:BFF77B9D 8B4C240C MOV ECX,[ESP+0C]
016F:BFF77BA1 E302 JECXZ BFF77BA5
------------------------------------KERNEL32!_FREQASM+6B56----------------------
WINICE: Load32 Obj=0001 Add=016F:BFE11000 Len=0000A000 Mod=IMM32
WINICE: Load32 Obj=0002 Add=0177:BFE1B000 Len=00001000 Mod=IMM32
WINICE: Load32 Obj=0003 Add=0177:BFE1C000 Len=00001000 Mod=IMM32
WINICE: Load32 Obj=0004 Add=0177:BFE1D000 Len=00005000 Mod=IMM32
WINICE: Load32 Obj=0005 Add=0177:BFE22000 Len=00001000 Mod=IMM32
Break due to BPX KERNEL32!CreateFileA DO "dd esp+38"
Break due to BPX KERNEL32!CreateFileA DO "dd esp+38"
:/screendump c:\dump\wsr_1.txt
Invalid command Wsrecord
그리고 나서 데이터 창에 나타난 주소가 실행되는 순간을 잡아봅시다. 그전에 다른 중단점은 모두 지워 버리구요.
bpr 1015E18 1015E18+2 rw if eip==1015E18 do "d esp"
그리고 다시 F5 하고 데이터 창을 봅시다. 그러면 400000 이라는 값이 들어가 있을 겁니다.
EAX=00444886 EBX=01004138 ECX=01019A1C EDX=0068FF68 ESI=00FD0000
EDI=00FF0000 EBP=0068FE08 ESP=0068FDD8 EIP=01015E18 o d I s Z a P c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8 00400000 00444886 D58A0195 0068FE1C ..@..HD.......h.
0177:0068FE08 0068FE10 01003A48 00444476 00000000 ..h.H:..vDD.....
0177:0068FE18 0044486E 00000000 8193BC10 0068FF78 nHD.........x.h.
0177:0068FE28 0068FE3C 00580000 8193BC70 8193BC30 <.h...X.p...0...
0177:0068FE38 00401000 BFF8B6E6 00000000 8193BC10 ..@.............
-------------------------------------------------------------------------PROT32-
016F:01015E18 E80D000000 CALL 01015E2A
016F:01015E1D 91 XCHG EAX,ECX
016F:01015E1E F6F7 DIV BH
016F:01015E20 64CD82 INT 82
016F:01015E23 93 XCHG EAX,EBX
016F:01015E24 D0C9 ROR CL,1
016F:01015E26 CE INTO
016F:01015E27 EF OUT DX,EAX
016F:01015E28 FC CLD
016F:01015E29 858BD858E80C TEST [EBX+0CE858D8],ECX
016F:01015E2F 0000 ADD [EAX],AL
016F:01015E31 00943D32830039 ADD [EDI+EBP+39008332],DL
016F:01015E38 7EDF JLE 01015E19
016F:01015E3A 2CF5 SUB AL,F5
016F:01015E3C 8AFB MOV BH,BL
016F:01015E3E 6856173319 PUSH 19331756
016F:01015E43 58 POP EAX
016F:01015E44 5A POP EDX
016F:01015E45 0FBFF9 MOVSX EDI,CX
016F:01015E48 81C288150000 ADD EDX,00001588
016F:01015E4E 66BF9238 MOV DI,3892
016F:01015E52 682B050000 PUSH 0000052B
016F:01015E57 81EBD5D3A77B SUB EBX,7BA7D3D5
016F:01015E5D 5E POP ESI
016F:01015E5E 0F8912000000 JNS 01015E76
016F:01015E64 0F890C000000 JNS 01015E76
016F:01015E6A E907000000 JMP 01015E76
--------------------------------------------------------------------------------
Break due to BPX KERNEL32!CreateFileA DO "dd esp+38"
Break due to BPX KERNEL32!CreateFileA DO "dd esp+38"
:/screendump c:\dump\wsr_1.txt
:bc *
:bpr 1015e18 1015e18+2 rw if eip==1015e18
Break due to BPR #0177:01015E18 #0177:01015E1A RW IF (EIP==0x1015E18)
:d esp
:/screendump c:\dump\wsr_2.txt
Invalid command Wsrecord
그리고 나서,
bpm esp
다시 F5 하면 ,
EAX=5A007EB5 EBX=00400000 ECX=4605585B EDX=01015F0E ESI=00000000
EDI=4605585B EBP=0068FE08 ESP=0068FDDC EIP=01015F13 o d I s z A p c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8 00400000 00444886 D58A0195 0068FE1C ..@..HD.......h.
0177:0068FE08 0068FE10 01003A48 00444476 00000000 ..h.H:..vDD.....
0177:0068FE18 0044486E 00000000 8193BC10 0068FF78 nHD.........x.h.
0177:0068FE28 0068FE3C 00580000 8193BC70 8193BC30 <.h...X.p...0...
0177:0068FE38 00401000 BFF8B6E6 00000000 8193BC10 ..@.............
-------------------------------------------------------------------------PROT32-
016F:01015F12 5B POP EBX
016F:01015F13 58 POP EAX
016F:01015F14 05469F54A7 ADD EAX,A7549F46
016F:01015F19 5C POP ESP
016F:01015F1A EB44 JMP 01015F60
016F:01015F1C EB01 JMP 01015F1F
016F:01015F1E 9A51579CFCBF00 CALL 00BF:FC9C5751
016F:01015F25 0000 ADD [EAX],AL
016F:01015F27 00B900000000 ADD [ECX+00000000],BH
016F:01015F2D F3AA REPZ STOSB
016F:01015F2F 9D POPFD
016F:01015F30 5F POP EDI
016F:01015F31 59 POP ECX
016F:01015F32 C3 RET
016F:01015F33 55 PUSH EBP
016F:01015F34 8BEC MOV EBP,ESP
016F:01015F36 53 PUSH EBX
016F:01015F37 56 PUSH ESI
016F:01015F38 8B750C MOV ESI,[EBP+0C]
016F:01015F3B 8B5D08 MOV EBX,[EBP+08]
016F:01015F3E EB11 JMP 01015F51
016F:01015F40 0FB703 MOVZX EAX,WORD PTR [EBX]
016F:01015F43 03C6 ADD EAX,ESI
016F:01015F45 83C302 ADD EBX,02
016F:01015F48 8BD0 MOV EDX,EAX
016F:01015F4A 8BC6 MOV EAX,ESI
016F:01015F4C E80C000000 CALL 01015F5D
--------------------------------------------------------------------------------
:/screendump c:\dump\wsr_2.txt
:bl
00) BPR #0177:01015E18 #0177:01015E1A RW IF (EIP==0x1015E18)
:bc *
:bpm esp
Break due to BPMB #0177:0068FDD8 RW DR3
:bc *
:/screendump c:\dump\wsr_3.txt
Invalid command Wsrecord
여기에 중단점이 걸립니다.
여기서
바로 OEP로 가시려면 무수한 00 가 나올 때까지 코드창을 밑으로 내려봅시다. 그러면
아마도,
push 00000000
ret
0000
0000
0000
.......
이런식으로 나올 겁니다. 그러면 push 00000000 에 중단점을 걸고 넘어가시면 되겠습니다. 하지만 우리의 경우 stolen bytes를 찾아야 하므로 F8을 눌러 진행합시다. 그러면 아래의 루틴이 나올건데요.
EAX=01016212 EBX=01017418 ECX=01016212 EDX=010162A4 ESI=01016212
EDI=4605585B EBP=0068FE0C ESP=0068FE04 EIP=01016194 o d I s z a P c
CS=016F DS=0177 SS=0177 ES=0177 FS=4297 GS=0000 DS:01017418=009C
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 0101606C ....8A......l`..
0177:0068FDF8 00400000 00444886 010161A5 00000000 ..@..HD..a......
0177:0068FE08 00000323 00B5807E 01016211 01017412 #...~....b...t..
0177:0068FE18 01016212 00000000 8193A3A0 0068FF78 .b..........x.h.
0177:0068FE28 0068FE3C 00580000 8193A400 8193A3C0 <.h...X.........
0177:0068FE38 00401000 BFF8B6E6 00000000 8193A3A0 ..@.............
-------------------------------------------------------------------------PROT32-
016F:01016186 C3 RET
016F:01016187 55 PUSH EBP
016F:01016188 8BEC MOV EBP,ESP
016F:0101618A 53 PUSH EBX
016F:0101618B 56 PUSH ESI
016F:0101618C 8B750C MOV ESI,[EBP+0C]
016F:0101618F 8B5D08 MOV EBX,[EBP+08]
016F:01016192 EB11 JMP 010161A5
016F:01016194 0FB703 MOVZX EAX,WORD PTR [EBX]
016F:01016197 03C6 ADD EAX,ESI
016F:01016199 83C302 ADD EBX,02
016F:0101619C 8BD0 MOV EDX,EAX
016F:0101619E 8BC6 MOV EAX,ESI
016F:010161A0 E80C000000 CALL 010161B1
016F:010161A5 66833B00 CMP WORD PTR [EBX],00
016F:010161A9 75E9 JNZ 01016194
016F:010161AB 5E POP ESI
016F:010161AC 5B POP EBX
016F:010161AD 5D POP EBP
016F:010161AE C20800 RET 0008
016F:010161B1 0102 ADD [EDX],EAX
016F:010161B3 C3 RET
016F:010161B4 03C3 ADD EAX,EBX
016F:010161B6 BB23030000 MOV EBX,00000323
016F:010161BB 0BDB OR EBX,EBX
016F:010161BD 7507 JNZ 010161C6
016F:010161BF 8944241C MOV [ESP+1C],EAX
--------------------------------------------------------------------------------
:/screendump c:\dump\wsr_2.txt
:bc *
:bpm esp
Break due to BPMB #0177:0068FDD8 RW DR3
:bc *
:/screendump c:\dump\wsr_3.txt
:bl
:/screendump c:\dump\wsr_4.txt
Invalid command Wsrecord
저기서 jnz 다음의 명령에 브뽀를 걸어 반복루틴을 벗어납니다. 그리고 리턴후 도착해서 몇 번의 스텝인을 하다보면,
EAX=0101600A EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000 EBP=0068FF78 ESP=0068FE38 EIP=0101601E o d I s z a P c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8 00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08 00000323 00B57E2A 01015FBD 010171BE #...*~..._...q..
0177:0068FE18 01015FBE 00000000 8193BC10 0068FF78 ._..........x.h.
0177:0068FE28 0068FE3C 00580000 8193BC70 0101600A <.h...X.p....`..
0177:0068FE38 00401000 BFF8B6E6 00000000 8193BC10 ..@.............
-------------------------------------------------------------------------PROT32-
016F:0101601E EB01 JMP 01016021 (JUMP )
016F:01016020 9A8D83D86F4883 CALL 8348:6FD8838D
016F:01016027 2EEB01 JMP 0101602B
016F:0101602A 0F81E888DA50 JNO 51DBE918
016F:01016030 CC INT 3
016F:01016031 58 POP EAX
016F:01016032 6A60 PUSH 60
016F:01016034 6830694200 PUSH 00426930
016F:01016039 2EEB01 JMP 0101603D
016F:0101603C 9A2EEB02CD2057 CALL 5720:CD02EB2E
016F:01016043 EB08 JMP 0101604D
016F:01016045 C9 LEAVE
016F:01016046 1F POP DS
016F:01016047 0D0BC91F0D OR EAX,0D1FC90B
016F:0101604C 0B6681 OR ESP,[ESI-7F]
016F:0101604F 2D56600101 SUB EAX,01016056
016F:01016054 DF8B ESC
016F:01016056 CA8D9A RETF 9A8D
016F:01016059 6845600101 PUSH 01016045
016F:0101605E 5F POP EDI
016F:0101605F 26EB01 JMP 01016063
016F:01016062 F083EC21 LOCK SUB ESP,21
016F:01016066 EB02 JMP 0101606A
016F:01016068 CD20 INT 20 VXDCall 1D24,648D
016F:0101606E F2EB01 REPNZ JMP 01016072
016F:01016071 F289442400 REPNZ MOV [ESP+00],EAX
016F:01016076 EB01 JMP 01016079
--------------------------------------------------------------------------------
:bpm esp
Break due to BPMB #0177:0068FDD8 RW DR3
:bc *
:/screendump c:\dump\wsr_3.txt
Break due to BPX #016F:01015F57
:bc *
:.
:/screendump c:\dump\wsr_stolen.txt
Invalid command Wsrecord
위처럼 stolen bytes를 발견하게 됩니다. 이 값들을 잘 적어둡시다. 사실 이러한 stolen bytes를 발견하는 것은 코드하나하나를 집중해서 바라보아야 합니다. 그리고 나서 OEP로 가는 도중엔 다음과 같은 루틴이 존재하게 됩니다.
EAX=00401000 EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000 EBP=0068FF78 ESP=0068FE34 EIP=01016191 o d I s z a p c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000 DS:01016049=0040BE15
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8 00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08 00000323 00B57E2A B62FE226 00580000 #...*~..&./...X.
0177:0068FE18 01016045 8193BC70 8193BC30 8193BC10 E`..p...0.......
0177:0068FE28 0040BE15 00401000 00000000 00426930 ..@...@.....0iB.
0177:0068FE38 00000060 BFF8B6E6 00000000 8193BC10 `...............
-------------------------------------------------------------------------PROT32-
016F:01016188 8F442700 POP DWORD PTR [EDI+00]
016F:0101618C 58 POP EAX
016F:0101618D 5F POP EDI
016F:0101618E EB01 JMP 01016191
016F:01016190 E8FF354960 CALL 614A9794
016F:01016191 FF3549600101 PUSH DWORD PTR [01016049]
016F:01016197 685C384100 PUSH 0041385C
016F:0101619C 64A100000000 MOV EAX,FS:[00000000]
016F:010161A2 2EEB01 JMP 010161A6
016F:010161A5 9A8D6424EDF3EB CALL EBF3:ED24648D
016F:010161AC 02CD ADD CL,CH
016F:010161AE 208D643C782B AND [EBP+2B783C64],CL
016F:010161B4 E783 OUT 83,EAX
016F:010161B6 EC IN AL,DX
016F:010161B7 6966812DC16101 IMUL ESP,[ESI-7F],0161C12D
016F:010161BE 01C0 ADD EAX,EAX
016F:010161C0 D1E6 SHL ESI,1
016F:010161C2 BC01F05066 MOV ESP,6650F001
016F:010161C7 8135D061010179FEEB7BXOR DWORD PTR [010161D0],7BEBFE79
016F:010161D1 3320 XOR ESP,[EAX]
016F:010161D3 8F442400 POP DWORD PTR [ESP+00]
016F:010161D7 8B442410 MOV EAX,[ESP+10]
016F:010161DB 896C2410 MOV [ESP+10],EBP
016F:010161DF 8D6C2410 LEA EBP,[ESP+10]
016F:010161E3 2BE0 SUB ESP,EAX
016F:010161E5 2EEB01 JMP 010161E9
016F:010161E8 9A8D6424EDF3EB CALL EBF3:ED24648D
--------------------------------------------------------------------------------
:.
:.
:.
:.
:.
:.
:.
:/screendump c:\dump\wsr_oep_1.txt
Invalid command Wsrecord
EAX=0040BE15 EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000 EBP=0068FE38 ESP=0068FDB8 EIP=010162AD o d I S z a p C
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB4 01000B37 00000000 00000000 8193BC10 7...............
0177:0068FDC4 00580000 0068FDD8 01000B4D 19331756 ..X...h.M...V.3.
0177:0068FDD4 073ED94C 00400000 D58A0195 0068FE1C L.>...@.......h.
0177:0068FDE4 00FF0000 00FD0000 01004138 01019A1C ........8A......
0177:0068FDF4 01015E18 00400000 00444886 01015F51 .^....@..HD.Q_..
0177:0068FE04 00000000 00000323 00B57E2A B62FE226 ....#...*~..&./.
0177:0068FE14 00580000 01016045 8193BC70 0068FDBC ..X.E`..p.....h.
-------------------------------------------------------------------------PROT32-
016F:0101628E 8D6424ED LEA ESP,[ESP-13]
016F:01016292 F3EB02 REPZ JMP 01016297
016F:01016295 CD20 INT 20 VXDCall 783C,648D
016F:0101629B 2BE7 SUB ESP,EDI
016F:0101629D 83EC69 SUB ESP,69
016F:010162A0 66812DA9620101C0D1 SUB WORD PTR [010162A9],D1C0
016F:010162A9 26EB01 JMP 010162AD
016F:010162AC F050 LOCK PUSH EAX
016F:010162AD 50 PUSH EAX
016F:010162AE 668135B862010179FE XOR WORD PTR [010162B8],FE79
016F:010162B7 EB7B JMP 01016334
016F:010162B9 3320 XOR ESP,[EAX]
016F:010162BB 8F442400 POP DWORD PTR [ESP+00]
016F:010162BF 8B45FC MOV EAX,[EBP-04]
016F:010162C2 C745FCFFFFFFFF MOV DWORD PTR [EBP-04],FFFFFFFF
016F:010162C9 8945F8 MOV [EBP-08],EAX
016F:010162CC 8D45F0 LEA EAX,[EBP-10]
016F:010162CF 64A300000000 MOV FS:[00000000],EAX
016F:010162D5 64EB01 JMP 010162D9
016F:010162D8 69EB01696862 IMUL EBP,EBX,62686901
016F:010162DE D84000 FADD REAL4 PTR [EAX+00]
016F:010162E1 681C5F0101 PUSH 01015F1C
016F:010162E6 C3 RET
016F:010162E7 0000 ADD [EAX],AL
016F:010162E9 0000 ADD [EAX],AL
016F:010162EB 0000 ADD [EAX],AL
016F:010162ED 0000 ADD [EAX],AL
--------------------------------------------------------------------------------
:.
:d eax
:.
:d esp
:.
:.
:.
:/screendump c:\dump\wsr_oep_2.txt
Invalid command Wsrecord
EAX=0068FE28 EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000 EBP=0068FE38 ESP=0068FDB8 EIP=010162DC o d I S z a p c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB4 0040BE15 0040BE15 00000000 8193BC10 ..@...@.........
0177:0068FDC4 00580000 0068FDD8 01000B4D 19331756 ..X...h.M...V.3.
0177:0068FDD4 073ED94C 00400000 D58A0195 0068FE1C L.>...@.......h.
0177:0068FDE4 00FF0000 00FD0000 01004138 01019A1C ........8A......
0177:0068FDF4 01015E18 00400000 00444886 01015F51 .^....@..HD.Q_..
0177:0068FE04 00000000 00000323 00B57E2A B62FE226 ....#...*~..&./.
0177:0068FE14 00580000 01016045 8193BC70 0068FDBC ..X.E`..p.....h.
-------------------------------------------------------------------------PROT32-
016F:010162A0 66812DA9620101C0D1 SUB WORD PTR [010162A9],D1C0
016F:010162A9 26EB01 JMP 010162AD
016F:010162AC F050 LOCK PUSH EAX
016F:010162AE 668135B862010179FE XOR WORD PTR [010162B8],FE79
016F:010162B7 EB02 JMP 010162BB
016F:010162B9 CD20 INT 20 VXDCall 0024,448F
016F:010162BF 8B45FC MOV EAX,[EBP-04]
016F:010162C2 C745FCFFFFFFFF MOV DWORD PTR [EBP-04],FFFFFFFF
016F:010162C9 8945F8 MOV [EBP-08],EAX
016F:010162CC 8D45F0 LEA EAX,[EBP-10]
016F:010162CF 64A300000000 MOV FS:[00000000],EAX
016F:010162D5 64EB01 JMP 010162D9
016F:010162D8 69EB01696862 IMUL EBP,EBX,62686901
016F:010162DC 6862D84000 PUSH 0040D862
016F:010162E1 681C5F0101 PUSH 01015F1C
016F:010162E6 C3 RET
016F:010162E7 0000 ADD [EAX],AL
016F:010162E9 0000 ADD [EAX],AL
016F:010162EB 0000 ADD [EAX],AL
016F:010162ED 0000 ADD [EAX],AL
016F:010162EF 0000 ADD [EAX],AL
016F:010162F1 0000 ADD [EAX],AL
016F:010162F3 0000 ADD [EAX],AL
016F:010162F5 0000 ADD [EAX],AL
016F:010162F7 0000 ADD [EAX],AL
016F:010162F9 0000 ADD [EAX],AL
016F:010162FB 0000 ADD [EAX],AL
--------------------------------------------------------------------------------
:d eax
:.
:d esp
:.
:.
:.
:/screendump c:\dump\wsr_oep_2.txt
:/screendump c:\dump\wsr_oep_3.txt
Invalid command Wsrecord
EAX=0068FE28 EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000 EBP=0068FE38 ESP=0068FDB8 EIP=0040D862 o d I S z a p c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB8 0040BE15 00000000 8193BC10 00580000 ..@...........X.
0177:0068FDC8 0068FDD8 01000B4D 19331756 073ED94C ..h.M...V.3.L.>.
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8 00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08 00000323 00B57E2A B62FE226 00580000 #...*~..&./...X.
0177:0068FE18 01016045 8193BC70 0068FDBC 0068FF68 E`..p.....h.h.h.
-------------------------------------------------------------------------PROT32-
016F:0040D85C 64A300000000 MOV FS:[00000000],EAX
016F:0040D862 C3 RET
016F:0040D863 8B4DF0 MOV ECX,[EBP-10]
016F:0040D866 64890D00000000 MOV FS:[00000000],ECX
016F:0040D86D 59 POP ECX
016F:0040D86E 5F POP EDI
016F:0040D86F 5E POP ESI
016F:0040D870 5B POP EBX
016F:0040D871 C9 LEAVE
016F:0040D872 51 PUSH ECX
016F:0040D873 C3 RET
016F:0040D874 8B4604 MOV EAX,[ESI+04]
016F:0040D877 85C0 TEST EAX,EAX
016F:0040D879 7444 JZ 0040D8BF
016F:0040D87B 8D5008 LEA EDX,[EAX+08]
016F:0040D87E 803A00 CMP BYTE PTR [EDX],00
016F:0040D881 743C JZ 0040D8BF
016F:0040D883 8B4F04 MOV ECX,[EDI+04]
016F:0040D886 3BC1 CMP EAX,ECX
016F:0040D888 7410 JZ 0040D89A
016F:0040D88A 83C108 ADD ECX,08
016F:0040D88D 51 PUSH ECX
016F:0040D88E 52 PUSH EDX
016F:0040D88F E8BC0D0000 CALL 0040E650
016F:0040D894 85C0 TEST EAX,EAX
016F:0040D896 59 POP ECX
016F:0040D897 59 POP ECX
------------------------------------WSRECORDER!+C85C----------------------------
:.
:/screendump c:\dump\wsr_oep_2.txt
:/screendump c:\dump\wsr_oep_3.txt
:d esp
:.
:d esp
:d esp
:/screendump c:\dump\wsr_oep_4.txt
Invalid command Wsrecord
EAX=0068FE28 EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000 EBP=0068FE38 ESP=0068FDBC EIP=0040BE15 o d I S z a p c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB8 0040BE15 00000000 8193BC10 00580000 ..@...........X.
0177:0068FDC8 0068FDD8 01000B4D 19331756 073ED94C ..h.M...V.3.L.>.
0177:0068FDD8 00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8 00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8 00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08 00000323 00B57E2A B62FE226 00580000 #...*~..&./...X.
0177:0068FE18 01016045 8193BC70 0068FDBC 0068FF68 E`..p.....h.h.h.
-------------------------------------------------------------------------PROT32-
016F:0040BDFC 68FF000000 PUSH 000000FF
016F:0040BE01 E866FCFFFF CALL 0040BA6C
016F:0040BE06 59 POP ECX
016F:0040BE07 59 POP ECX
016F:0040BE08 C3 RET
016F:0040BE09 0000 ADD [EAX],AL
016F:0040BE0B 0000 ADD [EAX],AL
016F:0040BE0D 0000 ADD [EAX],AL
016F:0040BE0F 00E8 ADD AL,CH
016F:0040BE11 131A ADC EBX,[EDX]
016F:0040BE13 0000 ADD [EAX],AL
016F:0040BE15 BF94000000 MOV EDI,00000094
016F:0040BE1A 8BC7 MOV EAX,EDI
016F:0040BE1C E8CFF7FFFF CALL 0040B5F0
016F:0040BE21 8965E8 MOV [EBP-18],ESP
016F:0040BE24 8BF4 MOV ESI,ESP
016F:0040BE26 893E MOV [ESI],EDI
016F:0040BE28 56 PUSH ESI
016F:0040BE29 FF159C224200 CALL [0042229C]
016F:0040BE2F 8B4E10 MOV ECX,[ESI+10]
016F:0040BE32 890DECFA4200 MOV [0042FAEC],ECX
016F:0040BE38 8B4604 MOV EAX,[ESI+04]
016F:0040BE3B A3F8FA4200 MOV [0042FAF8],EAX
016F:0040BE40 8B5608 MOV EDX,[ESI+08]
016F:0040BE43 8915FCFA4200 MOV [0042FAFC],EDX
016F:0040BE49 8B760C MOV ESI,[ESI+0C]
016F:0040BE4C 81E6FF7F0000 AND ESI,00007FFF
------------------------------------WSRECORDER!+ADFC----------------------------
:/screendump c:\dump\wsr_oep_2.txt
:/screendump c:\dump\wsr_oep_3.txt
:d esp
:.
:d esp
:d esp
:/screendump c:\dump\wsr_oep_4.txt
:/screendump c:\dump\wsr_oep_5.txt
Invalid command Wsrecord
바로 위의 부분이 대망의 OEP입니다. 하지만 이곳은 소위 말하는 fake OEP입니다. 따라서 덤프를 하기전에 우리가 실제 OEP로 eip를 옮깁시다.
r eip eip-7
왜 eip-7 인지는 stolen bytes의 수를 세어보면 알 수 있습니다. 따라서 실제 OEP는 40BE15 - 7 = 40BE0E 가 되겠습니다. 덤프를 하실까요!
/dump 400000 58000 c:\dump\wsr_dump.exe
로 하시면 되겠습니다. 그리고 당근 PE editor를 열어 OEP와 색션을 수정해주셔야겠죠. 그리고 중요한 것은 덤프한 파일엔 stolen bytes가 없으므로 직접 심어줘야 한다는 것입니다. 전 Hiew를 사용해서 수정했습니다.
2. 이제 IAT를 복구해봅시다. Import Reconstruct를 가동하시고 OEP를 BE0E에 넣고 IAT search를 하신후, show invalid를 눌러 trace level1, trace asprotect 1.22를 해줍시다. 그러면 아마도 하나의 미해결 임포를 제외하고 다 풀릴 겁니다. 이제 미해결 임포트가 뭔지 봐야겠죠.
faults on 에 명령을 주시고 실행하면 아마 오류가 날겁니다. 그러면 R 키를 누른후, u *esp해서 봅시다. 어디서 오류가 나나요? 아마도 OEP 밑부분의 명령어 중
016F:0040BE29 FF159C224200 CALL [0042229C]
여기에서 에러가 뜰겁니다. 그러면 프로그램을 다시 실행시켜서 저기에 무엇이 있나보죠. [0042229C] = 01010CB0 입니다. 이곳으로 가보시면 아래처럼 나올 겁니다.
EAX=0040BE21 EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=0068FD28
EDI=00000094 EBP=0068FD1C ESP=0068FD08 EIP=01010CB8 o d I s z a p c
CS=016F DS=0177 SS=0177 ES=0177 FS=34CF GS=0000
-----KERNEL32!GetVersionExA+0008------------------dword-------------PROT---(0)--
0177:BFF917B2 8B08758B 009C3D06 0E740000 0000943D .u...=....t.=...
0177:BFF917C2 33077400 00F6E9C0 04BF0000 8D000000 .t.3............
0177:BFF917D2 8950F845 46C7047E 00000A08 0C46C700 E.P.~..F......F.
0177:BFF917E2 040A08AE 011046C7 68000000 BFF79450 .....F.....hP...
0177:BFF917F2 00000268 00116880 D3E80001 85FFFDFB h....h..........
0177:BFF91802 816675C0 00009C3E 8D287500 7D89FC45 .uf.>....u(.E..}
0177:BFF91812 F47D8DF4 FF335057 98685757 FFBFF794 ..}.WP3.WWh.....
-------------------------------------------------------------------------PROT32-
016F:01010CB0 55 PUSH EBP
016F:01010CB1 8BEC MOV EBP,ESP
016F:01010CB3 83EC0C SUB ESP,0C
016F:01010CB6 56 PUSH ESI
016F:01010CB7 57 PUSH EDI
016F:01010CB8 E9F50AF8BE JMP BFF917B2 (JUMP )
016F:01010CBD 0000 ADD [EAX],AL
016F:01010CBF 000E ADD [ESI],CL
016F:01010CC1 0000 ADD [EAX],AL
016F:01010CC3 00E9 ADD CL,CH
016F:01010CC5 C4E4 LES ESP,ESP
016F:01010CC7 F8 CLC
016F:01010CC8 BE3700000E MOV ESI,0E000037
016F:01010CCD 0000 ADD [EAX],AL
016F:01010CCF 0055E9 ADD [EBP-17],DL
016F:01010CD2 56 PUSH ESI
016F:01010CD3 15F7BE0000 ADC EAX,0000BEF7
016F:01010CD8 0E PUSH CS
016F:01010CD9 0000 ADD [EAX],AL
016F:01010CDB 00E9 ADD CL,CH
016F:01010CDD 18D6 SBB DH,DL
016F:01010CDF F7BE3700000E IDIV DWORD PTR [ESI+0E000037]
016F:01010CE5 0000 ADD [EAX],AL
016F:01010CE7 006808 ADD [EAX+08],CH
016F:01010CEA 44 INC ESP
016F:01010CEB F7BFC300000E IDIV DWORD PTR [EDI+0E0000C3]
016F:01010CF1 0000 ADD [EAX],AL
--------------------------------------------------------------------------------
:.
:d esp
:d esp
:/screendump c:\dump\wsr_oep_4.txt
:/screendump c:\dump\wsr_oep_5.txt
:/screendump c:\dump\wsr_api_1.txt
:d bff917b2
:/screendump c:\dump\wsr_api_1.txt
Invalid command Wsrecord
위에서 볼 수 있듯이 BFF917B2 로 점프하는 것을 알 수 있습니다. BFFxxxxx 은 DLL의 영역입니다. 과연 이 주소가 어디에 속하는지 데이터창으로 봅시다. 그랬더니 데이터 창에 GetVersionExA+008 이라고 나옴을 볼 수 있습니다. 위의 녹색부분에 해당하는 코드 수는 정확히 8바이트입니다. 즉 asprotect가 GetVersionExA의 8바이트를 미리 실행하고 해당 함수로 점프를 하는군요. 즉 마치 OEP의 stolen bytes같은 것이지요. 머 어차피 자동으로 복구할 것이므로 상관없습니다. 다시 Import Recontruct를 띄우시고, 해당 미해결 임포트를 더블클릭 후 해당함수를 클릭해 줍시다. 이제 더 이상의 미해결 임포트는 없습니다. 기쁜 마음으로 실행해 보세요. 잘 되죠~~~~
p.s : 임포트 복구는 별다른 문제가 없었기에, 또한 제가 복구하면서 IAT tree를 저장하지 않았기에, 귀찮니즘으로 인해 첨부하지 않습니다. 혹시라도 임포트 복구가 안되는 분 계시면 올려드리도록 하겠습니다.
p.s : 이 자리를 빌어 copywrite 님에게 깊은 감사를 드립니다. 사실 저도 이번에 asprotect의 코드를 일일이 스텝인하면서 혈압이 급상승함을 느낀 적이 한두 번이 아니었습니다. 그 수많은 SEH 트릭에 좌절하며, 소아로 풀어낸다는 것이 불가능할 것으로만 여겼습니다. 하지만 copywrite님의 도움을 받아 이렇게 손쉽게 해내는군요. 예전에 copywrite님이 asprotect에 심취하셔서 같이 루틴을 파해해보자고 했을 때 그러지 못한 것이 못내 아쉽고 미안할 따름입니다. 아무튼 아직까지 소아로 풀어낸 public tutorial은 보지 못했기에 더욱 뜻 깊은 것 같습니다. 다시 한번 감사의 뜻을 전하며...
p.s : 혹시 위의 과정들에 대한 의미를 파악하실 분은 제 홈페이지의 게시판을 참조하시기 바랍니다. 또한 이것 이외의 정보를 얻고 싶으신 분들은 개인적으로 메일을 주십시요. 결국은 그 자료들이란게 직접 해보지 않는 이상 도움이 전혀 안될 자료들이지만, 분명 길잡이가 되어줄 수 있으리라 생각합니다.
'Hacking' 카테고리의 다른 글
Intro to Reverse Engineering-Part 2 (0) | 2009.01.24 |
---|---|
Intro to Reverse Engineering - No Assembly Required (0) | 2009.01.24 |
Gunz Original Files (0) | 2009.01.20 |
Common Hacking Tools (0) | 2009.01.20 |
IDA PRO beginner tutorial (0) | 2009.01.11 |