我目前正在尝试在运行时实现代码的重新随机化,以提高代码重用攻击的安全性。为此,我需要与位置无关的代码/可执行文件(PIC / PIE)。
我必须在生成的代码中更改的一件事是全局数据引用。使用-fPIE标志它们相对于指令指针生成为leaq,但由于我需要在运行时移动函数的位置,我需要将其更改为绝对寻址。我通过在汇编程序输出中执行以下更改来执行此操作:
df[df.B==1]
=>
leaq .LC7(%rip), %rsi
编译器应该使用绝对寻址将其解析为负载。问题是这不再是有效的PIE代码,并且链接器表示无法执行此特定的重定位。这是我收到的错误消息:
leaq .LC7, %rsi
当我使用-fPIC标志(用于共享对象 - 我确实想创建一个独立的可执行文件)时,我的检测代码将转换回它的原始形式。
有人知道如何在保持位置无关的可执行文件的同时实现全局数据引用的绝对寻址吗?
所有编译器调用和步骤均为:
/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