0

我目前正在尝试在运行时实现代码的重新随机化,以提高针对代码重用攻击的安全性。为此,我需要与位置无关的代码/可执行文件(PIC/PIE)。

我必须在生成的代码中更改的一件事是全局数据引用。使用 -fPIE 标志,它们相对于指令指针生成为 leaq,但由于我需要在运行时移动函数的位置,因此我需要将其更改为绝对寻址。我通过在汇编器输出中执行以下更改来做到这一点:

    leaq    .LC7(%rip), %rsi

=>

    leaq    .LC7, %rsi

这应该由编译器解决为使用绝对寻址的加载。问题是这不再是有效的 PIE 代码,并且链接器说无法执行这个特定的重定位。这是我收到的错误消息:

/usr/bin/ld: daugther.o: relocation R_X86_64_32S against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
daugther.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

当我使用 -fPIC 标志(用于共享对象 - 我确实想创建一个独立的可执行文件)时,我的检测代码被转换回它的原始形式。

有谁知道我如何在保持位置独立可执行的同时实现全局数据引用的绝对寻址?

所有编译器调用和步骤是:

g++ -O2 std=c++1z -fPIE -o daughter.s daughter.cpp
<do the instrumentation step>
g++ -o daughter daughter.s -pie
4

0 回答 0