逆向学习之路——0day安全(1)

漏洞利用原理

基本概念

1.漏洞挖掘
学术界一直较热衷于静态分析
工程界用的方法叫Fuzz,实际上是一种灰盒测试
2.漏洞分析
有POC代码(既有效的可利用的代码),便能找到漏洞的触发点,观察漏洞细节。
无POC代码,则用补丁比较器,比较修改之前之后 的区别,之后用IDA重点逆向分析这些不同的地方
3.关于0day
在漏洞补丁发布之前,漏洞便被曝光,整个 Internet 的网络将处于高危预警状态。(patch 发布后 1 天,叫做 1 d ay,5 天叫做 5 day,未发 patch 统称 0 day)。

二进制文件

简称PE文件(我们平时生活用的exe.和dll.都是该类文件)
操作系统会根据PE格式约定定位资源并存入内存的不同区域中去。

典型PE分的若干个节

.text 二进制代码,是我们反汇编和调试的对象。
.data 初始化数据块,如宏定义、全局变量、宏观变量。
.idata 动态链接库等外来函数与文件的信息。
.rsrc 存放程序的资源,如图标、菜单等。

(PS:正常标准PE文件,其节信息大致都是相同的。但如果可执行文件经过了“加壳”处理,PE 的节信息就会变得非常“古怪”。在Crack 和反病毒分析中需要经常处理这类古怪的 PE 文件。)

虚拟内存

Windows内存可分为虚拟内存和物理内存(内核级别才可见,较复杂)
一般用户模式下,我们见到的都是虚拟内存。

虚拟内存对物理内存映射的理解
Windows 的内存管理机制在很大程度上与日常生活中银行所起的金融作用有一定的相似性,我们可以通过一个形象的比方来理解虚拟内存。

z 进程相当于储户。

z 内存管理器相当于银行。

z 物理内存相当于钞票。

z 虚拟内存相当于存款。

z 进程可能拥有大片的内存,但使用的往往很少;储户拥有大笔的存款,但实际生活中的开销并没有多少。

z 进程不使用虚拟内存时,这些内存只是一些地址,是虚拟存在的,是一笔无形的数字财富。

z 进程使用内存时,内存管理器会为这个虚拟地址映射实际的物理内存地址,虚拟内存地址和最终被映射到的物理内存地址之间没有什么必然联系;储户需要用钱时,银行才会兑换一定的现金给储户,但物理钞票的号码与储户心目中的数字存款之间可能并没有任何联系。

z 操作系统的实际物理内存空间可以远远小于进程的虚拟内存空间之和,仍能正常调度;银行中的现金准备可以远远小于所有储户的储蓄额总和,仍能正常运转,因为很少会出现所有储户同时要取出全部存款的现象;社会上实际流通的钞票也可以远远小于社会的财富总额。

PE 文件与虚拟内存之间的映射

VA= Image Base+ RVA

VA:虚拟内存地址
Image Base:装载基址 (EXE文件在内存中的基地址是 0x00400000,DLL
文件是 0x10000000)
RVA:相对虚拟地址(偏移量)

文件偏移地址
= 虚拟内存地址(VA)−装载基址(Image Base)−节偏移**
=RVA -节偏移

节偏移
内存数据存放单位不同而导致的差异

例:
(1)PE 文件中的数据按照磁盘数据标准存放,以 0x200 字节为基本单位进行组织。当一个数据节(section)不足 0x200 字节时,不足的地方将被 0x00 填充;当一个数据节超过 0x200字节时,下一个 0x200 块将分配给这个节使用。因此 PE 数据节的大小永远是 0x200 的整数倍。

(2)当代码装入内存后,将按照内存数据标准存放,并以 0x1000 字节为基本单位进行组织。类似的,不足将被补全,若超出将分配下一个 0x1000 为其所用。因此,内存中的节总是0x1000 的整数倍。

.text 节偏移=0x1000-0x400=0xc00 
.rdata 节偏移=0x7000-0x6200=0xE00 
.data 节偏移=0x9000-0x7400=0x1C00 
.rsrc 节偏移=0x2D000-0x7800=0x25800 

你可能感兴趣的:(逆向题目练习)