教材内容总结
恶意代码
指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。
恶意代码类型
- 计算机病毒:是一种能够自我复制的代码,通过将自身嵌入其他程序进行感染,而感染过程通常需要人工干预才能完成。
- 蠕虫:其自我复制与计算机病毒类似,但蠕虫是一类自主运行的恶意代码,并不需要将自身嵌入到其他宿主程序中。一般通过主动扫描和攻击网络服务的漏洞进行传播,一般不需要人工干预。
- 恶意移动代码:移动代码指可以从远程主机下载并在本地执行的轻量级程序,不需要或仅需要极少的人为干预。恶意移动代码是指在本地系统执行一些用户不期望的恶意动作的移动代码。
- 后门:指一类能够绕开正常的安全控制机制,从而为攻击者提供访问途径的一类恶意代码。攻击者可以通过使用后们工具对目标主机进行完全控制。
- 特洛伊木马:是一类伪装成有用的软件,但隐藏其恶意目标的恶意代码。后门仅为攻击者给出非法访问途径,而特洛伊木马的特征则在于伪装性。
- 僵尸网络:攻击者出于恶意目的,传播将是程序控制大量主机,并通过一对多的命令与控制信道所组成的攻击网络。僵尸网络区分于其他攻击方式的基本特征是使用一对多的命令与控制机制,具有恶意性和网络传播特性。
- 内核套件:是在用户态通过替换或修改系统关键可执行文件,或者在内核态通过控制操作系统内核,用以获取并保持最高控制权的一类恶意代码,又分为用户态Rootkit和内核态Rookit两种。
恶意代码分析技术
恶意代码的分析分为两大类:静态分析、动态分析。
静态分析:不运行程序,通常先进行反汇编;分析控制流与数据流确定功能。
动态分析:运行时分析,对于混淆、自变化程序有免疫性,但是运行哪段代码需要慎重选择。
- 反病毒软件扫描:进行恶意代码分析最直接的方法是使用现成的反病毒软件来扫描待分析的样本,已确定反病毒软件是否能够识别该样本,以及所识别的类型、家族、变种等信息。
- 文件格式识别:再面对一个未知的恶意代码样本文件时,第一步要做的就是对它的文件格式进行识别。恶意代码通常是以二进制可执行文件格式存在的,其他的存在形式还包括脚本文件、带有宏指令的数据文件、压缩文件等。
- 字符串提取分析:字符串提取分析是代码静态分析中非常简单但是很有用的一环,利用一些专用的字符串提取工具。我们可以彻底地搜查目标程序,并提取出程序中的字符串,通过进一步的分析查找,为进一步的恶意代码分析提供参考。
- 二进制结构分析:大部分二进制文件形式存在的恶意代码,如:可执行程序、动态链接库、内科驱动模块、静态程序库等,其生成过程是高级语言源代码的通常的编译和链接过程。
- 反汇编与反编译
反汇编与反编译是对二进制程序编译连接的逆过程,反汇编是把二进制程序的目标代码从二进制指令码转换为汇编代码的处理过程,而反编译则更进一步,期望将汇编代码再进一步还原成高级编程语言形式的源代码。 - 代码结构与逻辑分析
在反汇编与反编译获得二进制程序的汇编代码或高级语言代码以后,针对这些代码进行结构与逻辑分析构成了静态分析中最为核心的任务,这个过程需要更多的分析师人工参与。 - 加壳识别与代码脱壳
缓冲区溢出
缓冲区溢出是计算机程序中存在的一类内存安全违规漏洞。缓冲区溢出是指当计算机向缓冲区内填充数据位数时,超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区 又被称为"堆栈"。在各个操作进程之间,指令会被临时储存在“堆栈"当中,"堆栈"也会出现缓冲区溢出。
缓冲区溢出攻击原理
缓冲区溢出漏洞根据缓冲区在进程内存空间中的位置不同,分为栈溢出、堆溢出和内核溢出这三种具体技术形态。
- 栈溢出:程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞(比如说,还有向堆中写,向bss段写)。而对于黑客来说,栈溢出漏洞轻则可以使得程序崩溃,重则可以使得攻击者控制程序执行流程。此外,发生栈溢出的基本前提是(1)程序必须向栈上写入数据,(2)写入的数据大小没有被良好地控制。、
shellcode
shellcode实质是指溢出后执行的能开启系统shell的代码。但是在缓冲区溢出攻击时,也可以将整个触发缓冲区溢出攻击过程的代码统称为shellcode,按照这种定义可以把shellcode分为四部分:
(1)核心shellcode代码,包含了攻击者要执行的所有代码。
(2)溢出地址,是触发shellcode的关键所在。
(3)填充物,填充未使用的缓冲区,用于控制溢出地址的位置,一般使用nop指令填充——0x90表示。
(4)结束符号0,对于符号串shellcode需要用0结尾,避免溢出时字符串异常。
恶意代码分析
恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据、运行具有入侵性或破坏性的程序、破坏被感染电脑数据的安全性和完整性的目的。恶意软件的传染的结果包括浪费资源、破坏系统、破坏一致性,数据丢失和被窃并能让客户端的用户失去信心。
将radar.rar在虚拟机解压,并运行MD5对其进行校验,得如下摘要信息:
执行RaDa.exe,可以发现RaDa.exe在C盘根目录下生成了两个子目录:bin和tmp。
监控发现RaDa.exe文件激活,并将木马文件释放到了bin中
注册表监控发现rata.exe在注册表的启动项下建立了RaDa键值,并将C:\RaDa\bin\RaDa.exe路径添加了进去
运行其中一个参数-gui
得到了该程序的图形界面
分析:RaDa.exe使用了cgiget和cgiput等参数。而且,RaDa除读取注册表和文件信息外,没有更多改写文件和注册表等行为。综合判断,该程序不大可能是病毒和蠕虫,更有可能是一个比较典型的主动反弹型木马或者后门程序。
seed缓冲区溢出实验
- 输入命令安装一些用于编译32位C程序的东西:
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
输入命令“linux32”进入32位linux环境,输入“/bin/bash”使用bash
Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:sudo sysctl -w kernel.randomize_va_space=0
设置 randomize_va_space 为 0 后,再看看 cat 的内存布局,可以看出,栈和 mmap 区域都从固定位置开始了。为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。
linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序:然后进入tmp目录,cd /tmp
将漏洞程序stack.c,保存到 /tmp 目录下
然后进行gcc编译,如图
设置SET-UID
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。
而 -z execstack 用于允许执行栈。
把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下。攻击程序代码如下:
现在我们要得到shellcode在内存中的地址,输入命令:
gdb stack
disass main
结果如图:
根据语句 strcpy(buffer+100,shellcode); 我们计算shellcode的地址为 0xffffd020(十六进制)+100(为十进制,十六进制为64)=0xffffd084(十六进制)
现在修改exploit.c文件,修改如下:编译exploit.c程序:gcc -m32 -o exploit exploit.c
先运行攻击程序exploit,再运行漏洞程序stack,得出攻击结果