5.7.3 跨过长度限制——搜索

“这个漏洞和以往的那些漏洞不同的地方在时区里,有长度的限制,超过了294字节就会被截断,当然完不成我们想要的功能了。” 老师对着台下的同学们说。

“哦?294个字节?太短了吧?”

“是啊,我们写的ShellCode都要有1000字节!”

“那怎么办呢?”大家想啊想,“可以换一个短的,但294个字节也太短了。”

“莫非?放入我们的搜索代码?”宇强说。

“对!我们在有长度限制的时区中放入我们短小的搜索代码,而把ShellCode放在后面的那个文件名中!”

“我们获得控制权后就先执行搜索代码,它在内存中搜索ww08标志,搜索到后,才跳过去执行真正的ShellCode。”大家明白了。

“非常正确,其利用格式如图5-29。”

  

“而第一部分时区放入我们的搜索ShellCode,功能只是在内存中找标志,找到后跳过去执行。其构造如图5-30。”

  

“第二部分文件名放入查找标志和真正的ShellCode,其构造如图5-31。”

“我们就按照这样的思路来利用吧!搜索ww08标志的汇编前面讲过,如下:”

__asm
{
   mov ebx, esp //从esp开始搜索
   mov eax, 0x77773037; //eax = ww07
   inc eax //刚才是ww07,加1变成ww08,免得搜索成自己
  loop1:
   inc ebx 
   cmp [ebx],eax //比较是否为ww08
   jne loop1
   inc ebx
   inc ebx
   inc ebx
   inc ebx
   call ebx //找到ww08标志,跳过去执行
}

“在VC中嵌入汇编,然后调试提取,得到搜索代码的ShellCode。”

char search[] =
  "\x8B\xDC\xB8\x37\x30\x77\x77\x40\x43\x39\x03\x75\xFB\x43\x43\x43"
  "\x43\xFF\xD3"

“够短吧!我们把原来构造程序的ShellCode换成这个搜索ShellCode的search。”

“然后在真正ShellCode的前方加入我们的标志‘ww08’,放在空格后的文件名第二部分,这样就完成了我们的构造,得到了程序ServUtest.cpp(光盘有收录)。”

“好咧!我们测试一下吧!”同学们急切的说,“我们把精心构造的代码发送过去,对方ServU挂掉,但成功执行了我们的ShellCode,打开了端口,如图5-32。”

  

“telnet 对方的8111端口,成功的登陆上了对方!”同学们高兴的说道。

“好,到这里,我们稍微总结一下,温故而知新嘛!”老师说道,“一般的ShellCode都由两部分构成,前面一段是DecodeCode,后面一段是编码后的ShellCode。”

“第一段的存在是因为第二段如果不经过编码,可能含有大量的0x00,从而导致在字符串处理时被截断。而编码的方法就是我们今天着重介绍的内容。”

“还有些时候,溢出会对长度有限制,这时要么找一个较短的ShellCode完成功能,要么避开长度的限制,做一个简单的搜索代码,而把真正的ShellCode放到其他地方,就像刚才的MDTM漏洞一样。”

大家在台下认真的记着笔记。

“呵呵!好了,”老师说道,“下午有微软研究院的学术活动——计算与你同行,现在就下课吧!大家早点吃饭,去见见高手吧!”