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之间的对应关系

节偏移是由于存储单元差异引起的节地址差,其值为: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之一。

jejne

je = jmp equal jne = jmp not equal

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,异常处理是非常重要的一部分。当程序运行时如果出现错误,如果没有异常处理,程序就会崩溃。为了避免这种情况,Python提供了异常处理机制。 在Python中,异常处理语句使用 `try` 和 `except` 关键字来实现。`try` 语句块中包含可能会发生异常的代码,如果这段代码出现了异常,则会跳转到 `except` 语句块中执行异常处理代码。 下面是一个简单的例子: ```python try: num = int(input("请输入一个整数:")) print(10/num) except ZeroDivisionError: print("除数不能为0") except ValueError: print("输入的不是整数") ``` 在上面的代码中,我们尝试将用户输入的字符串转换为整数,并将其用作除数计算 10/num。如果用户输入的是 0,则会触发 ZeroDivisionError 异常。如果用户输入的不是整数,则会触发 ValueError 异常。如果发生异常,则会跳转到对应的 except 语句块中执行处理代码。 除了可以指定具体的异常类型,也可以使用 `except Exception` 来捕获所有异常。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) ``` 在上面的代码中,如果发生任何异常,都会跳转到 `except` 语句块中执行处理代码,并将异常信息打印出来。 除了 `try` 和 `except`,还有 `finally` 关键字,它指定的代码块无论是否发生异常都会执行。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) finally: print("程序执行完毕") ``` 在上面的代码中,无论是否发生异常,都会执行 `finally` 中的代码,即输出“程序执行完毕”。 总之,在Python中,异常处理是非常重要的一部分,它可以有效避免程序崩溃,提高程序的健壮性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值