5.1.2 ShellCode编码的用处

避免截断

“我们对ShellCode编码的第一个用处是避免ShellCode里出现‘\x00’,从而被截断。”老师说道。

“这里再说一次,字符串是以ASCII码‘\x00’为结束标志的。当我们定义字符串时,编译器会自动在末尾添加一个‘\x00’。比如 char name[] = 'ww0830' ,其实就是 char name[] = 'ww0830\x00' 。”

“而那些Strcpy、Strlen等字符串操作函数,是把‘\x00’作为字符串的结束标志。”老师说道:“如果我们的ShellCode中有‘\x00’,那很显然,目标程序用strcpy进行数据拷贝时,就会在ShellCode中的第一个‘\x00’处结束。这样,我们的ShellCode就不完整,实现不了我们想要的功能。”

“注意, char name[] = 'ww0830' 里面的‘0’和ASCII码‘\x00’是不一样的。 ‘ww0830’ 里的‘0’对应的ASCII码是‘\X60’,不会被截断。这是初学者常见的问题。”

“哦!原来是这样啊!以前一直有点迷糊!”台下有人说道。

“所以,如果ShellCode中有‘\x00’,那我们肯定需要把它去掉,方法是对ShellCode进行编码。但编码不仅仅是这个作用,还有其他功能。”

符合目标程序的要求

“我们对ShellCode编码的第二个用处就是使其符合目标程序对字符的规范。”老师说道。

“比如,攻击Foxmail的ShellCode里不能有斜线,即‘/’,攻击IIS的ShellCode里面不能有空格,即‘\x20’。所以对不同的目标程序,对ShellCode的要求也不同。我们也需要通过编码来避免。”

“如果说编码避免‘\x00’是ShellCode的共性,那么避免目标程序的特殊字符要求就是个性了。”

“共性,个性,那还有特性吗?”小倩问道。

“当然有啊,我们还可通过给ShellCode编码,使其突破IDS!”

突破IDS

“我们对ShellCode编码的第三个用处,就是使其突破IDS的探测!”老师说。

小知识:IDS简介

IDS(intrusion detection system)入侵检测系统是种新兴的、但仍在继续发展中的技术。或者监测主机日志、进程、会话、以及系统文件的更变,或者监测主机/网络的通信信息,以发现正在发生的入侵行为。其工作流程大致分为以下几个步骤:信息收集、信号分析、模式匹配、统计分析、实时记录、报警或有限度反击。IDS的根本任务是对入侵行为作出适当的反应,这些反应包括详细日志记录、实时报警和防火墙联动,甚至作有限度的反击等。

“所以,我们对ShellCode编码,可以在一定程度上躲开IDS的探测,达到攻击的效果。”