科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道Softwrap脱壳经验总结(上)

Softwrap脱壳经验总结(上)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

取得完整的输入表: 断点:GetModuleHandleA,普通断点要下在函数末尾,否则会被检测到,当堆栈出现如下内容时,返回:

作者:论坛整理 来源:zdnet网络安全 2007年12月24日

关键字: 安全 脱壳 Softwrap

  • 评论
  • 分享微博
  • 分享邮件
本文中的程序:http://www.fractalpc.com/resources/SetupFractalPC30.exe
取得完整的输入表:
断点:GetModuleHandleA,普通断点要下在函数末尾,否则会被检测到,当堆栈出现如下内容时,返回:
0012FF98   00459CF5  返回到 FractalP.00459CF5
0012FF9C   00000000
0012FFA0   00B20000
0012FFA4   0012FFE0  指向下一个 SEH 记录的指针
壳会检测单步执行,如果能避开检测的话,会来到这里:
0045B7F6    F6C3 02         test    bl, 2
0045B7F9    74 21           je      short 0045B81C        这里决定是否把函数代码抽走,改成jmp
0045B7FB    FFB5 DF1C0000   push    dword ptr [ebp+1CDF]
0045B801    6A 10           push    10
0045B803    50              push    eax
0045B804    FFB5 DF1C0000   push    dword ptr [ebp+1CDF]
下面是循环的底部:
0045B827    C1E2 02         shl     edx, 2
0045B82A    83C6 04         add     esi, 4
0045B82D    57              push    edi
0045B82E    51              push    ecx
0045B82F    6A 03           push    3                        push 3,所以每个函数会储存3次
0045B831    59              pop     ecx
0045B832    8D7E F4         lea     edi, dword ptr [esi-C]
0045B835    F3:AB           rep     stos dword ptr es:[edi]   这里储存需要用到的函数,数据窗口定位在edi上
0045B837    59              pop     ecx
0045B838    5F              pop     edi
0045B839    35 BB82506D     xor     eax, 6D5082BB
0045B83E    890413          mov     dword ptr [ebx+edx], eax
0045B841  ^ E9 58FFFFFF     jmp     0045B79E
0045B846    41              inc     ecx
0045B847  ^ E9 94FEFFFF     jmp     0045B6E0
0045B84C    FFB5 E31C0000   push    dword ptr [ebp+1CE3]     在这里下断,运行,数据窗口会看见函数列表,复制出来.

然后,找到oep,在oep处中断,把复制出来的输入函数列表挪到原来的输入表的位置,记住每个函数只复制一次就行了,不同的dll中间需要用一行00000000隔开,以利于区分.

