Linux函数调用劫持的方法总结(带图)

参考文章:

https://www.cnblogs.com/LittleHann/p/3854977.html

https://lwn.net/Articles/132196/

https://blog.csdn.net/andy205214/article/details/77148573

https://www.cnblogs.com/arnoldlu/p/9752061.html

1.概览

  • Ring3中劫持

    1. 基于环境变量LD_PRELOAD的动态库劫持
  • Ring0中劫持

    1. Kernel Inline Hook

    2. syscall table修改

    3. 内核调试机制Kprobe

2. Ring3函数调用劫持

​ 在Linux中,动态库加载的时候,会按照以下顺序进行搜索:LD_PRELOAD >LD_LIBRARY_PATH >/etc/ld.so.cache>/lib>/usr/lib

​ 方法原理:通过LD_PERELOAD设置编写自己的so库函数在原正常函数前执行

例子:劫持gets()函数

1. 编写自定义的动态链接库源码hook.c
#include<stdio.h>
#include<dlfcn.h> //用于搜索原函数

/* 要求:函数的形式必须和原函数一样(返回类型,函数名,函数参数)*/
char* gets(char* str){

    /* 自定义的操作区域 */
    printf("hook gets! str: %s\n ",str);

    /* 调用原函数*/
    typeof(gets)  *func;//函数指针
    func=dlsym(RTLD_NEXT,"gets");//查找malloc函数位置  dlsym:在打开的动态库里找一个函数
    return (*func)(str); //调用原函数执行
}
2.编译成共享库
gcc hook.c -fPIC -shared -ldl -D_GNU_SOURCE -o hook.so
  • -fPIC: 编译器就输出位置无关目标码.适用于动态连接
  • -shared: 生成共享目标文件
3.设置LD_PRELOAD

通过设置环境变量的方法

  • 临时设置 export LD_PRELOAD=$PWD/hook.so
  • 永久设置
    • 修改profile文件 加入 export LD_PRELOAD=${YOUR PATH}/hook.so
    • 修改.bashrc文件 加入 export LD_PRELOAD=${YOUR PATH}/hook.so
  • 编写一个测试程序test.c

    #include <stdio.h>
    
    int main(){
        char str[20]="\0";
        printf("请输入\n");
        gets(str);
        return 0;
    }
    
  • 函数调用劫持效果

3.Ring0系统调用劫持

3.1 Kernel Inline Hook

原理:一个系统调用会调用子函数的,这是通过段内偏移的方式完成的,我们可以通过设置这个偏移指向我们Hook的原函数

例子:劫持sys_read系统调用

3.2 sys_call_table修改方法进行系统调用劫持

原理:将系统调用表中对应的服务例程修改为自己Hook函数的地址

例子:劫持fork()

查找syscall_table位置的方法
  1. 代码模拟出call *sys_call_table(,%eax,4),然后查看机器码查找
  2. 通过/boot/System.map-2.6.32-358.el6.i686文件查找
  3. 通过/proc/kallsyms进行搜索
3.3 内核调试机制kprobe进行系统调用劫持
Kprobe介绍
  • 轻量级内核调试机制
Kprobe两种使用方法
  • 模块加载
  • debugfs接口
Kprobe三种探测手段
  • kprobe 基本的探测手段 基础 可以在函数内任意位置放置探测点
  • jprobe 探测在函数的入口,可以方便的获得函数参数,但是每个函数只能有一个探针
  • Kretprobe 探测在函数的返回值

例子:劫持execve()


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>

int jsys_execve(const char __user *filename,
const char __user *const __user *__argv,
const char __user *const __user *__envp)
{
  pr_info("jprobe: execve: %s\n", filename);

/* Always end with a call to jprobe_return(). */
  jprobe_return();
  return 0;
}

static struct jprobe jprobe_execve = {
.entry= jsys_execve,
.kp = {
.symbol_name= "sys_execve",
},
};

static int __init mymodule_init(void){
    int ret;

/* 挂载 hook */
ret = register_jprobe(&jprobe_execve);
if (ret < 0) {
pr_info("register_jprobe failed, returned %d\n", ret);
return -1;
}
pr_info("Planted jprobe execve at %p, handler addr %p\n",
       jprobe_execve.kp.addr, jprobe_execve.entry);

    return 0;
}

