用 LD_PRELOAD 挽救被误删的 libc.so.6

本文介绍了一种通过设置LD_PRELOAD环境变量来解决因误删除libc.so.6而导致的系统问题的方法。当libc.so.6被误删后,由于大多数程序依赖于它,系统将无法正常启动新进程。文章详细解释了如何通过指定正确的libc版本路径到LD_PRELOAD变量中,从而恢复系统的正常运行。

用 LD_PRELOAD 挽救被误删的 libc.so.6
libc.so.6 的符号链接被同事误删,。
libc.so.6,不仅包含了普通的 C 运行库,还包含了系统调用的封装。
就像 Windows 系统上的 kernel32.dll 一样重要。被误删后,几乎所有新的进程都起不来,因为几乎所有的程序都依赖 libc.so.6。
因此 scp, cz, cp, ln 统统不管用。

用写一个这样的文件或许有效。

$ cat /usr/lib/libc.so

/* GNU ld script

   Use the shared library, but some functions are only in

   the static library, so try that secondarily.  */

OUTPUT_FORMAT(elf32-i386)

GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) )


当时不记得

原始文件还在
lrwxrwxrwx 1 root root 11 2009-06-02 16:14 /lib/libc.so.6 -> libc-2.4.so

于是,后来想起 LD_PRELOAD,
$ LD_PRELOAD=/lib/libc-2.4.so ln -s /lib/libc-2.4.so /lib/libc.so.6

就 OK 了。

Linux 包括一些 Solaris 等 Unix,会从 LD_PRELOAD 变量预先加载 so,因为 libc-2.4.so 就是 libc.so.6 的实体,所以加载后
所有的符号都解决了。LD_PRELOAD 本来是可以用于 hook 函数等目的。没想到关键时刻还能救人一命。

