Reverse/buggers/solve.md

207 lines
12 KiB
Markdown
Raw Normal View History

2024-10-17 11:23:15 +08:00
程序最高只能在Windows XP系统上运行
这个程序感觉和昨天的很像,但兼容性上稍差一些
解决方法:
细节:
EP下来是获取kernel32.dll地址
```assembly
00401000 | 8B4C24 24 | mov ecx,dword ptr ss:[esp+24] | [esp+24]:ValidateLocale+2B0
00401004 | 49 | dec ecx |
00401005 | 0FB751 3C | movzx edx,word ptr ds:[ecx+3C] | edx:KiFastSystemCallRet
00401009 | 3B4C0A 34 | cmp ecx,dword ptr ds:[edx+ecx+34] |
0040100D | 75 F5 | jne buggers.401004 |
0040100F | 890D 30314000 | mov dword ptr ds:[403130],ecx |
```
这里搜寻`GetProcAddress`
```assembly
0040103D | 8B3E | mov edi,dword ptr ds:[esi] | Search "GetProcAddress"
0040103F | 033D 30314000 | add edi,dword ptr ds:[403130] |
00401045 | 68 04304000 | push buggers.403004 | 403004:"GetProcAddress"
0040104A | 57 | push edi |
0040104B | E8 F0010000 | call buggers.401240 |
00401050 | 0BC0 | or eax,eax |
00401052 | 74 48 | je buggers.40109C |
00401054 | 8B3D 04314000 | mov edi,dword ptr ds:[403104] |
0040105A | 8B77 24 | mov esi,dword ptr ds:[edi+24] |
0040105D | 8B0D 00304000 | mov ecx,dword ptr ds:[403000] |
00401063 | 41 | inc ecx |
00401064 | D1E1 | shl ecx,1 |
00401066 | 03F1 | add esi,ecx |
00401068 | 0335 30314000 | add esi,dword ptr ds:[403130] |
0040106E | 33C0 | xor eax,eax |
00401070 | 66:8B06 | mov ax,word ptr ds:[esi] |
00401073 | 8B77 1C | mov esi,dword ptr ds:[edi+1C] |
00401076 | 0335 30314000 | add esi,dword ptr ds:[403130] |
0040107C | 48 | dec eax |
0040107D | C1E0 02 | shl eax,2 |
00401080 | 03F0 | add esi,eax |
00401082 | 8B3E | mov edi,dword ptr ds:[esi] |
00401084 | 033D 30314000 | add edi,dword ptr ds:[403130] |
0040108A | 893D 08314000 | mov dword ptr ds:[<&GetProcAddress>],edi |
00401090 | A1 30314000 | mov eax,dword ptr ds:[403130] |
00401095 | A3 30314000 | mov dword ptr ds:[403130],eax |
0040109A | EB 18 | jmp buggers.4010B4 |
0040109C | FF05 00304000 | inc dword ptr ds:[403000] |
004010A2 | FF0D 00314000 | dec dword ptr ds:[403100] |
004010A8 | 83C6 04 | add esi,4 |
004010AB | 833D 00314000 00 | cmp dword ptr ds:[403100],0 |
004010B2 | 77 89 | ja buggers.40103D |
```
`FreeLibrary`和`LoadLibraryA`
```assembly
004010B4 | 68 20304000 | push buggers.403020 | 403020:"FreeLibrary"
004010B9 | FF35 30314000 | push dword ptr ds:[403130] | kernel32
004010BF | FF15 08314000 | call dword ptr ds:[<&GetProcAddress>] |
004010C5 | A3 0C314000 | mov dword ptr ds:[<&FreeLibrary>],eax |
004010CA | 68 13304000 | push buggers.403013 | 403013:"LoadLibraryA"
004010CF | FF35 30314000 | push dword ptr ds:[403130] |
004010D5 | FF15 08314000 | call dword ptr ds:[<&GetProcAddress>] |
004010DB | 8BD8 | mov ebx,eax | ebx:&L"=::=::\\"
```
加载user32.dll然后搜寻函数地址
这里的意图很明显了
`"CreateToolhelp32Snapshot", "OpenProcess", "Process32First", "Process32Next", "TerminateProcess", "lstrcmpA", "FindWindowA"`
```assembly
004010DD | BE A2304000 | mov esi,buggers.4030A2 | 4030A2:"user32.dll"
004010E2 | BF 2C314000 | mov edi,buggers.40312C |
004010E7 | 8A06 | mov al,byte ptr ds:[esi] |
004010E9 | 0AC0 | or al,al |
004010EB | 74 14 | je buggers.401101 |
004010ED | 56 | push esi |
004010EE | FFD3 | call ebx |
004010F0 | 8907 | mov dword ptr ds:[edi],eax |
004010F2 | 83C7 04 | add edi,4 |
004010F5 | 56 | push esi |
004010F6 | E8 05010000 | call buggers.401200 |
004010FB | 8D7430 01 | lea esi,dword ptr ds:[eax+esi+1] |
004010FF | EB E6 | jmp buggers.4010E7 |
00401101 | BF 2C304000 | mov edi,buggers.40302C | 40302C:"01@"
00401106 | BE 10314000 | mov esi,<buggers.&CreateToolhelp32Snapsho |
0040110B | 8B07 | mov eax,dword ptr ds:[edi] | 获取各类函数地址检测od用
0040110D | 0BC0 | or eax,eax |
0040110F | 74 29 | je buggers.40113A |
00401111 | 8B08 | mov ecx,dword ptr ds:[eax] |
00401113 | 8BD9 | mov ebx,ecx | ebx:&L"=::=::\\"
00401115 | 83C7 04 | add edi,4 |
00401118 | 8A07 | mov al,byte ptr ds:[edi] |
0040111A | 0AC0 | or al,al |
0040111C | 75 03 | jne buggers.401121 |
0040111E | 47 | inc edi |
0040111F | EB EA | jmp buggers.40110B |
00401121 | 57 | push edi |
00401122 | 53 | push ebx | ebx:&L"=::=::\\"
00401123 | FF15 08314000 | call dword ptr ds:[<&GetProcAddress>] |
00401129 | 8906 | mov dword ptr ds:[esi],eax |
0040112B | 83C6 04 | add esi,4 |
0040112E | 57 | push edi |
0040112F | E8 CC000000 | call buggers.401200 |
00401134 | 8D7C38 01 | lea edi,dword ptr ds:[eax+edi+1] | eax+edi*1+01:"Process32First"
00401138 | EB DE | jmp buggers.401118 |
```
检测OD窗体没检测到就退出
```assembly
0040113A | 5B | pop ebx | ebx:&L"=::=::\\"
0040113B | 5F | pop edi |
0040113C | 5E | pop esi |
0040113D | B8 28010000 | mov eax,128 |
00401142 | A3 34314000 | mov dword ptr ds:[403134],eax |
00401147 | 6A 00 | push 0 |
00401149 | 6A 02 | push 2 |
0040114B | FF15 10314000 | call dword ptr ds:[<&CreateToolhelp32Snap |
00401151 | A3 5C324000 | mov dword ptr ds:[40325C],eax |
00401156 | 68 34314000 | push buggers.403134 |
0040115B | 50 | push eax |
0040115C | FF15 18314000 | call dword ptr ds:[<&Process32First>] |
00401162 | 6A 00 | push 0 |
00401164 | 68 AE304000 | push buggers.4030AE | 4030AE:"OLLYDBG"
00401169 | FF15 28314000 | call dword ptr ds:[<&FindWindowA>] |
0040116F | 83F8 00 | cmp eax,0 |
00401172 | 0BC0 | or eax,eax |
00401174 | 74 04 | je buggers.40117A |
00401176 | 7C 27 | jl buggers.40119F |
00401178 | EB 25 | jmp buggers.40119F |
0040117A | 50 | push eax | Not Found "OLLYDBG"
0040117B | 56 | push esi |
0040117C | 57 | push edi |
0040117D | BF 01000000 | mov edi,1 |
00401182 | BE 2C314000 | mov esi,buggers.40312C |
00401187 | FF36 | push dword ptr ds:[esi] |
00401189 | FF15 0C314000 | call dword ptr ds:[<&FreeLibrary>] |
0040118F | 83C6 04 | add esi,4 |
00401192 | 4F | dec edi |
00401193 | 75 F2 | jne buggers.401187 |
00401195 | 5F | pop edi |
00401196 | 5E | pop esi |
00401197 | 58 | pop eax |
00401198 | 6A 00 | push 0 |
0040119A | E8 57000000 | call <JMP.&ExitProcess> | Bye
```
检测OD进程有则干掉进程然后退出
```assembly
0040119F | 68 B6304000 | push buggers.4030B6 | 4030B6:"OLLYDBG.EXE"
004011A4 | 68 58314000 | push buggers.403158 | 403158:"OLLYDBG.EXE"
004011A9 | FF15 24314000 | call dword ptr ds:[<&lstrcmp>] |
004011AF | 0BC0 | or eax,eax |
004011B1 | 75 2F | jne buggers.4011E2 |
004011B3 | FF35 3C314000 | push dword ptr ds:[40313C] |
004011B9 | 6A 01 | push 1 |
004011BB | 68 FF0F1F00 | push 1F0FFF |
004011C0 | FF15 14314000 | call dword ptr ds:[<&OpenProcess>] |
004011C6 | A3 64324000 | mov dword ptr ds:[403264],eax |
004011CB | 6A 00 | push 0 |
004011CD | FF35 64324000 | push dword ptr ds:[403264] |
004011D3 | FF15 20314000 | call dword ptr ds:[<&TerminateProcess>] | Kill OD
004011D9 | 6A 00 | push 0 |
004011DB | E8 16000000 | call <JMP.&ExitProcess> | Bye
004011E0 | EB 11 | jmp buggers.4011F3 |
004011E2 | 68 34314000 | push buggers.403134 |
004011E7 | FF35 5C324000 | push dword ptr ds:[40325C] |
004011ED | FF15 1C314000 | call dword ptr ds:[<&Process32Next>] |
004011F3 | EB AA | jmp buggers.40119F |
004011F5 | CC | int3 |
004011F6 | FF25 00204000 | jmp dword ptr ds:[<ExitProcess>] |
```
好像没有一个目标?
那就不Patch了
OD用户可以nop掉
```assembly
00401174 | 74 04 | je buggers.40117A |
00401176 | 7C 27 | jl buggers.40119F |
```
这个想咋整就咋整反正这个crackme没有成功目标
```assembly
004011B3 | FF35 3C314000 | push dword ptr ds:[40313C] |
004011B9 | 6A 01 | push 1 |
004011BB | 68 FF0F1F00 | push 1F0FFF |
004011C0 | FF15 14314000 | call dword ptr ds:[<&OpenProcess>] |
004011C6 | A3 64324000 | mov dword ptr ds:[403264],eax |
004011CB | 6A 00 | push 0 |
004011CD | FF35 64324000 | push dword ptr ds:[403264] |
004011D3 | FF15 20314000 | call dword ptr ds:[<&TerminateProcess>] | Kill OD
```