C1 基础知识
1.1.3 漏洞分析和利用
漏洞挖掘:实际上是高级测试QA。工程界常用fuzz;学术界用静态分析。
漏洞分析:找到POC(proof of concept)代码,无法获得POC时,利用厂商提供的漏洞描述,使用补丁比较器,比较patch前后的修改,再利用反汇编工具进行逆向分析。
漏洞利用:缓冲区溢出;内存漏洞(堆栈溢出),web漏洞(脚本注入)
1.1.4 漏洞公布
- CVE:cve.mitre.org
- cert:cert.org
- 微软安全中心 每月 第二周 的 周二发布补丁
1.2 二进制文件
1.2.1 PE文件格式
PE(portable executable)是win32可执行文件的数据格式。如exe,dll。
PE把可执行文件分成多个数据节(section),分别存放不同资源。
.text
:代码区 由编译器产生,存放二进制机器代码(反汇编和调试对象)
.data
数据区:初始化数据块,如宏定义、全局变量、静态变量
.idata
使用的动态链接库等外来函数与文件信息
.rsrc
存放程序的资源,如图标、菜单等
还有.reloc
/.edata
/.tls
/ .rdata
等
C++的编译指示可以自定义节名
如果可执行文件进行了加壳处理,PE的节信息就会变得奇怪。
1.2.2 虚拟内存
Windows的内存分为:物理内存(核心态ring0)和虚拟内存(用户态ring3)
内存管理器分配进程一块“虚拟地址”,进程使用内存时,将虚拟地址映射物理内存地址。
1.2.3 PE文件和虚拟内存之间的映射
调试漏洞时,经常需要两种操作
- 静态反汇编工具看到PE文件中指令的位置(文件偏移),要知道其在内存中所处的位置(虚拟内存地址VA)。
- 调试时看到某条指令的地址是虚拟内存地址,要回到PE文件中找到指令对应的机器码。
所以需要弄清PE文件地址和虚拟内存地址之间的映射关系。
1)文件偏移地址(file offset):数据在PE文件中的地址,相对于文件开头的偏移。按照磁盘数据标准,以0×200
字节为基本单位,不足被0×00填充;一个数据节超过0×200时,分配下一个0×200块。PE数据节大小永远是0×200的整数倍。
2)装载基址(image base):PE装入内存中的基地址。默认exe在内存中的基地址是0×00400000,DLL是0×10000000,这些位置可通过编译选项更改。按照内存数据标准,大小永远是0×1000字节的整数倍。
3)虚拟内存地址(virtual address,VA):PE文件中的指令被装入内存后的地址
4)相对虚拟地址(relative virtual address,RVA):内存地址相对于映射基址的偏移量
后三者关系
这种由存储单位差异引起的节基址差称为节偏移(转换的地址位于第几个节内),上例中
文件偏移地址 = 虚拟内存地址 - 装载基址 - 节偏移
= RVA - 节偏移
可用 lordPE
工具查看节信息
1.3 必备工具
- ollydbg:反汇编分析,16进制编辑,动态调试,GUI界面。动态分析
- softICE:工作在ring0级,可调试驱动等内核对象
- windbg:内核安全和调试
- IDA PRO:静态反汇编
- 二进制编辑器 ultraedit
crack例子爆破分析(跳过密码验证)
- if判断决定程序是否跳出循环(正确跳出,错误循环请求密码)
- 找到if对应二进制代码,修改
- 用IDA解析exe文件,自动识别出main函数
- ollydbg动态调试,修改内存中机器指令,
- ultraedit修改文件中指令