是否可以通过查看反汇编程序的输出来检测给定的可执行文件是否为 PIC?如果没有,还有什么其他有效的方法可以解决这个问题?
位置无关的代码检测
逆向工程
小精灵
馅饼
2021-06-15 03:03:24
1个回答
通过分析装配进行检测
它将高度依赖于所使用的编译器,但这里有一些结构在位置无关代码和位置相关代码之间会有所不同:
- 如果你发现 a
jmp到一个绝对地址,那就意味着它是 PDC(RIP在 PIC 中只使用相对于的跳转) - 当某些数据被绝对地址引用时,它是PDC
- 正如@Johann Aydinbas 所注意到的,当您看到类似
cal $+, pop或call xxx, pop将一些绝对地址压入堆栈的模式时,它可能是 PIC
用调试器打开检测
您还可以利用这样一个事实,例如,当您加载位置无关程序并检查某些函数的地址时,main每次加载它都会改变(因为ASLR)。PDC 情况并非如此——所有地址都将保持不变。
通过读取 ELF 头检测
为什么要让你的工作很难分析可执行文件,同时它明确地提供了你需要的信息。正如您在评论中所指出的,ET_EXEC值e_type将出现在 PDC 中,而ET_DYN将出现在 PIC 中。并且,根据这个问题的第二个答案,这是用于确定是否ASLR可以使用的信息,在Linux.
其他方法
您当然可以为此目的使用其他工具,例如file或readelf例如。