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漏洞一样。”
大家在台下认真的记着笔记。
“呵呵!好了,”老师说道,“下午有微软研究院的学术活动——计算与你同行,现在就下课吧!大家早点吃饭,去见见高手吧!”