ldd命令可能导致运行恶意代码

ldd命令可能导致运行恶意代码



前言

ldd这个系统命令,是linux用户常用的一个命令,它可以打印出共享库依赖情况。


一、ldd为什么可能导致运行恶意代码

从ldd(1)手册可以知道,通过设置一个特殊变量LD_TRACE_LOADED_OBJECTS,然后执行程序工作,不可信的程序可能强制执行ldd的用户运行任意代码。因此,不要使用ldd查看不可信的程序的共享库依赖情况。
在这里插入图片描述

二、简单的例子

$ ldd /bin/ls
       librt.so.1 => /lib/librt.so.1 (0x4001d000)
       libc.so.6 => /lib/libc.so.6 (0x4002e000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x40149000)
       /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

LD_TRACE_LOADED_OBJECTS变量设置为1

$ LD_TRACE_LOADED_OBJECTS=1 /bin/ls
       librt.so.1 => /lib/librt.so.1 (0x4001d000)
       libc.so.6 => /lib/libc.so.6 (0x4002e000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x40149000)
       /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

这就是glibc program interpreter如何工作的。其它呢?我们来对比一下glibc与uclibc。
先写一段小程序

$ echo 'main() { printf("hello world\n"); }' > hello.c

首先glibc

$ gcc hello.c -o gcc_hello
$ ldd ./gcc_hello
        libc.so.6 => /lib/libc.so.6 (0x4001d000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

然后uclibc

$ i386-uclibc-gcc hello.c -o uclibc_hello
$ ldd ./uclibc_hello 
hello world

这里没有打印我们想要的共享库依赖情况,而是直接执行了程序。


有了上述的基本了解,我们来看看恶意程序将如何伪装自己?
假设我们有这么一段程序

$ cat nasty.c
int main()
{
   if (getenv("LD_TRACE_LOADED_OBJECTS") != 0) {
      /* we are being executed under ldd */
      printf("doing funny stuff\n");
      printf("\tlibc.so.6 => /lib/libc.so.6 (0x4001d000)\n");
      printf("\t/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)\n");
      return 0;
   }

   printf("normally program execution\n");
   return 0;
}

使用uclibc编译

$ i386-uclibc-gcc nasty.c -o nasty
$ ldd ./nasty
doing funny stuff
        libc.so.6 => /lib/libc.so.6 (0x4001d000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

可以看到有伪装的共享依赖库信息输出。


总结

因此在做程序分析时,一定要在隔离,受保护的环境下进行。尤其是使用特权账号,更要注意。

参考资料

https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
http://reverse.lostrealm.com/protect/ldd.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王万林 Ben

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值