课后解惑

Q:ShellCode中的0x00为什么要去掉?

A:论坛上见过多次的经典问题,已经作了详细讲解。这里再说一遍,在C语言中,字符串是以0x00为结束标志,所以如果目标程序是以strcpy等函数来作字符串拷贝导致溢出的,则到达ShellCode中的0x00时,就会认为是字符串结束,从而停止拷贝,导致ShellCode被截断,完不成想要的功能。

Q:为什么有“0x000x98”这样的ShellCode存在呢?

A:那是Unicode,Unicode是两个字节表示一个字符。

Q:文本中的0和16进制中的0x00有什么区别呢?

A:当然不一样了,0x00就是16进制的0x00;而文本中的0对应的16进制是0x30。有个方法可以帮助大家理解,0x00是不可见的字符,在文本文件里是看不可见的;而文本中的0,当然是可见的,所以自然和不可见的0x00有区别了。

Q:怎么去掉ShellCode中的0x00呢?

A:我已经详细讲解过了。总体思路就用编码方法,将原ShellCode变成enShellCode;然后把解码代码放在enShellCode前面;如果还有特殊字符,就需要再进行微调。

Q:发现直接替换法是把小于0x1F的字符都作了替换处理;但decode本身还有小于0x1F的字符呢?

A:这是故意留给大家的一个小问题!分析一下decode代码里会出现小于0x1F字符的原因吧,然后想办法避开它们(提示:微调法)。

Q:除了课上讲的几种编码变换方法,还有其他的方法吗?

A:当然有了。比如,我们还可异或几个字节的Key,比如取Key为0x123456,这样来避免单字节Key的不足;也可动态使用随机的Key,以进一步躲避IDS。编码的算法你还可以进一步研究,想?2牆5 出新的算法。

Q:怎样才能构思出编码的新算法呢?

A:一、基础要好;二、要有发散性的思维!

Q:怎样牢固知识基础,提高编程能力呢?

A:如果是大学生,多参加ACM / ICPC吧!然后经过努力,通过选拔,进入ACM / ICPC的学校集训队。和优秀的人在一起才能更优秀。

Q:XP和Win2000相比,除了SEH的处理机制不同外,还有那些对溢出利用来说比较重要的改变呢?

A:一些特殊的程序,Win2000下可直接把地址覆盖成ShellCode的地址,从而直接跳转过去利用;而XP不允许执行栈中的代码。所以利用时,要覆盖写入另一个跳转地址,再返回栈中。课堂上对堆栈溢出利用的所有讲解,都是使用的这种方法,所以对Win2000和XP都适用。

Q:使用搜索法时,如果搜索的标志恰好在内存中有重复的值,会导致搜索失败吗?

A:如果内存中正好有重复的标志值,当然有可能失败。如果那个标志很简单,比如用一个0x90909090,就很有可能找到其他地方去;但如果用一个奇怪的数据(如你的名字),那多半没有重复,可以正确的定位。

Q:还有其他需要编码的程序可以实际利用吗?

A:很多啊!Serv_U漏洞、Cmail漏洞、Cproxy漏洞等,自己根据漏洞公告,用已学的知识实际利用一下吧!