理解文件偏移&相对内存偏移&节偏移

996.icu LICENSE

  • 问题背景
  • 解决方法
  • 总结

阅读之前注意:

本文阅读建议用时:5min
本文阅读结构如下表:

项目下属项目测试用例数量
问题背景0
解决方法0
总结0

问题背景

拜读《0day安全:软件漏洞分析技术》(第2版)时,看到了文件偏移的计算方法:

相对内存偏移(RVA) = 内存地址 - 加载基址
节偏移 = Voffset(该节在内存中的偏移量) - Roffset(该节在文件中的偏移量)
文件偏移 = 相对内存偏移(RVA) - 节偏移

看到这里,尽管作者有解释文件偏移和相对内存偏移不同的原因:即文件在磁盘中的存放结构,和文件载入内存中的存放结构不同,但这里并不直观。相信很多人会和我一样不太能懂为什么会有上面的计算方法。

解决方法

一番搜索,在看雪上找到了答案。
在这里插入图片描述
如上图,以.text节为例,左边400h - 0h = 400h是Roffset(.text节在文件中的偏移量),右边401000h - 400000h = 1000h是Voffset(.text节在内存中的偏移量)。
现在,对于上图应用程序,给定一个内存地址401125h,求对应的文件偏移地址。
根据上图知,该内存地址在.text节,则根据文件偏移的计算方法有:
相对内存偏移(RVA) = 401125h - 400000h = 1125h
.text节偏移 = 1000h - 400h = c00h
文件偏移 = 1125h - c00h = 525h

更直观一点,就好比2个人比赛跑步,跑了一样的距离125h,但起跑线不同(一个从左边400h开始跑,另一个从右边1000h开始跑)。节偏移就是起跑线的差距
另外,这里没用看雪答案中的401325h:因为401325h - 401000h = 325h,而.text这一节总大小只有200h,所以401325h没有对应的文件偏移,该内存地址是在内存中的以0填充的区块间隙。

此外,根据真*小学二年级数学知识,也有如下计算方法:
文件偏移 = RVA - 节偏移 = 1125h - (1000h - 400h) = 400h + (1125h - 1000h) = 525h
即 文件偏移 = Roffset + (RVA - Voffset)

总结

之所以有文件偏移和相对内存偏移的不同,是因为文件的节在磁盘中的存放结构,和载入内存中的存放结构不同。这就产生了节偏移。

在这里插入图片描述

参考资料

  1. 请问如何将偏移量转换为地址?
  2. 理解PE文件相对虚拟地址(RVA)到文件偏移的转换

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值