LD_RRELOAD预加载:对Linux下常用命令的攻击

 

  • 前言

Linux下有许多常用的命令,例如cd可以打开一个目录;ls可以查看目录或文件;rm可以删除目录或文件。每个Linux命令其实就是一个可执行的二进制文件,每个文件都有个MD5值,MD5值是用来保证文件不会篡改。比如安装了相同的系统的环境,ls命令的MD5值都是固定的,如果修改二进制本身的ELF文件,通过MD5值对比就很容易发现文件中毒了。下文通过LD_PRELOAD预加载技术,在不修改Linux命令本身的情况下,改变命令执行结果,比如实现对病毒文件的隐藏,或者通过钩子实现定时下载病毒文件。

 

  • 相关原理

通过设置LD_PRELOAD环境变量为指定库的路径,这样动态链接时会优先使用LD_PRELOAD所指库中的函数实现,其核心就是利用PLT/GOT符号重定向原理。

 

假设我们病毒程序是inject.c,编译会生成libinject.so。我们预期的场景是Linux下ls命令查看不到病毒文件的存在。

 

第一步,我们需要知道Linux下ls命令的源码,可以到GNU官网下载coreutils包,先大致分析ls命令对应ls.c文件的实现。

编译coreutils命令如下:

 ./configure CC="gcc -m64" CFLAGS="-pie -fPIE" FORCE_UNSAFE_CONFIGURE=1

make

稍微解释下,-m64表示编译出的可执行文件是64位的,CFLAGS字段表示地址随机化(以后有机会会专门介绍)。

通过代码跟踪分析,可知道ls实现分为查看文件和查看目录两种应用场景。

当ls查看文件时,先调用stat查看文件信息,如果失败再通过lstat查看文件信息,都失败才会认为查询错误。

当ls查看目录时,主要是通过readdir来读取目录。

 

第二步,获取要想截取ls命令,需要重定向的函数名称。

因为Linux下命令都经过的strip,所以nm是看不到符号表了,但是我们可以使用readelf命令可以查看到我们关系的那些符号信息。

 

第三步,实现病毒文件,主要对__lxstat函数,__xstat函数,以及readdir函数实现对病毒文件的屏蔽。

通过ldd查看ls命令可知,上面三个函数都是来自于libc.so,我们可以下载Glibc源码,便于我们知道三个函数的原型。

对于每个重定向函数的实现,其原理都是一致的。首先通过dlopen打开libc.so(如果考虑到病毒在不同的系统下运行,不同系统的libc.so可能存在不同路径,如果A路径打开失败,需要打开B路径),再通过dlsym获取待重定向函数的地址,比较某字符串变量值是否包含病毒文件关键字inject,如果是,则做屏蔽操作。

 

第四步,病毒的注入。

执行如下命令编译病毒文件:

gcc -fPIC -shared -ldl inject.c -o libinject.so

执行如下命令,注入病毒:

export LD_PRELOAD=$PWD/libinject.so

上述命令等价于如下命令:

echo "$PWD/libinject.so"  >  /etc/ld.so.preload

建议使用将病毒库写入/etc/ld.so.preload,同时对ld.so.preload做隐藏保护操作。

 

 

  • 后记

上面只是Linux下ls命令会隐藏病毒文件,实测Linux下find命令,ldd命令也找不到病毒文件,但是rm命令并没有做隐藏病毒。所以真正的病毒文件,里面会包含大量的重定向函数,如open、rmdir等众多接口。

另外前文提到可以使用这种方法,实现定时下载病毒。常常选用一个高频函数,保证生成病毒的速度要大于删除病毒的速度,例如对access函数进行重定向,在其内部实现病毒下载等其他任务。

 

获取相关源码或其他Linux逆向文章,请扫码关注微信公众号“Linux逆向”

Linux逆向

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值