????????实验内容:修改二进制可重定位目标文件“phase1.o”的数据(.data)节内容(不允许修改其他节),使其与main.o模块如下链接后运行时输出目标字符串“123456789”。
?????????实验步骤:
? ? ? ? ? ? ? ? 1. 使用objdump工具获得目标文件的汇编代码,使用readelf工具获得其重定位记录。
? ? ? ? ? ? ? ? 2.结合汇编代码和重定位信息,定位输出函数的调用参数在目标文件中的存储地址。
? ? ? ? ? ? ? ? 3.使用hexedit工具,对phase1.o模块中的数据节中相应字节进行修改。
?????????实验验证:
? ? ? ? 1.查看反汇编结果
objdump -d phase1.o > phase1.s
cat phase1.s
?? ? ? ? 2.查看可重定位信息
readelf -r phase1.o
?? ? ? ? 3.查看最终地址
? ? ? ? ? ? ? ? PC绝对地址重定位方式下,重定位后的引用符号 = 符号定义地址 -符号引用所在地址 + 重定位前引用处的初始值
? ? ? ? ? ? ? ? 绝对地址重定位方式下,重定位后的引用地址=符号定义地址 + 重定位前引用处的初始值
? ? ? ? 由1和2可知,call函数其实就为puts函数,输出字符串,偏移量为10。.data数据存放的其实就为栈中的数据,既即将打印的数据,偏移量为01 1f。
? ? ? ? 4.获取phase1.0的节头表
readelf -S phase1.o
? ? ? ? ?主要关注.data节和它的偏移地址,由图可知,它的偏移地址为60
? ? ? ? 5.查看原位置字符串内容
readelf -x.data phase1.o
????????01 1f对应位置的编码值为 1
? ? ? ? 6.修改字符串内容
hexedit phase1.o
? ? ? ? 地址为 01 1f +60 = 01 7f? 修改后即可 不过最后一个为00