首页
社区
课程
招聘
[旧帖] [求助]求解个算法 0.00雪花
发表于: 2008-12-20 16:17 2524

[旧帖] [求助]求解个算法 0.00雪花

2008-12-20 16:17
2524
20001923 > $  55            push    ebp
20001924   .  8BEC          mov     ebp, esp
20001926   .  6A FF         push    -1
20001928   .  68 00C20020   push    2000C200
2000192D   .  68 B84B0020   push    20004BB8                   ;  SE 处理程序安装
20001932   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
20001938   .  50            push    eax
20001939   .  64:8925 00000>mov     dword ptr fs:[0], esp
20001940   .  83C4 DC       add     esp, -24
20001943   .  53            push    ebx
20001944   .  56            push    esi
20001945   .  57            push    edi
20001946   .  8965 E8       mov     dword ptr [ebp-18], esp
20001949   .  8B45 08       mov     eax, dword ptr [ebp+8]     ;  堆栈 ss:[0012FF74]=20001000 (RegLib.20001000)
2000194C   .  8945 D0       mov     dword ptr [ebp-30], eax    ;  eax=20001000 (RegLib.20001000)
2000194F   .  8B4D 0C       mov     ecx, dword ptr [ebp+C]     ;  堆栈 ss:[0012FF78]=20001908 (RegLib.20001908)
20001952   .  2B4D D0       sub     ecx, dword ptr [ebp-30]    ;  0x908
20001955   .  894D CC       mov     dword ptr [ebp-34], ecx
20001958   .  8B55 D0       mov     edx, dword ptr [ebp-30]
2000195B   .  8955 E4       mov     dword ptr [ebp-1C], edx
2000195E   .  C745 D4 00000>mov     dword ptr [ebp-2C], 0
20001965   .  8D45 D4       lea     eax, dword ptr [ebp-2C]
20001968   .  50            push    eax                        ; /pOldProtect
20001969   .  6A 40         push    40                         ; |NewProtect = PAGE_EXECUTE_READWRITE
2000196B   .  8B4D 0C       mov     ecx, dword ptr [ebp+C]     ; |
2000196E   .  2B4D 08       sub     ecx, dword ptr [ebp+8]     ; |
20001971   .  51            push    ecx                        ; |Size
20001972   .  8B55 E4       mov     edx, dword ptr [ebp-1C]    ; |
20001975   .  52            push    edx                        ; |Address
20001976   .  FF15 58C00020 call    dword ptr [<&KERNEL32.Virt>; \VirtualProtect

往栈中保存一些数据,20001000,20001908,得到两个地址的差值也保存到栈中。

2000197C   .  C745 FC 00000>mov     dword ptr [ebp-4], 0
20001983   .  C745 DC 00000>mov     dword ptr [ebp-24], 0
2000198A   .  EB 09         jmp     short 20001995
2000198C   >  8B45 DC       mov     eax, dword ptr [ebp-24]    ;  
2000198F   .  83C0 01       add     eax, 1
20001992   .  8945 DC       mov     dword ptr [ebp-24], eax
20001995   >  8B4D DC       mov     ecx, dword ptr [ebp-24]    ;  累加数,到ecx
20001998   .  3B4D CC       cmp     ecx, dword ptr [ebp-34]
2000199B   .  7D 65         jge     short 20001A02
2000199D   .  8B55 E4       mov     edx, dword ptr [ebp-1C]
200019A0   .  0355 DC       add     edx, dword ptr [ebp-24]    ;  累加后的数与20001000基址相加
200019A3   .  33C0          xor     eax, eax
200019A5   .  8A02          mov     al, byte ptr [edx]         ;  ////*\从相加后的地址中取数
200019A7   .  C1F8 04       sar     eax, 4                     ;  右移4位
200019AA   .  83E0 0F       and     eax, 0F                    ;  取低四位
200019AD   .  33C9          xor     ecx, ecx
200019AF   .  8A88 70E40020 mov     cl, byte ptr [eax+2000E470>;  再把运算的结果与2000e470相加得到地址取出地址中的数
200019B5   .  8B55 E4       mov     edx, dword ptr [ebp-1C]    ;  20001000基址
200019B8   .  0355 DC       add     edx, dword ptr [ebp-24]
200019BB   .  33C0          xor     eax, eax
200019BD   .  8A02          mov     al, byte ptr [edx]         ;  再次取出刚才的数到al
200019BF   .  83E0 0F       and     eax, 0F                    ;  取低四位
200019C2   .  33D2          xor     edx, edx
200019C4   .  8A90 70E40020 mov     dl, byte ptr [eax+2000E470>;  ////*\再从表中取出一个数。
200019CA   .  C1E2 04       shl     edx, 4                     ;  左移四位
200019CD   .  0BCA          or      ecx, edx                   ;  两值相或
200019CF   .  8B45 E4       mov     eax, dword ptr [ebp-1C]
200019D2   .  0345 DC       add     eax, dword ptr [ebp-24]
200019D5   .  8808          mov     byte ptr [eax], cl         ;  cl?把cl放入这个前一张表
200019D7   .  8B4D E4       mov     ecx, dword ptr [ebp-1C]
200019DA   .  034D DC       add     ecx, dword ptr [ebp-24]
200019DD   .  33D2          xor     edx, edx
200019DF   .  8A11          mov     dl, byte ptr [ecx]         ;  再取出这个值到dl
200019E1   .  8B45 DC       mov     eax, dword ptr [ebp-24]    ;  累加数
200019E4   .  25 7F000080   and     eax, 8000007F              ;  与8000007F相与
200019E9   .  79 05         jns     short 200019F0
200019EB   .  48            dec     eax
200019EC   .  83C8 80       or      eax, FFFFFF80
200019EF   .  40            inc     eax
200019F0   >  33D0          xor     edx, eax                   ;  累加数与前边最后的结果异或
200019F2   .  8855 D8       mov     byte ptr [ebp-28], dl      ;  把这个数放入栈中
200019F5   .  8B4D E4       mov     ecx, dword ptr [ebp-1C]
200019F8   .  034D DC       add     ecx, dword ptr [ebp-24]
200019FB   .  8A55 D8       mov     dl, byte ptr [ebp-28]      ;  再取出这个数
200019FE   .  8811          mov     byte ptr [ecx], dl
20001A00   .^ EB 8A         jmp     short 2000198C             ;  循环

通过20001000与累加数的和取出数,右移取低四位。
再把所得的结果与2000E470相加得到一个地址,取出其中的数。
通过20001000与累加数的和取出数,直接取低四位。
把所得的结果与2000E470相加得到一个地址,再取出其中的数,
把所得数左移4位,
与前一个取出的数或运算,
结果保存在ecx。
把结果保存到20001000与累加数的和所得的地址中。
累加数与8000007F与运算,
累加数与最后结果的数异或。
结果放入栈中,
再把数放回到原来的位置。

20001A02   >  C745 FC FFFFF>mov     dword ptr [ebp-4], -1
20001A09   .  EB 10         jmp     short 20001A1B
20001A0B   .  B8 01000000   mov     eax, 1
20001A10   .  C3            retn
20001A11   .  8B65 E8       mov     esp, dword ptr [ebp-18]
20001A14   .  C745 FC FFFFF>mov     dword ptr [ebp-4], -1
20001A1B   >  8D45 D4       lea     eax, dword ptr [ebp-2C]
20001A1E   .  50            push    eax                        ; /pOldProtect = 0012FF48
20001A1F   .  8B4D D4       mov     ecx, dword ptr [ebp-2C]    ; |
20001A22   .  51            push    ecx                        ; |NewProtect
20001A23   .  8B55 0C       mov     edx, dword ptr [ebp+C]     ; |
20001A26   .  2B55 08       sub     edx, dword ptr [ebp+8]     ; |
20001A29   .  52            push    edx                        ; |Size
20001A2A   .  8B45 E4       mov     eax, dword ptr [ebp-1C]    ; |
20001A2D   .  50            push    eax                        ; |Address
20001A2E   .  FF15 58C00020 call    dword ptr [<&KERNEL32.Virt>; \VirtualProtect
20001A34   .  8B4D F0       mov     ecx, dword ptr [ebp-10]
20001A37   .  64:890D 00000>mov     dword ptr fs:[0], ecx
20001A3E   .  5F            pop     edi
20001A3F   .  5E            pop     esi
20001A40   .  5B            pop     ebx
20001A41   .  8BE5          mov     esp, ebp
20001A43   .  5D            pop     ebp
20001A44   .  C3            retn

从第一张表中取出顺序取数,简单的移位运算后,
从第二张表中是由上边的结果决定的,取出数再做运算,
最后把最终的结果放回原位,

不知道这是哪种算法的形式???

在得到一些结果后会调用VirtualProtect这个函数,不知道这个是什么用意。
哪位大侠给讲讲。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//