实验内容:修改二进制可重定位目标文件“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