欢迎光临散文网 会员登陆 & 注册

eBPF 修改系统调用read方法的返回值(字符串)信息

2023-06-04 19:22 作者:云知道B  | 我要投稿

一,本章介绍

      - 本项目采用bpf core 特性编写,其特点是程序性能较为优异,当然也可以采用普通的编写方式一样可以实现
      - 当应用程序发生系统调用 read 方法时,方法第二个参数将保存着读取某个文件的所有数据的内存地址,本章内容将用于学习修改 buf 地址中指定字符串的数据,可用于劫持一些敏感数据被应用程序发现。

二,方法原型介绍

      - fd : 通过 open 方法成功打开一个文件后的返回值
      - buf : 程序自定义的内存空间地址,用于保存最终读取到的数据内容字符串(需要修改的数据)
      - count : 程序自定义的地址的大小,用于保存最终读取到的数据的总字节大小
      - ssize_t : read 的返回值

三,思路实现

      1. hook openat 方法拿到open方法第二个参数的地址,地址中保存着目标程序打开的本地文件路径
      2. hook openat 方法拿到被打开的文件的 fd  (open 完成之后)
      3. hook read 方法拿到参数 buf 的地址 (read 被调用时候)
      4. hook read 方法拿到 返回值信息(read 完成之后)
      5. 查找 buf 地址的数据,找出我们要修改的相同的字符串
      6. 修改字符串

下面将对整个思路进行一一介绍并实现,考虑到linux(Android) 系统内核版本差异,程序编写的时候应确认好当前应用 是使用到了 open,openat,还是openat2  这点很容易验证,无需反编译程序,可以使用 bcc 提供的相关程序,或者自行编写。

四,fd 的获取

  拿到 `openat` 第二个参数,也就是目标程序打开的文件路径所保存的内存地址。
   拿到目标进程打开的文件的 fd ,目标进程调用 read 方法时 会传递 fd 我们需要使用fd 进行比较,达到确认进程是目标进程,当然也有更多的方法实现。


代码片段:

   代码主要作用:拿到 `openat` 第二个参数,并进行过滤,得到正确的目标文件 fd 最后将正确的 fd 保存到 maps 中供后面使用

五,buf 地址获取

       拿到 `read` 方法中的参数 `buf` 的地址,地址会在 `read` 成功之后被填充数据,也就是我们要修改的目标

六,更改数据原理分析

buf 数据内存空间示例图:

接下来将对此图进行一一介绍,并分析清楚 更改 `buf` 数据的原理

      以图为例,read 方法的 `buf` 地址数据是 ` 'check_possible_addresses_frida'` 他在内存中分布如图所示,每一个字符占用一个地址格子,而 `buf ` 保存的是这一串数据的首地址。

      是否可以通过遍历 `buf` 的长度(也就是read 方法的第三个参数),去查找字符串 f 出现的位置(假设要修改`frida` 字符串) ,进行初步设置有可能是我们需要修改的 字符串的地址,并保存 f 出现的地址到 maps 中。

       确定好 f 出现的地址后,尝试读取地址长度为 5 以上的数据,进行字符串比较,确定真正的要被修改的内存 f 所出现的地址。

       声明一个字符串,将字符串写入到指定的地址中,达到修改数据(目前仅用户态)



修改思路已经确定好,后面将进行代码的实现

七,buf 地址数据的初步处理

       接下来在 `read` 方法结束后,理论上我们可以拿到 `buf` 中保存的读取到的数据,并进行处理,改写等操作,但是事实上`ebpf 虚拟机`对每个程序模块的 `ebpf字节码` 做了100万个大小的数据限制,如果将整个逻辑都写到一个程序块,那么程序将无法通过 `ebpf 虚拟机`的检测。

        所以下方代码段将对 `buf` 数据进行预处理,找出`buf`数据中以我们要指定的要修改的字符,第一个字符相同的字符串的地址,并保存到`maps`中,提供后续处理。程序的逻辑可以灵活改变,下方仅仅是案例的一个选择。

代码段 :

八,buf 数据二次筛选

       上方程序块已经筛选出相似的地址,接下来的内容将对这些相似的地址进行字符串比较,找到真正的要修改的数据


关键代码段:

九,修改buf 中的目标字符串

       核心原理是,通过上方操作,确认好被修改的字符串的地址后,使用 ebpf 程序提供的 api 进行用户态内存数据的更改,read 方法返回被更改的数据给应用之后,应用程序就无法拿到我们不想让他知道的一些数据。


示例代码块:

程序实现原理到此分析完毕,代码可以联系 up 微信  vb2345qw   获取,如果觉得有用记得分享点赞

eBPF 修改系统调用read方法的返回值(字符串)信息的评论 (共 条)

分享到微博请遵守国家法律