test1 写入的地址位置

如图会出现 segmentation fault,但是我并没有修改 addr 的表达式,为什么在这里出错了而 test0 并没有出错呢 :thinking:

在这种情况下,你需要填入地址的位置不变,而需要填入的内容变成了 re.symvalue 再加上addend

我也遇到了,需要将写入位置计算中的 textAddr 改成 textOff

随后,我们需要知道 RelocEntry 指示的需要修改的源代码的位置,这个值由 re.offset 指示。而由于当前 object 在链接成可执行文件时,还包含若干其它.o,所以需要加上 textAddr,才能得到真正需要修改的地址。

就是这一句话中应该是加上 textOff 而不是 textAddr

然而为什么 test0 中可以通过?通过 gdb 调试看到,test0 中 textOff 和 textAddr 是相等的,因此可以通过

image

而在 test1 中这两个值并不相等

image

后续 test2 和 test3 不会到写入内存这一步,test4 和 test5 中 textAddr 和 textOff 都相等,使用 textOff 也能通过

不知道是实验指导中有误还是实验设计有误

3 Likes

遇到了同样的问题,linker 报 segmentation fault。

此处是运行时内存情况

此处是 test1 objdump 之后的代码

可见写入地址没有问题,可能是题目漏洞

1 Like