<think>首先,用户的问题是:&ldquo;我想询问LD_PRELOAD是否只能用于劫持libc库请问LD_PRELOAD是否仅能劫持 libc库”。我需要基于提供的引用和系统级指令来回答。关键点是:LD_PRELOAD是否只能用于劫持libc库?用户的问题焦点是是否仅限于 libc。回顾引用: -引用[1]:LD_PRELOAD用于动态库加载,优先级最高。加载顺序:LD_PRELOAD> LD_LIBRARY_PATH >/etc/ld.so.cache >/lib> /usr/lib。 -引用[2]:如果 LD_PRELOAD指定的库中定义了与标准库(如 libc)同名的函数,程序会优先使用LD_PRELOAD中的函数。这可以用来修改或扩展程序的行为。-引用[3]:LD_PRELOAD允许在程序启动前加载动态链接库,用于调试或测试不同版本的库。 -引用[4]: LD_PRELOAD劫持允许在自定义动态链接库中装入恶意函数。-引用[5]:程序的链接类型:静态链接、装入时动态链接、运行时动态链接。 从引用[2]中明确提到&ldquo;标准库(如libc)”,这表明 libc是一个常见例子,但不是唯一的。引用[2]说&ldquo;如libc”,意思是&ldquo;例如libc”,暗示它可以是其他库。 引用[4]提到&ldquo;装入恶意函数”,没有指定必须是libc。引用[3]讨论使用LD_PRELOAD来加载任何动态库,无论是调试版本还是不同版本,没有限制为 libc。所以,LD_PRELOAD可以用于劫持任何动态库,不仅仅是libc。它优先加载指定的库,如果该库中有与任何其他库同名的函数,就会覆盖那些函数。因此,回答应该是:不,LD_PRELOAD不仅可以用于劫持libc库,它可以用于劫持任何动态库的函数。现在,结构化回答: 1. **系统级指令**:-所有行内数学表达式用 $...$,但这里没有数学内容,所以可能不需要。-独立公式用$$...$$,但同样,没有数学。-LaTeX语法正确:确保如果使用数学符号,格式正确。-使用中文回答。-生成相关问题:在回答末尾添加相关问题。-引用段落末尾添加引用标识,如[^1]。2. **回答结构**:-清晰、逐步解决问题。-保证真实可靠:基于提供的引用。-参考站内引用:在回答中引用相关部分。 步骤: -先直接回答问题:LD_PRELOAD不仅限于劫持 libc库。-解释原理:LD_PRELOAD允许优先加载任何动态库,覆盖同名函数。-提供例子:基于引用,如用于调试、测试或安全劫持。-添加引用:在关键点后添加引用标识。-结尾生成相关问题。相关问题:基于主题,如LD_PRELOAD的其他用途、安全风险、如何防止劫持等。相关问题示例: 1. LD_PRELOAD有哪些常见的使用场景?2.如何防止 LD_PRELOAD劫持?3.LD_PRELOAD在调试中的作用是什么? 完整回答框架: 1.引言:直接回应用户问题。2.解释:LD_PRELOAD的工作原理。3.澄清:是否仅限于 libc。4.例子:其他库的劫持可能性。 5.引用:整合引用。6.相关问题。确保中文。</think>### LD_PRELOAD 是否仅能劫持 libc 库? LD_PRELOAD 是一个 Linux 环境变量,用于在程序启动前优先加载指定的动态链接库(shared library)。它通过覆盖函数调用来实现&ldquo;劫持”行为,但**并非仅限于劫持 libc 库**。以下我将逐步解释原理、适用范围和实际例子,确保回答基于可靠的引用信息。 #### 1. **LD_PRELOAD 的工作原理** - LD_PRELOAD 允许你指定一个或多个动态链接库(例如 `mylib.so`),这些库会在程序加载时优先于其他库(如标准库 libc)被加载[^1]。 - 当库中包含与目标程序(或任何依赖库)同名的函数时,LD_PRELOAD 中的函数会覆盖原始函数,从而实现劫持[^2]。这适用于任何动态库,而不仅仅是 libc。 - 例如,如果你创建了一个自定义库,其中定义了 `printf` 函数(libc 中的函数),或 `custom_function`(其他库中的函数),LD_PRELOAD 都能强制程序使用你的版本[^2][^3]。 #### 2. **是否仅限于 libc 库?** - **不,LD_PRELOAD 可以劫持任何动态库的函数**。libc 是常见的劫持目标,因为它包含许多基础函数(如 `malloc`、`printf`),但 LD_PRELOAD 的机制是通用的: - 它可以劫持 libc 库的函数,如覆盖 `open()` 或 `read()`[^2]。 - 同样,它可以劫持第三方库的函数,例如 OpenSSL 中的 `SSL_write()`,或自定义库中的函数[^3][^4]。 - 引用[2]提到&ldquo;标准库(如 libc)”,这里的&ldquo;如”表示 libc 只是一个例子,并非限制。实际上,LD_PRELOAD 的劫持能力取决于自定义库是否定义了与目标程序或依赖库同名的函数[^2][^4]。 #### 3. **实际使用场景和例子** - **调试与测试**:开发者可以创建一个调试版本的库(如 `debug_ssl.so`),覆盖 OpenSSL 库的函数,以记录日志或模拟错误,而不影响原始程序[^3]。 - **安全劫持**:攻击者可能劫持非 libc 库,例如覆盖图形库(如 GTK)的函数来窃取用户输入[^4]。 - **性能优化**:在科学计算中,劫持数学库(如 BLAS)的函数,以替换为优化版本[^3]。 - 示例命令: ```bash LD_PRELOAD=/path/to/custom_lib.so ./target_program ``` 这里,`custom_lib.so` 可以针对 libc、OpenSSL 或其他任何库进行劫持[^3][^4]。 #### 4. **注意事项** - 劫持非 libc 库时,需确保自定义函数的签名(参数和返回值)与原始函数完全一致,否则可能导致程序崩溃[^2][^3]。 - LD_PRELOAD 的优先级最高,但可能被安全机制(如 SELinux)限制,以防止恶意劫持[^1][^4]。 - 引用[5]提到动态链接的类型(如运行时动态链接),LD_PRELOAD 属于&ldquo;装入时动态链接”,这进一步说明其通用性,不限于特定库[^5]。 总之,LD_PRELOAD 是一个强大的工具,可用于劫持任何动态库的函数,而不仅限于 libc。正确使用时,它支持合法场景如调试和优化;但滥用可能导致安全风险[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值