1.现代攻击技术的精髓就是混淆数据和代码的界限,让系统错误地把数据当做代码去执行。
bug和漏洞的区别:
功能性逻辑缺陷(bug):影响软件的正常功能,例如,执行结果错误,图标显示错误。
安全性逻辑缺陷(漏洞):通常情况下不影响软件的正常功能,但被攻击者成功利用后,可能回引起软件去执行额外的恶意代码。常见的漏洞包括软件的缓冲区溢出,跨站脚本攻击(XSS),SQL注入。
漏洞挖掘有三种方式:白盒代码审计,灰盒逆向工程,黑盒测试,其中黑盒的FUZZ测试是效率最高的一种测试。
FUZZ测试:也叫模糊测试,是一种挖掘软件安全漏洞,检测软件健壮性的的测试,它通过向软件输入非法的字段,观测测试软件是否出现异常而实现。
PE文件格式
PE是win32平台下可执行文件遵守的数据格式
一个可执行文件不光包含二进制的机器代码,还会自带许多其他信息,比如字符串,菜单,图标,位图,字体等,PE文件格式规定所有这些信息在可执行文件中如何组织。
虚拟内存:
windows内存可以分成两个层面:虚拟内存和物理内存
物理内存会在进程运行时为其分配虚拟内存,比如512MB的物理内存,3个进程分别对应三个4G的虚拟内存,虚拟内存的值大于物理内存的值,但是这4G的虚拟内存只是个数值,代表存放的数据大小,参见银行资金和账面存款的关系。
PE文件与虚拟内存之间的映射关系
(1)静态反汇编工具看到的PE文件中某条指令的位置是相对磁盘文件而言的,即所谓的文件偏移,我们可能还要知道这条指令在内存中所处的位置,即虚拟内存地址(VA)
(2)若在调试时看到的某条某条指令的地址是虚拟内存地址,也需要回到PE文件中找这条指令对应的机器码
几个重要概念
1.文件偏移位置
数据在PE文件中的地址叫做文件偏移地址(或许“文件地址”更准确),是文件在磁盘上存放时相对文件开头的偏移
2.装载基址
PE装入内存时的基地址,默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000。这些位置是可以通过修改编译选项更改的。
3.虚拟内存地址
PE文件中的指令被装入内存后的地址
4.相对虚拟地址
相对虚拟地址是内存地址相对于映射基址的偏移量
在默认情况下,一般PE文件的0字节对应到虚拟内存的0x00400000这个位置,这个地址便是装载基址。
堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据进行插入和删除。在单片机应用,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场
由于操作系统在进行装载时“基本”上保持PE中的各种数据结构,所以文件偏移地址和RVA有很大的一致性,但由于文件数据的存放单位和内存数据的存放单位不同,所以仍会出现差异。
我们将这种由存储单位差异引起的节基址差称作节偏移
.text节偏移=0XC00
.rdata节偏移=0XE00
.data节偏移=0x1C00
.rsrc节偏移=0x25800
文件偏移地址=虚拟内存地址 - 装载基址 - 节偏移
=RVA - 节偏移