基础知识
漏洞概述
1.我们通常把能够引起软件做一些“超出设计范围的事情”的bug称为漏洞(vulnerability)。
(1)功能性逻辑缺陷(bug):影响软件的正常功能,如:执行结果错误、图标显示错误等等。
(2)安全性逻辑缺陷(漏洞):通常情况下不影响软件的正常功能,但被攻击者成功利用后,有可能引起软件去执行额外的恶意代码。常见漏洞包括软件中的缓冲区溢出漏洞、跨站脚本漏洞(XSS)、SQL注入漏洞等。
2.0day:未被公布、未被修复的漏洞被称作0day。
公布漏洞的权威机构:
CVE(Common Vulnerabilities and Exposures)CVE编号通常是引用漏洞的标准方式。
CERT(Computer Emergency Response Team)计算机应急响应组 会在第一时间跟进当前的严重漏洞,包括描述信息、POC的发布链接、厂商的安全响应进度、用户应采取的临时性防范措施等。
二进制文件概述
PE文件格式
PE是Win32平台下可执行文件遵守的数据格式。
PE文件格式把可执行文件分成若干个数据节(section),不同资源被存放在不同的节中。
一个典型的PE文件中包含的节:
.text 存放着二进制的机器代码,反汇编和调试的对象。
.data 初始化的数据块,如宏定义、全局变量、静态变量等。
.idata 可执行文件使用的动态链接库等外来函数与文件的信息。
.rsrc 存放程序的资源,如图标、菜单等。
操作系统原理中的虚拟内存是指 当实际的物理内存不够时,有时操作系统会把“部分硬盘空间”当做内存使用从而使程序得到装载运行的现象。
PE文件与虚拟内存之间的映射
在调试漏洞时,可能需要做这样两种操作。
(1)静态反汇编工具看到的PE文件中某条指令的位置是 相对于磁盘文件 而言的,即所谓的 文件偏移,我们可能还需知道这条指令在内存中所处位置,即虚拟内存地址(VA)。
(2)反之,在调试时看到的某条指令的地址时虚拟内存地址,我们需要回到PE文件中找到这条指令对应的机器码。
文件偏移地址(File Offest)
数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。
装载基址(Image Base)
PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件是0x10000000。
虚拟内存地址(Virtual Address,VA)
PE文件中的指令被装入内存后的地址。
相对虚拟地址(Relative Virtual Address,RVA)
相对虚拟地址是内存地址相对于映射基址的偏移量。
虚拟内存地址、映射基址、相对虚拟内存地址三者之间的关系:
(1) PE文件中的数据按照磁盘数据标准存放,以0x200字节为基本单位进行组织。当一个数据节(section)不足0x200字节时,用0x00填充。因此 PE数据节的大小是0x200的整数倍。
(2)当代码装入内存后,将按照内存数据标准存放,并以0x1000字节为基本单位进行组织。因此 内存中的节总是0x1000的整数倍。
节(section) | 相对虚拟偏移量RVA | 文件偏移量 |
---|---|---|
.text 0x00001000 | 0x0400 | |
.rdata 0x00007000 | 0x6200 | |
.data 0x00009000 | 0x7400 | |
.rsrc 0x002D | 000 | 0x7800 |
内存中数据节相对于装载基址的偏移量和文件中数据节的偏移量有上述差异。
有存储单位差异引起的节基址差称作节偏移
.text节偏移=0x1000-0x400=0xC00
.rdata节偏移=0x7000-0x6200=0xE00
.data节偏移=0x9000-0x7400=0x1C00
.rsrc节偏移=0x2D000-0x7800=0x25800
文件偏移地址与虚拟内存地址之间的换算关系:
文
件
偏
移
地
址
=
虚
拟
内
存
地
址
(
V
A
)
−
装
载
基
址
(
I
m
a
g
e
B
a
s
e
)
−
节
偏
移
=
R
V
A
−
节
偏
移
文件偏移地址=虚拟内存地址(VA)-装载基址(Image Base)-节偏移\\=RVA-节偏移
文件偏移地址=虚拟内存地址(VA)−装载基址(ImageBase)−节偏移=RVA−节偏移
工具
OllyDbg
SoftICE 工作在ring0级
Windbg 可调试内核
IDA Pro
二进制编辑器