方法:
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 eaxnr_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表