0day安全学习笔记-第一章(郑大计科)
1.2.1 PE文件格式
.text 由编译器产生,存放二进制机器代码,是反汇编和调试的对象
.data 初始化的数据库,如宏定义、全局、静态变量。
.idata 可执行文件所使用的动态连接库等外来函数与文件的信息
.rsrc 存放的是程序的资源,如图标、菜单
1.2.2 虚拟内存
通过虚拟内存管理器的映射,可以使得每个进程都以为自己有大量的内存空间可以访问,但是每个进程在运行时并不会用到太大的内存空间,所以当它们不适用那些“虚拟地址”的时候,这些地址对于进程来说就是一笔“无形的财富”当需要进行实际的内存操作时,内存管理器才会把“虚拟地址”和“物理地址”联系起来。 可以将其类比为银行与储户
1.2.3 PE文件与虚拟内存之间的映射
1)文件偏移地址(File Offset): 数据在PE文件中的地址叫文件偏移地址,是文件在磁盘上存放时相对于文件开头的偏移
2)装载基址(Image Base): PE文件装入内存时的基地址。默认情况下,EXE文件在内存中的基地址时0x00400000,DLL文件是0x10000000。这些位置可以通过修改编译选项来更改。
3)虚拟内存地址(Virtual Address,VA): PE文件中的指令被装入内存后的地址
4)相对虚拟地址(Relative Virtual Address,RVA): 相对虚拟地址是内存地址对于映射基址的偏移量
虚拟内存地址、装载基址、相对虚拟内存地址三者之间的关系: |
VA = Image + RVA |
PE文件存放:PE数据节的大小永远为0x200的整数倍 内存中的节的大小永远为0x1000的整数倍 例:若虚拟内存中0x00404141处的一条指令,那么若要换算出这条指令载文件中的偏移量,
则有: 文件偏移量 = 0x00404141 - 0x00400000 -(0x1000 - 0x400) = 0x3541、
文件偏移地址和RVA之间的对应关系如下图所示:
节偏移是由于存储单元差异引起的节地址差,其值为:RVA-文件偏移量
文件偏移地址与虚拟内存地址之间换算关系为:
文件偏移地址 = VA - Image Base - 节偏移
= RVA - 节偏移
OllyDbg部分快捷键
F8 单步执行 遇到函数调用指令不跟入
F7 单步执行 遇到函数调用指令跟入
F2 设置断点 两次取消断点
F4 执行到当前光标所选中的命令 遇到循环可以执行到循环结束后的指令
F9 运行程序 运行程序直到断点
Ctrl + G 查看任意位置处的数据 指令区、栈区、内存区都可以用
IDA Pro 部分快捷键
快捷键功能
; 为当前指令添加全文交叉引用的注释
n 定义或修改名称,通常用来标注函数名
g 跳转到任意地方观察代码
Ese 返回到跳转之前的位置
D 分别按字节、字、双字的形式显示数据
A 按照ASCII形式显示数据
ida中左侧的.text地址为VA,即虚拟地址
lea 指令
LEA reg16,mem LEA指令将存储器操作数mem的4位16进制偏移地址送到指定的寄存器。这里,源操作数必须是存储器操作数,目标操作数必须是16位通用寄存器。因该寄存器常用来作为地址指针,故在此最好选用四个间址寄存器BX,BP,SI,DI之一。
je与jne
je = jmp equal jne = jmp not equal