gpt4 book ai didi

c - 根据条件执行或跳过 ld.so.preload 共享库代码

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:25 24 4
gpt4 key购买 nike

TL;DR:在执行二进制文件和 RUID != UID 时,我是否可以跳过加载放置在 ld.so.preload 中的共享库或其中的特定代码?

你好。

我正在编写一个共享对象,一个库,我通过 ld.so.preload 加载它以 Hook 一些函数。我想知道是否可以根据某些条件跳过加载此类库或其中的某些部分。

上下文:我正在使用 TOCTTOU (检查时间到使用时间)漏洞,我正在编写 userland库,将通过 linux's loader ld.so.preload feature 加载.主要思想是 Hook 所有操作文件的函数,做一些检查然后调用原始函数,这样它对用户和其他程序是透明的。

现在,问题是:因为我不想让系统过载并且我希望我的库的影响和开销尽可能小,所以我想执行它,即 Hook 函数,仅当 RUID != EUID 时。这是基于文件的 TOCTTOU 前提之一,当攻击者的权限低于易受攻击的应用程序时,就会发生这种情况。

目前我想到的唯一方法是用以下内容包围每个函数声明:

if(RUID == EUID){
call original function;
} else {
do my checkings;
call original function;
}

编辑:上面的代码可以用它的等效代码替换,更短:

if(RUID != EUID){
do my checkings;
}
call original function;

但这实际上非常糟糕,因为我挂接了将近 50 个函数并使用 __attribute 构造函数和析构函数,这意味着在每个函数中用 if-else block 填充我的代码.

请记住,ld.so.preload 在任何其他库之前加载列出的库。

我想知道是否有任何方法可以根据 RUID != EUID 条件不加载库,或者加载库但跳过 Hook 代码。

最佳答案

Since my library is system-wide, I cannot create any wrapper for it.

您想将您的库预加载到 setuid 或 setgid 程序中。

由于任何系统上此类程序的数量都非常少并且是静态已知的(您可以每小时通过 cron 作业找到它们),最简单的解决方案是为每个此类程序创建一个包装器程序。

包装器本身可以是一个非常小的程序,它具有与“目标”程序完全相同的 setuid/setgid 权限,并执行等同于

/bin/env "LD_PRELOAD=..." target-prog args

关于c - 根据条件执行或跳过 ld.so.preload 共享库代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56910065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com