壳没有抽取代码,其主要表现形式有三种:
第一种:
CALL [004XXXXX] 变成 CALL [00XXXXXX] 的形式,当然这个形式里面的 00XXXXXX 表现为不同的地址,这里的00XXXXXX是壳里的地址,由于我们跳开了抽取函数代码,所以最后会返回到函数的地址,修复的方法是找到所有这样的地址,然后跟踪一下
进入一个这样的call:
首先传递一些参数:
0045C013    6A 00           push    0
0045C015    9C              pushfd
0045C016    50              push    eax
0045C017    53              push    ebx
0045C018    8B5C24 10       mov     ebx, dword ptr [esp+10]
0045C01C    53              push    ebx
0045C01D    83EB 06         sub     ebx, 6
0045C020    68 E9260000     push    26E9
0045C025    68 0000B300     push    0B30000       变形call
0045C02A    C3              retn
来到00B30000,这里通过堆栈,利用产生的另外几个区段的数据计算出函数地址:
00B30000    55              push    ebp
00B30001    56              push    esi
00B30002    57              push    edi
00B30003    51              push    ecx
00B30004    52              push    edx
00B30005    50              push    eax
00B30006    BD 1A994500     mov     ebp, 45991A
00B3000B    016C24 18       add     dword ptr [esp+18], ebp
00B3000F    2B9D 962A0000   sub     ebx, dword ptr [ebp+2A96]
00B30015    8BBD DE2A0000   mov     edi, dword ptr [ebp+2ADE]
00B3001B    8B8D DA2A0000   mov     ecx, dword ptr [ebp+2ADA]
00B30021    8BC3            mov     eax, ebx
00B30023    2B85 D22A0000   sub     eax, dword ptr [ebp+2AD2]
00B30029    D3E8            shr     eax, cl
00B3002B    8B0487          mov     eax, dword ptr [edi+eax*4]
00B3002E    8BF0            mov     esi, eax
00B30030    81E6 FFFF0000   and     esi, 0FFFF
00B30036    C1E8 10         shr     eax, 10
00B30039    8BF8            mov     edi, eax
00B3003B    8D043E          lea     eax, dword ptr [esi+edi]
00B3003E    BA 06639227     mov     edx, 27926306
00B30043    D1E8            shr     eax, 1
00B30045    8BC8            mov     ecx, eax
00B30047    69C9 8466DA44   imul    ecx, ecx, 44DA6684
00B3004D    2BD1            sub     edx, ecx
00B3004F    8B8D FA2A0000   mov     ecx, dword ptr [ebp+2AFA]
00B30055    51              push    ecx
00B30056    8B0CC1          mov     ecx, dword ptr [ecx+eax*8]
00B30059    33CA            xor     ecx, edx
00B3005B    3BCB            cmp     ecx, ebx
00B3005D    59              pop     ecx
00B3005E    74 0C           je      short 00B3006C
00B30060    77 05           ja      short 00B30067
00B30062    8D78 01         lea     edi, dword ptr [eax+1]
00B30065  ^ EB D4           jmp     short 00B3003B
00B30067    8D70 FF         lea     esi, dword ptr [eax-1]
00B3006A  ^ EB CF           jmp     short 00B3003B
00B3006C    8B5C24 1C       mov     ebx, dword ptr [esp+1C]
00B30070    3354C1 04       xor     edx, dword ptr [ecx+eax*8+4]
00B30074    0FB61B          movzx   ebx, byte ptr [ebx]
00B30077    2BD3            sub     edx, ebx
00B30079    8BB5 EA2A0000   mov     esi, dword ptr [ebp+2AEA]
00B3007F    8B0496          mov     eax, dword ptr [esi+edx*4]
00B30082    35 67B6BDD0     xor     eax, D0BDB667
00B30087    50              push    eax
00B30088    8A00            mov     al, byte ptr [eax]
00B3008A    04 0F           add     al, 0F
00B3008C    74 11           je      short 00B3009F
00B3008E    F6D8            neg     al
00B30090    2C 23           sub     al, 23
00B30092    74 0B           je      short 00B3009F
00B30094    FEC8            dec     al
00B30096    74 07           je      short 00B3009F
00B30098    FEC8            dec     al
00B3009A    74 03           je      short 00B3009F
00B3009C    F8              clc
00B3009D    EB 1E           jmp     short 00B300BD
00B3009F    8B0424          mov     eax, dword ptr [esp]
00B300A2    8B00            mov     eax, dword ptr [eax]
00B300A4    330424          xor     eax, dword ptr [esp]
00B300A7    C1E8 18         shr     eax, 18
00B300AA    84C0            test    al, al
00B300AC  ^ 74 EE           je      short 00B3009C
00B300AE    8B0424          mov     eax, dword ptr [esp]
00B300B1    8A40 01         mov     al, byte ptr [eax+1]
00B300B4    34 C3           xor     al, 0C3
00B300B6  ^ 74 E4           je      short 00B3009C
00B300B8    83C4 04         add     esp, 4
00B300BB    50              push    eax
00B300BC    F9              stc
00B300BD    58              pop     eax
00B300BE    73 02           jnb     short 00B300C2
00B300C0    33C0            xor     eax, eax
00B300C2    50              push    eax
00B300C3    5B              pop     ebx
00B300C4    58              pop     eax
00B300C5    5A              pop     edx
00B300C6    59              pop     ecx
00B300C7    5F              pop     edi
00B300C8    5E              pop     esi
00B300C9    5D              pop     ebp
00B300CA    830424 08       add     dword ptr [esp], 8
00B300CE    C2 0400         retn    4
返回到这里:
0045C00F    5B              pop     ebx
0045C010    58              pop     eax
0045C011    9D              popfd
0045C012    C3              retn

这只是其中一种00XXXXXX地址 的 CALL [00XXXXXX] 的返回地址,如果里面的00XXXXXX 不同的话返回地址是不同的,跟一下就知道了,由于已经制造好了一个输入表,因此可以在这里比较输入表和这里的esp的值即产生的函数地址,相同的话,就把这句代码修复好.
比如:401000 call [00XXXXXX] 得到 esp 值是 74142545 而输入表 中 402000的地址也是 74142545 ,那就改成:401000 call [402000],具体操作可以通过path一段代码来自动完成.
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章