如何实现文件隐藏

大耗子 2020年02月21日 356次浏览

方法:

  1. 劫持系统中用于读取文件列表的系统调用
  2. 劫持文件系统中的库函数,实现对于文件的隐藏

一、如何通过劫持库函数实现:

通过preload 预加载库机制进行

  1. 编写注入劫持函数,并编译成动态链接库

    gcc -fPIC -shared parock.c -o libmycmp.so

  2. 加载预加载库

    export LD_PRELOAD=绝对路径/libmycmp.so

  3. 卸载预加载库

    unset LD_PRELOAD

  4. 单个程序加载预加载库

    LD_PRELOAD=绝对路径/libmycmp.so ./pass args

二、通过劫持系统调用函数进行

  • 寻找内核内存中系统调用表的内存地址sys_call_table,调换该内存中某个函数地址,实现劫持函数的调用----->实现某个真正系统调用的实现。

  • 系统调用的过程: 调用int 0x80,触发SWI中断异常,从idt(系统中断异常向量表) 表中,找到 0x80中断对应的中断处理函数(syscall),然后调用对应的sys_call,也就是call sys_call_table eax(nr_syscall),定位到sys_read,然后找到文件file节点,通过节点,找到file_operations中的操作函数.read

    寻找sys_call_table地址的方法:

    • 通过搜索system.map文件中的sys_call_table对应的值 system.map----存储系统调用地址的文件 在system.map中找到sys_call_table的内存地址: uname -a cat /boot/System.map-3.19.0-25-generic | grep "sys_call_table"
    • 在内核内存中进行特征搜索,找到sys_call_table的内存地址 PAGE_OFFSET 内核内存空间的开始地址 sys_close函数是导出 (sys_open sys_read不导出),所以我们可以直接获取到该函数地址 sys_close 和sys_call_table 在同一个内存区间,就可以偏移到对应的sys_call_table中
    • IDT表