该壳shoooo等高手不屑写教程:)
还是让我这个菜鸟来写吧,希望对象我一样的菜鸟有点启示。
下载地址:http://bbs.pediy.com/showthread.php?s=&threadid=21802
先用RORDBG跟踪,查看跟踪记录,可以发现:
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
读API地址(指令数192726):77E6FB03 GetCommandLineA
0041ACCD 正常调用(指令数201148): KERNEL32.DLL!GetCommandLineA
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
读API地址(指令数299657):77E73F8F CreateProcessA
0041B425 正常调用(指令数307752): KERNEL32.DLL!CreateProcessA///创建子进程。
Param0:00000000
Param1:00132508
""C:\Documents and Settings\csjwaman\桌面\ep\EP.EXE""///子进程名。
Param2:00000000
Param3:00000000
Param5:04000022
Param6:00000000
Param7:00000000
Param8:004040A8
Param9:004043C0
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
还可以发现:
读API地址(指令数353500):77E7ADB9 WriteProcessMemory
0041AF71 正常调用(指令数361525): KERNEL32.DLL!WriteProcessMemory///写入内存。
Param0:00000390
Param1:00130000
Param2:00402230
Param3:00000064
Param4:0012FFAC
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
读API地址(指令数366354):77E7ADB9 WriteProcessMemory
0041B5AE 正常调用(指令数375039): KERNEL32.DLL!WriteProcessMemory///写入内存。
Param0:00000390
Param1:00140000
Param2:00402250
Param3:00000064
Param4:0012FFAC
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
读API地址(指令数399674):77E66D7A GlobalAlloc
0041BB92 正常调用(指令数407053): KERNEL32.DLL!GlobalAlloc
Param0:00000000
Param1:00000008
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
读API地址(指令数417840):77E7A6CF WaitForDebugEvent
0041AE5E 正常调用(指令数425047): KERNEL32.DLL!WaitForDebugEvent///等待调试。
Param0:00404040///注意这里。
Param1:FFFFFFFF
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
读API地址(指令数450715):77E7ADB9 WriteProcessMemory
0041BB14 正常调用(指令数457999): KERNEL32.DLL!WriteProcessMemory///写入CC触发调试事件。
Param0:00000390
Param1:00401652
Param2:00403050
Param3:00000001
Param4:0012FFC0
00401891 660FB611 MOVZX DX,BYTE PTR [ECX]
用OD跟踪,he WaitForDebugEvent,然后到404040处:
00404000 00 D0 41 00 82 3B 42 00 .辛.?B.
00404008 00 00 00 00 00 00 40 00 ......@.
00404010 00 10 40 00 00 90 00 00 .@..?.
00404018 40 10 40 00 52 16 40 00 @@.R@. ///401040就是子进程入口地址,401652是父进程入口地址。
00404020 87 0F 00 00 00 00 00 00 ?......
00404028 00 02 00 00 04 00 00 00 ......
00404030 A8 2B 13 00 C4 EF EB 77 ?.娘膑
00404038 CD 61 E6 77 00 00 00 00 歪骥....
00404040 03 00 00 00 50 03 00 00 ...P..
00404048 40 05 00 00 00 00 00 00 @......
00404050 3C 00 00 00 38 00 00 00 <...8...
00404058 00 00 40 00 00 00 00 00 ..@.....
00404060 00 00 00 00 00 E0 FD 7F .....帻
00404068 52 16 40 00 00 00 00 00 R@.....
00404070 01 00 00 00 00 00 00 00 .......
00404078 00 00 00 00 00 00 00 00 ........
00404080 00 00 00 00 00 00 00 00 ........
00404088 00 00 00 00 00 00 00 00 ........
00404090 00 00 00 00 00 00 00 00 ........
00404098 00 00 00 00 00 00 00 00 ........
004040A0 68 21 13 00 18 33 13 00 h!.3.
004040A8 44 00 00 00 00 00 00 00 D.......
004040B0 00 00 00 00 00 00 00 00 ........
继续看RORDBG的跟踪记录:
004028B4 正常调用(指令数895387): KERNEL32.DLL!WriteProcessMemory///开始向子进程内存区域写入数据。
Param0:00000390
Param1:00401000///子进程代码段。
Param2:0013AC98///缓冲区数据。注意!
Param3:00001000
Param4:0012FF6C
用OD跟踪,he WriteProcessMemory (或者在004028B4处下断)断下后就可以看到相关参数了。
在0013AC98+40=0013ACD8处的代码就是子进程入口代码,改成EBFE(JMP EIP)造成死循环。
0013AC98 00 00 00 00 85 E3 2A 6A ....?*j
0013ACA0 7C 67 35 6A 5B 4E 2A 6A |g5j[N*j
0013ACA8 3E DE 28 6A 00 00 00 00 >?j....
0013ACB0 00 00 00 00 00 00 00 00 ........
0013ACB8 FF 25 0C 10 40 00 FF 25 ?.@.?
0013ACC0 08 10 40 00 FF 25 00 10 @.?.
0013ACC8 40 00 FF 25 04 10 40 00 @.?@.
0013ACD0 FF 25 10 10 40 00 00 00 ?@...
0013ACD8 68 BC 6E 40 00 E8 EE FF h碱@.桀?
0013ACE0 FF FF 00 00 00 00 00 00 ?......
0013ACE8 30 00 00 00 38 00 00 00 0...8...
接着取消断点,直接运行程序,然后用LordPE的ARMDUMP插件DUMP,如果不用插件则DUMP出来的代码数据不完整。
DUMP出来后查看入口处代码,可以发现IAT地址和大小。
0040101D 00 DB 00
0040101E 00 DB 00
0040101F 00 DB 00
00401020 .- FF25 0C104000 JMP DWORD PTR DS:[40100C]///[xxxxxxxx]就是IAT表地址。
00401026 .- FF25 08104000 JMP DWORD PTR DS:[401008]
0040102C .- FF25 00104000 JMP DWORD PTR DS:[401000]
00401032 .- FF25 04104000 JMP DWORD PTR DS:[401004]
00401038 $- FF25 10104000 JMP DWORD PTR DS:[401010]
0040103E 00 DB 00
0040103F 00 DB 00
00401040 > $ 68 BC6E4000 PUSH 406EBC///入口。
00401045 . E8 EEFFFFFF CALL 00401038 ; 00401038
0040104A . 0000 ADD BYTE PTR DS:[EAX],AL
00401000 6F D8 45 73 85 E3 46 73 o嘏s?Fs
00401008 7C 67 51 73 5B 4E 46 73 |gQs[NFs
00401010 3E DE 44 73 00 00 00 00 >弈s....
地址从401000开始,到401018处结束,大小为18。用ImportREC修复即可。最后将入口代码改回原来的68BC.
注:脱这个unpackme时花了我不少时间,主要是DUMP出来的代码数据不完整。后来Linex让我用LordPE的ARMDUMP插件试试,结果真的DUMP成功。
在此感谢Linex和shoooo。
[课程]Android-CTF解题方法汇总!