Linux下C程序的动态库注入方法 (linux下c 注入动态库)
动态库注入(Dynamic Linker Injection)是一种注入技术,是将动态库注入到程序中,前者成为程序的一个组成部分。通常,注入的动态库是由“黑客”编写的用于某些特殊目的的恶意代码。注入完成后,程序将会执行恶意代码,在未经授权的情况下执行窃取机密数据、篡改文件等操作。
本文将介绍,并介绍如何防范动态库注入攻击。
一、注入原理
动态链接(Dynamic Linking)是指程序在运行时动态的加载所依赖的库文件,而不是运行前完成链接,将库文件打包成可执行文件。在程序运行过程中,动态链接器会依照一定的规则查找依赖库文件的路径,找到所需库文件,然后在运行时将其链接起来。
动态库注入就是将自定义的动态链接库注入到原进程的地址空间中,利用动态链接交叉链接的特性,使得程序在执行时从自定义库中读取需要的代码,以达到控制原进程的目的。这种技术被广泛应用于恶意代码的实现中。
二、注入方法分析
(一)注入库文件
要实现动态库注入攻击,习惯上我们会抓住运行中的一个程序,并将自定义动态库注入到进程的地址空间中。这种实现方式有以下几种:
1、将动态库文件覆盖掉被注入进程的同名动态库文件。
2、修改程序进程的Linker信息,使其在运行时链接我们的恶意动态库。
(二)动态链接攻击
动态链接攻击是指利用程序的动态链接特性来攻击程序。主要方式有以下几种:
1、运行时hook。
在程序的前面照下一段代码,以实现修改函数实现变量的方法:
“`
#define _GNU_SOURCE
#include
#include
int (*old_puts)(const char *s) = NULL;
int puts(const char *s)
{
if (!old_puts)
{
old_puts = (int (*)(const char *))dlsym(RTLD_NEXT, “puts”);
}
old_puts(“sizehammer”);
return old_puts(s);
}
“`
2、注入so文件执行hook,此方式是通过与钩子机制进行对抗。
3、修改程序PIC表(Procedure Linkage Table)中的函数指针地址。
需要注意的是,上述Hook方式实现的方法是在修改原有函数的功能实现,而很多注入方法是通过检测第二个参数的函数地址,发现当前函数不是通过dlsym实现的,然后使用LD_PRELOAD指定的so库getdlsym来实现独有的hook覆盖。
三、注入攻击防范
为了避免动态库注入攻击,我们可以采取以下防范措施:
1、强制要求所有用户的账号必须至少有一个非数字字符。
2、使用ASLR技术,kernel 2.6.34以上的版本支持”personality”设置,设置为”ADDR_NO_RANDOMIZE”或使用命令行工具”execq”来实现。
3、使用SecureExec来缓解动态库注入技术。
4、应用程序过程内部结构代码(如imports和exports)强制进行静态绑定。