先用PEiD侦测出是 PECompact 2.X -> JEREMY COLLAKE,好的!OD+手动Dump!
―――――――――――――――――――――――――――――――――
设置Ollydbg忽略所有的异常选项。
―――――――――――――――――――――――――――――――――
00401000 m> B8 70314300 mov eax,mypro.00433170 //进入OD后暂停在这
00401005 50 push eax
00401006 64:FF35 0000000>push dword ptr fs:[0]
0040100D 64:8925 0000000>mov dword ptr fs:[0],esp
00401014 33C0 xor eax,eax
00401016 8908 mov dword ptr ds:[eax],ecx
00401018 50 push eax
00401019 45 inc ebp
0040101A 43 inc ebx
下断:BP VirtualFree
F9运行!
77E615CB k> 55 push ebp //中断在此
77E615CC 8BEC mov ebp,esp
77E615CE FF75 10 push dword ptr ss:[ebp+10]
77E615D1 FF75 0C push dword ptr ss:[ebp+C]
77E615D4 FF75 08 push dword ptr ss:[ebp+8]
77E615D7 6A FF push -1
77E615D9 E8 04000000 call kernel32.VirtualFreeEx
77E615DE 5D pop ebp
77E615DF C2 0C00 retn 0C
中断后取消断点(BPD VirtualFree),Ctrl+F9两次:
//第一次:
77E615DF C2 0C00 retn 0C //断这里
77E615E2 k> 55 push ebp
77E615E3 8BEC mov ebp,esp
77E615E5 F645 15 80 test byte ptr ss:[ebp+15],80
77E615E9 74 0A je short kernel32.77E615F5
77E615EB 837D 10 00 cmp dword ptr ss:[ebp+10],0
77E615EF 0F85 C2C10100 jnz kernel32.77E7D7B7
77E615F5 56 push esi
77E615F6 8B35 A011E477 mov esi,dword ptr ds:[<&ntdll.NtFre>; ntdll.ZwFreeVirtualMemory
77E615FC 57 push edi
//第二次:
00370409 C3 retn //这里中断
0037040A 55 push ebp
0037040B 8BEC mov ebp,esp
0037040D 83C4 FC add esp,-4
00370410 53 push ebx
00370411 57 push edi
00370412 56 push esi
00370413 E8 00000000 call 00370418
00370418 5B pop ebx
Alt+F9立即返回:
0043321D 8985 23120010 mov dword ptr ss:[ebp+10001223],eax ; mypro.<ModuleEntryPoint> //这里是返回位置
00433223 8BF0 mov esi,eax
00433225 59 pop ecx
00433226 5A pop edx
00433227 03CA add ecx,edx
00433229 68 00800000 push 8000
0043322E 6A 00 push 0
00433230 57 push edi
00433231 FF11 call dword ptr ds:[ecx]
00433233 8BC6 mov eax,esi
00433235 5A pop edx
00433236 5E pop esi
00433237 5F pop edi
00433238 59 pop ecx
00433239 5B pop ebx
0043323A 5D pop ebp
0043323B FFE0 jmp eax //按理来说这个位置就应该跳到oep吧?
0043323D 0000 add byte ptr ds:[eax],al
F8单步26次,其中有几次是在00433231 FF11 call dword ptr ds:[ecx]这个call里执行的。里边代码是这样的:
77E615CB k> 55 push ebp
77E615CC 8BEC mov ebp,esp
77E615CE FF75 10 push dword ptr ss:[ebp+10]
77E615D1 FF75 0C push dword ptr ss:[ebp+C]
77E615D4 FF75 08 push dword ptr ss:[ebp+8]
77E615D7 6A FF push -1
77E615D9 E8 04000000 call kernel32.VirtualFreeEx
77E615DE 5D pop ebp
77E615DF C2 0C00 retn 0C
返回后执行到 0043323B FFE0 jmp eax 这里
这里的eax居然是这样的
eax=00401000 (mypro.<ModuleEntryPoint>)
代码是
00401000 m> E8 06000000 call mypro.0040100B
00401005 50 push eax
00401006 E8 BB010000 call mypro.004011C6 ; jmp to kernel32.ExitProcess
0040100B 55 push ebp
0040100C 8BEC mov ebp,esp
0040100E 81C4 F0FEFFFF add esp,-110
00401014 E9 83000000 jmp mypro.0040109C
00401019 6B72 6E 6C imul esi,dword ptr ds:[edx+6E],6C
0040101D 6E outs dx,byte ptr es:[edi]
0040101E 2E:66:6E outs dx,byte ptr es:[edi]
00401021 72 00 jb short mypro.00401023
请问我找到的是oep吗?我dump出来以后不能执行,修复iat也不可以?
为什么oep的入口跟开始的入口是一个位置阿?不明白。
我用peid 0.93扫描发现oep应该是这个阿,高手们能不能帮我解释一下呢
genoep
found oep: 004113fd。
[课程]Android-CTF解题方法汇总!