static void __exit mymodule_exit(void)
{
unregister_jprobe(&jprobe_execve);
}

module_init(mymodule_init)
module_exit(mymodule_exit)
MODULE_LICENSE("GPL");

运行效果:

4.总结
方法 优点 缺点
LD_PRELOAD 针对函数调用,简单 1.容易发生循环调用问题 2. 部分情况不适用(文件的SUID或SGID位被置1,加载的时候会忽略LD_PRELOAD)
Kernel Inline Hook 实现比较难
sys_call_table修改 负载小 需要查找系统调用表地址
kprobe 内核支持 使用简单 安全性高 需要内核特性keprobe特性支持,一些系统需要重新编译内核
(0)

相关推荐

  • 萌新带你开车上p站(终极番外)

    0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数原型.IO重定向.文件描述符.管道.环境变量.socket编程 ...

  • 替换程序中的特定函数

    问题描述 修改或替换现有程序中的实现函数是一种非常常见的需求,尤其是,在不能得到源码的情况下应该如何解决这一问题? 这里我们将问题描述为我们有main程序代码,会调用文件A中的函数A,函数A会调用文件 ...

  • mysql提权总结

    前言 前两天参加了省赛的内网渗透,在拿到webshell后发现是一个站库分离,通过信息搜集得到了数据库的账号密码,但是是一个www-data权限,执行不了代理的命令,这时候就需要提权到root权限才能 ...

  • 完美避开php内核的各种问题

    今天你学废了吗 介绍 php中的disable_function是EG(ini_directives)来获得的,而phpinfo根据 EG(ini_directives) 中获取信息并打印. 然后通过 ...

  • 【基础课堂】仓库选址流程图 仓库选址方法(带公式)

    【基础课堂】仓库选址流程图 仓库选址方法(带公式)

  • 2个简单的好方法,分时图上T 0,高频交易很实用!

    2个简单的好方法,分时图上T 0,高频交易很实用!

  • 正常胃部的检查方法和声像图

    每天一个超声点! 今天我们继续来学习胃部的超声检查方法和声像图表现. ①检查方法: 胃检查首先空腹扫查,观察胃的位置,胃壁是否增厚,有无肿块,胃腔内有无滞留物等. 然后-次性饮入水或其它胃充盈剂,观察 ...

  • 股票交易中做好止损的三种方法——猎人带你玩股票

    股票交易中做好止损的三种方法——猎人带你玩股票

  • 香料大全带图详解(72种)

    香料是指在烹饪中所用到的香辛味调味品,它们有的含有多种芳香类的物质,有的带有典型的滋味或香气,故在烹饪中运用十分广泛. 1.八角 味道甘甜,内含有挥发油,有强烈而特殊的香气,是卤料的必需品.也常用于制 ...

  • 3个方法,带你告别拖延,迎接高效自律人生,告别“忙茫盲”

    拖延的本质,是大脑的趋利避害.人生来是懒惰的,所以我们会选择轻松快乐的事去执行.此外,害怕失败,完美主义,没有决心和毅力,都会造成拖延. 今天分享给大家3个具体对抗拖延的方法,让你的行动快如闪电: 1 ...

  • 1321字纯干货,讲透GTD时间管理方法,带你告别“忙盲茫”

    很多人的生活处在两个极端状态:忙的时候乱作一团,工作学习生活家庭,每天鸡飞狗跳:清闲的时候又无所事事,这是典型的缺乏系统性的时间管理所带来的后果. 时间管理是一个抽象的概念.时间本身是不能够被管理的, ...

  • 什么是快乐星球?这 15 种奇怪的方法可以带你研究

    神译局  · 5小时前 关注 快乐的知识又增加了. 神译局是36氪旗下编译团队,关注科技.商业.职场.生活等领域,重点介绍国外的新技术.新观点.新风向. 编者按:除了冥想,定期锻炼,睡得更好,学会感恩 ...

  • 伤感古风句子(带图)

    . " 海底月捞不起 心上人不可及 向来心是看客心 奈何人是局中人 " 点到为止的艳,不可方物的美 ​​​​​ 原谅我孤陋寡闻,不知公子心上有人. ​ 我偏要毁了你的青山,断了你这 ...