LD_PRELOAD

    Linux 允许一个 动态链接库 (linux 上标准的叫法是 共享库)能被先加载到目标进程当中 提供了这个功能 就是  LD preload  通过设置 LD_PRELOAD 变量的值为一个共享库的地址  然后启动的程序就会先加载这个dll  这样就运行我们来 hack 目标进程

     先看看目标进程当中那些函数还没有定义

 [root@centos ~]# nm -u a.out
         w _Jv_RegisterClasses
         w __gmon_start__
         U __libc_start_main@@GLIBC_2.0
         U strlen@@GLIBC_2.0
         U write@@GLIBC_2.0

没有定义的函数  会在使用到的时候解析到正确的地址上  比如上面的 weite 函数 ,进程会加载 libc 这个共享库并得到正确的 write 函数的地址 但是我们使用LD_PRELOAD 指定的so 比 libc 还早加载 那么程序就会把 write 函数的地址解析到我们的 so 里面 ,如果我们的 so 也导出同样名字的函数  相当于劫持了。

    下面写个程序看看

so:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <dlfcn.h>

char *msg = "I am sincoder\n";
static ssize_t (*pf_org_write)(int , const void *, size_t ) = NULL;

static void init(void)
{
    pf_org_write = dlsym(RTLD_NEXT, "write");
    printf("get write addr : %x \n", (unsigned int)pf_org_write );
}

ssize_t write(int fd, const void *buf, size_t count)
{
    if (NULL == pf_org_write)
        init();
    if (STDOUT_FILENO == fd || STDERR_FILENO == fd)
    {
        return pf_org_write(STDOUT_FILENO, msg, strlen(msg));
    }
    return pf_org_write(fd, buf, count);
}
其中要注意的就是 得到正确的 系统调用 地址的代码 dlsym(RTLD_NEXT, "write");

指定 RTLD_NEXT 是为了 让加载器不把这个函数解析到我们自己下面定义的 write 而是 解析到下一个 so 中的函数 下一个肯定是 libc 了。。。于是就获得了正确的地址 也就是 write 实际的地址。

测试程序:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <dlfcn.h>

char *msg = "hello world";

int main()
{
	return write(STDOUT_FILENO,msg,strlen(msg));
}
编译:

gcc test.c -fpic -ldl -shared -o test.so

gcc write.c

然后  export LD_PRELOAD=/root/test.so

执行下程序看看

[root@centos ~]# ./a.out
get write addr : 477ab7f0
I am sincoder

可见顺利的替换了 write

还可以在 /etc/ld.so.preload    中写入 so 地址 这样系统启动的时候就生效 而且对所有的用户

国外有用这个方式制作的一个后门

/$$$$$                                      /$$   /$$ /$$   /$$    
   |__  $$                                     | $$  /$$/|__/  | $$    
      | $$ /$$   /$$ /$$$$$$$  /$$   /$$       | $$ /$$/  /$$ /$$$$$$  
      | $$| $$  | $$| $$__  $$|  $$ /$$//$$$$$$| $$$$$/  | $$|_  $$_/  
 /$$  | $$| $$  | $$| $$  \ $$ \  $$$$/|______/| $$  $$  | $$  | $$    
| $$  | $$| $$  | $$| $$  | $$  >$$  $$        | $$\  $$ | $$  | $$ /$$
|  $$$$$$/|  $$$$$$$| $$  | $$ /$$/\  $$       | $$ \  $$| $$  |  $$$$/
 \______/  \____  $$|__/  |__/|__/  \__/       |__/  \__/|__/   \___/  
           /$$  | $$                                                   
          |  $$$$$$/                                                   
           \______/            


	               BlackHatAcademy.org

转载于:https://my.oschina.net/sincoder/blog/131953

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值