1.10.3 宽字符

“对IDA/IDQ漏洞提交的URL被改变,是因为发送的内容由单字节转换成了宽字符。”

小知识:单字节、多字节和宽字节

在多年前,许多人一直将文本串作为一系列单字节字符来进行编码,并在结尾处放上一个零。但单字节只能有256种编码,根本不够表示世界各国的文字。这样,就出现了多字节编码。

在多字节编码中,字符有单字节和双字节。在双字节字符中,第一个字节或“前导字节”发出信号,表示它和下一个字节将被解释为一个字符。因为字节编码既有单字节又有双字节,这样就比较麻烦。

“宽字符”是双字节、多语言字符代码。每个字符都用固定的 16 位大小表示,因此使用宽字符可以简化国际字符集的编程。特别的,Unicode就是一种宽字符编码的国际标志,它用一个16位的值来表示每个字符。

“所以,在最开始的时候,eEye的办法是在ShellCode前面放上很多NOP,这样就把ShellCode推向了0x004x00xx的地址,就可以用xx4x这样的串来覆盖ret,这个串被扩展为xx004x00以后,正好跳转到ShellCode的位置。”

“哇,办法很巧妙哈!”大家说道。

“嗯,这种方法虽然理论上行得通,但实际上问题非常多,可以控制跳转却无法执行代码,而且不同的机器这个0x004x00xx都不一样,这样就很难做出通用性比较好的Exploit。”

“哦,那怎么办呢?”

“随着技术的发展,有人发现可用巧妙的方法来避开被扩展成宽字符,这样我们就可轻松的改写很完善的Exploit了!”

“哦!黑客精神真是好啊!很多困难的问题大家一起解决、一起进步。”大家由衷的说道,“用的是什么方法呢?”

“方法就是:在我们要用的JMP 04、JMP EBX地址和ShellCode前面加一个‘%u’符号,IIS是这样处理‘%u’的,它认为是宽字符,就不再作变换了。比如,JMP 04的指令写成 %u04eb 。我们把ShellCode都加上‘%u’,就不会改变我们的东西了。”

“哦!这样啊!真是一语点破天机啊!”台下感叹道。

“呵呵,这就是黑客魅力的所在。好了,我们就用这个办法把这个Exploit完成吧!”

“好咧!”

大家一边回答,一边给ShellCode添上“%u”标志。

“呼! 添加完成了。”同学们擦擦汗。

“好!我们运行试试吧!”老师一编译、执行,哈,一个用户就添加上了。

“哦!”教室里欢呼了起来,“成功罗!成功罗!”

“呵呵,菜鸟还是有菜鸟的乐趣吧!尤其是经过种种挫折后的成功,会很有成就感的!好,今天就到这里,下周这个时候我们再继续吧!”