问题标签 [position-independent-code]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
214 浏览

binary - MachO LINKEDIT 段偏移错误 0x1000

与我之前的问题类似,在这里这里,我正在尝试从 dyld 共享缓存中提取 dylib。虽然我遇到了一个问题,在此处引用,其中 rebase 信息以及 LINKEDIT 段中的其他数据正在被读取data_offset + 0x1000

例如,当我使用“DYLD_PRINT_REBASINGS=1”打开 dylib 时,我得到以下信息,

与我在数据前面添加 0x1000 字节时相比,

并作为参考,一个普通的图书馆,


可能的解决方案

1. 将 0x1000 字节的数据添加到所有内容中

     虽然,虽然我可以对其他所有内容执行我对 rebase 信息所做的操作,但这感觉不是一个好的解决方案,因为会大大增加最终 dylib 的大小,并且不确定它是否会增加 0x1000 字节每次。

2. 移动段地址。

     在 dyld 中,每个图像的每个段都被组合和排序(更多信息在这里),因此在提取 dylib 时,这些段具有非常高的 vmaddress 并且它们之间的间隙很大。例如,

为了测试我的理论,我将 vmaddresses 设置为与文件偏移量相同,这将使它更像一个常规库,例如,

令我惊讶的是,这有效并且数据被正确读取。尽管这带来了另一个问题,但如果我这样做,__text 部分中的所有代码都会中断,因为这些段将在内存中以不同方式映射。然后我做了更多的挖掘,发现在构建 DYLD Cache 时,它​​实际上修复了这个调整(源代码)。不幸的是,要做到这一点,它依赖于 dylib 中不存在的 LC_SEGMENT_SPLIT_INFO。


结论

     我相信转移细分市场有最好的工作机会,但我坚持没有segment_split_info。如果您有任何想法,我很想听听,谢谢!

0 投票
1 回答
142 浏览

c - GCC 定位独立代码:变量未正确加载

该程序可以在 CC2650 (M3) 上独立运行。但它也应用作通过无线电信道加载的固件。为此,需要位置无关代码。问题是,如下所述定义的所有变量都没有设置。

该程序使用以下标志使用 GCC (gcc-arm-none-eabi-7-2018-q2-update) 编译:

并使用以下链接器脚本

问题是:我做错了什么???

更新 初始化和重新分配:

0 投票
2 回答
177 浏览

linux - 为什么非 pic 代码不能使用运行时修复完全成为 ASLR?

我知道 PIC 代码使 ASLR 随机化更加高效和容易,因为代码可以放置在内存中的任何位置而无需更改代码。但是,如果我根据维基百科重新定位的理解正确,动态链接器可以在运行时进行“修复”,因此可以定位符号,尽管代码不是与位置无关的。但是根据我在这里看到的许多答案,非 pic 代码不能ASLR部分除了堆栈(所以不能随机化程序入口点)。如果这是正确的,那么运行时修复的用途是什么,为什么我们不能在程序开始之前在运行时修复代码中的所有位置以使程序入口点随机化。

0 投票
1 回答
95 浏览

assembly - 炸弹实验室作业第 5 阶段 - 编写其 C 等效项

我正在尝试为我的计算机体系结构课程解决稍微修改的 Bomb Lab 问题。我应该为这些函数编写等效的 C 语言,但被困在第 5 阶段。这与这个问题非常相似,我确实已经弄清楚了该函数的大部分功能。

它是一个接受 6 个字符的字符串的函数(如果没有,炸弹就会爆炸)并执行某种形式的循环算法来产生一个数字。最后,如果循环结果不等于 52 (0x34),则炸弹再次爆炸。但是,我无法理解代码的某个部分:

显然,它通过某种未知算法屏蔽字符串中每个字符的 ASCII 等价物来抵消您获得的数字。现在,我已经为每个字符制作了一个偏移量表,并设法获得了一个可接受的字符串,aaaabb但我想知道代码的 C 等效项是什么样的。

0 投票
0 回答
1293 浏览

assembly - 将目标文件与标准库链接的问题

好吧,我用nasmtest.otest.s. 当我然后运行时gcc test.o,它给了我错误消息

