利用LD_PRELOAD HOOK Linux系统内置函数

  1. 实现
    1. 无脑流
    2. 对点打击流

//资料来源:

https://blog.csdn.net/chen_jianjian/article/details/80627693

https://www.freebuf.com/articles/web/192052.html

实现

无脑流

该方法的核心在于GCC的C语言拓展修饰符__attribute__((constructor)),其功能为:

让由它修饰的函数在 main() 之前执行,若它出现在共享对象中时,那么一旦共享对象被系统加载,立即将执行 __attribute__((constructor)) 修饰的函数。

官方介绍:https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/Common-Function-Attributes.html

所以Hook的方法就很简单了:

使用__attribute__((constructor))对目标函数进行修饰

//eval.c
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>

__attribute__((__constructor__)) void xxxxxxxx(void)
{
    struct passwd *userinfo;
    userinfo = getpwuid(geteuid());
    printf("I can do anything!\n");
    printf("name:%s uid:%d gid:%d\n", userinfo->pw_name, userinfo->pw_uid, userinfo->pw_gid);
}

将其编译为共享对象

gcc eval.c -fPIC -shared -o eval.so

设置LD_PRELOAD

查看效果

这种方法对新手贼友好,只需要会一点点C,就可以干一些奇奇怪怪的事情。

需要注意,使用export设置的LD_PRELOAD只对当前shell起作用(自己打自己系列)。具体怎么设置可以参考http://blog.sina.com.cn/s/blog_43a59c7a0102xocp.html

对点打击流

这部分就比无脑流稍微难一点点

比如说我们需要对whoami的某些功能进行hook

获取whoami源代码

①搜索whoami所在包

coreutils即为包名

②获取源码

dpkg -S coreutils

分析whoami源码

源码都在src目录里

注意到whoami.c里的这句:

geteuid为无参函数,是个hook的好目标

关于它的说明:

所以我们可以写一个同样的函数:

//geteuid.c
#include <unistd.h>
#include <sys/types.h>

uid_t geteuid(void)
{
    printf("I can do anything,too.\n");
    return 0;
}

之后编译为共享对象

gcc geteuid.c -fPIC -shared -o geteuid.so

然后设置一下LD_PRELOAD

export LD_PRELOAD=./geteuid.so

最后效果:

当然,这里hook了geteuid这个在其他程序中也会用到的函数,所以其他软件的功能也会受到一定的影响。


如果我的文章能帮到您的话我会很开心.如需转载记得注明出处:)
目录