网安组新人任务Week2笔记

代码重定位

  • 代码重定位是吧可执行代码从内存的一个地方移动到另一个地方去,保证该部分代码还能正常执行的一项技术
  • 代码重定位的关键解决方法是使用相对地址来代替绝对地址,用寄存器访问代替全局变量的访问

PE文件头中的重定位表

PE重定位是为了便于PE加载程序时修正代码中使用的绝对地址,保证程序在不同地址空间上运行的兼容性

  • 当装载时IMAGE_OPTIONAL_HEADER32.ImageBAse(程序装载基地址)位置已经被占用时,操作系统会重新选择另一个基地址,这是就需要根据PE中的重定位表对所有的重定位信息进行修正
  • 重定位表位于数据目录的第6个目录项

重定位表项IMAGE_BASE_RELOCATION

20191021093308
20191021093308
  • 如果PE文件中有n个重定位项,重定位表的大小为2*n+4+4
  • VirtualAddress是重定位块RVA
  • SizeOfBlock是该页面中重定位表的项数
  • 重定位表的组织方式为页面1的IMAGE_BASE_RELOCATION后是页面1的重定位表现然后是页面2的IMAGE_BASE_RELOCATION
  • 每个重定位表项大小为1个字节,每个字高4位说明此重定位项的类型,一般值只为0和3,0 代表无意义只作对齐用,3代表着双字32位都需要修正
20191021094428
20191021094428
  • 所有的重定位块最终以一个VirtualAddress字段为0的IMAGE_BASE_RELOCATION结果作为结束