/usr/bin/ld: test.o: 重定位 R_X86_64_PC32 对符号 `puts@@GLIBC_2.2.5' 在制作 PIE 对象时不能使用;使用 -fPIE /usr/bin/ld 重新编译:最终链接失败:错误值 collect2:错误:ld 返回 1 退出状态

此错误消息是什么意思以及如何解决?

此外,在这种情况下,我使用gcc将我的目标文件与标准库链接,但我如何使用它ld来完成相同的工作?

我正在运行Ubuntu 20.04 LTS

0 投票
0 回答
160 浏览

linux - 为什么动态加载 PIE 在 glibc 中不再起作用?

注意:所谓的骗子不会以任何方式回答这个问题;特别是,可以通过使用 编译轻松修复线程本地示例-fPIC,就像下面已经提到的 bugzilla 示例一样。其余的只是未经询问的意见和毫无根据的主张。


在最近的 Linux 系统(如 Debian 10、RHEL 8 等)中,您可以创建一个 ELF 文件,它既是位置无关的可执行文件 (PIE),又是动态加载的库/共享对象。

这是非常有用的,并且有很多应用程序,例如创建包装程序,这些程序预先加载然后执行另一个程序(参见下面的图表 2),或者将虚拟机/语言环境作为单个对象,可以嵌入或作为独立的解释器运行。所有这些都无需处理硬连线安装目录、符号链接漏洞、$ORIGINs 或其他此类安全和文件系统策略噩梦。

但是,在 glibc 中更改2c75b54破坏了它:

elf: 拒绝 dlopen PIE 对象 [BZ #24323]

另一个可执行文件已被映射,因此动态链接器无法为第二个可执行文件正确执行重定位

在导致它的讨论中还声称:

也无法正确执行第二个可执行文件的 ELF 构造函数

但这似乎是假的。如下图 1所示,构造函数、重定位和线程局部变量似乎工作正常。

复制重定位不起作用,但是有什么理由也破坏使用复制重定位的程序,就像那些编译的那样-fPIC?(特别是,讨论中的测试用例可以容易地通过编译它来修复)。-fPIC

这个变化也在FreeBSD 12.2 中被选中,主要原因是“glibc 也这样做了”。它在 NetBSD 9.1 和 OpenBSD 6.8 中仍然有效(尽管构造函数在 OpenBSD 中不起作用)。

那么,以这种方式使用 PIE 不起作用的技术原因是什么?明确的情况会打破这种情况(参见图表 1 和 2 中的挑战)会很棒。

图表 1

a)直接执行或b) dl 加载为共享库并通过其函数调用时,libexe程序应该工作相同。mainloader

面临的挑战是演示libexe可以使用的功能,这些功能将排除a)b)或使其以不同方式工作,以不易修复的方式。

图表 2

这个小程序会自行预加载,然后运行另一个可执行文件。与典型的. 不同LD_PRELOAD=/some/path ./cmd,这也可以通过fexecve/execveat(AT_EMPTY_PATH)在 Linux 上正常运行,就像在执行memfd_created 文件时一样。它经过测试可以在 Debian >= 9、Centos/RHEL >= 7 等上运行。

挑战在于演示一个可执行文件,该可执行文件在以这种方式执行链式执行时会失败,但在预加载的代码位于单独的库中时会正常工作,例如stdbuf/libstdbuf.so

0 投票
0 回答
160 浏览

c - 在 C 代码中使用 asm 并在没有 -no-pie 选项的情况下进行编译

我的简单程序:

当我将此程序编译为:

它工作正常,打印“hello word”并成功退出。但是当我将它编译为:

我收到此错误:

我不想用-no-pie选项编译我的程序。我应该怎么办?如何在没有-no-pie选项的情况下更改我的程序以正确编译?

0 投票
1 回答
219 浏览

cmake - 我如何告诉 Meson 一个 cmake 子项目将生成与位置无关的代码 (PIC)?

我有一个用于共享库的 Meson 项目。它使用一个 CMake 子项目,它提供一个静态库:

介子给了我以下错误:

如何告诉 CMake 模块静态库必须具有与位置无关的代码?

0 投票
1 回答
74 浏览

c - 如何在运行时读取共享库数据段开头的绝对加载地址?

让我们考虑这个例子:

glob.c 源代码链接到名为 glob.so 的共享库。从 main.c 链接到 glob.so 我想在运行时读取“global_offset”变量的值(我认为在编译时不可能这样做)。我的编译器是 gcc 4.8.5 MinGW。

glob.c:

主.c:

控制台输出:

0 投票
0 回答
129 浏览

assembly - 如何计算 x86 代码 mov 偏移量(RIP 相对机器码)?

  1. 如何计算 x86 代码 mov 偏移量(机器码)?也请举个例子!!

  2. 我想输入完整地址。无论如何让它成为可能?地址:7FFB4AB12910,我想要这样的东西:48 8B 0D 352047A4B4FF07