一个Python开源项目-哈勃沙箱源码剖析(下)
前言
在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程。本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volatility。volatility的介绍不会太深入,内存取证这部分的研究还需要继续。
strace机制
上一篇讲到了strace和ltrace都是基于ptrace机制,但是对ptrace机制和strace/ltrace是如何利用ptrace监控系统调用,没有进行详细的讲解。
那什么是ptrace机制呢?
ptrace机制是操作系统提供了一种标准的服务来让程序员实现对底层硬件和服务的控制。
当一个程序需要作系统调用的时候,它将相关参数放进系统调用相关的寄存器,然后调用软中断0x80,这个中断就像一个让程序得以接触到内核模式的窗口,程序将参数和系统调用号交给内核,内核来完成系统调用的执行。
ptrace会在什么时候出现呢?
在执行系统调用之前,内核会先检查当前进程是否处于被“跟踪”(traced)的状态。如果是的话,内核暂停当前进程并将控制权交给跟踪进程,使跟踪进程得以察看或者修改被跟踪进程的寄存器。
strace监控系统调用
下面就以strace为例,如下图所示,在第2步和第3步是关键。

strace使用ptrace机制来检测目标进程并“监听”该进程的系统调用,strace可以在每次调用系统调用时中断跟踪的进程,捕获调用,解码它,然后继续执行跟踪的进程。
大家可能知道,每次调用系统调用(例如,打开,读取,写入,关闭)时,都需要从用户级别到内核级别的转换 - 这称为上下文切换。这取决于CPU系列和型号,以不同的方式实现,但它往往复杂且相对较慢。
sysdig机制
sysdig是一个开源系统发掘工具,用于系统级别的勘察和排障,可以看作system(系统)+dig(挖掘)的组合。我们可以把它看作一系列传统的 unix 系统工具的组合,主要包括:
strace:追踪某个进程产生和接收的系统调用。
tcpdump:分析网络数据,监控原始网络通信。
lsof: 列出打开的文件。
top:监控系统性能工具。
htop :交互式的进程浏览器,可以用来替换 top 命令。
iftop :主要用来显示本机网络流量情况及各相互通信的流量集合。
lua:一个小巧的脚本语言。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
sysdig工作方式分成用户空间和内核空间两个部分,结构如下图所示(附件画图画的):

数据的捕获流程分为如下5部分:
在内核有一个组件叫 sysdig-probe,也可以把它称为数据探头,它通过跟踪 linux 内核来进行数据抓获。
事件缓冲器(event buffer)用来把存储器映射到用户空间。
scap 组件:用来进行捕获控制和转储文件,以及数据的状态采集。
sinsp 组件:用来进行事件分析、执行凿子(chisel),设置过滤和输出格式化。
最后 sysdig 工具在命令行解析采集的数据。
从整体架构上来看,sysdig与libpcap / tcpdump / wireshark的架构非常相似,都是先捕获大量的数据,然后使用过滤器获取自己想要的数据。
希望大家注意到一个问题, sysdig-probe从内核捕获的数据会非常大的,用户空间里的scap,sinsp,sysdig组件能处理过来吗?假如处理不过来,sysdig会采用什么机制呢?sysdig会像strace一样放慢程序速度吗?
答案是否定的。在这种情况下,事件缓冲区填满,sysdig-probe开始丢弃传入的事件。因此,将丢失一些跟踪信息,但机器上运行的其他进程不会减慢速度,这是sysdig架构的关键优势,意味着跟踪开销可预测。既然sysdig这么强大,下面讲解一下sysdig的基本用法。
sysdig 基本用法
我以ubuntu系统中的操作为例,直接在shell输入sudo sysdig 就能开始捕获系统信息,执行后你会看到终端有持续不断的输出流。
$ sudo sysdig
因为系统每时每刻都有大量的系统调用产生,这样是没办法看清更无法分析输出信息的,可以先使用 ctrl + c 来退出命令。输出如下图所示:

先来解释一下它的输出格式:

所有的输入都是按照行来分割的,每行都是一条记录,由多个列组成,默认的格式是:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
各个字段的含义如下:
evt.num: 递增的事件号
evt.time: 事件发生的时间
evt.cpu: 事件被捕获时所在的 CPU,也就是系统调用是在哪个 CPU 执行的。比较上面的例子中,值 0 代表机器的第一个 CPU
proc.name: 生成事件的进程名字,也就是哪个进程在运行
thread.tid: 线程的 id,如果是单线程的程序,这也是进程的 pid
evt.dir: 事件的方向(direction),> 代表进入事件,< 代表退出事件
evt.type: 事件的名称,比如 open、stat等,一般是系统调用
evt.args: 事件的参数。如果是系统调用,这些对应着系统调用的参数
过滤
完整的 sysdig 使用方法:
sysdig [option]... [filter]
sysdig 的过滤功能很强大,不仅支持的过滤项很多,而且还能够自由地进行逻辑组合。
过滤项
sysdig 的过滤器也是分成不同类别的,比如:
fd: 对文件描述符(file descriptor)进行过滤,比如 fd 标号(fd.num)、fd 名字(fd.name)
process: 进程信息的过滤,比如进程 id(proc.id)、进程名(proc.name)
evt: 事件信息的过滤,比如事件编号、事件名
user: 用户信息的过滤,比如用户 id、用户名、用户 home 目录、用户的登录 shell(user.shell)
syslog: 系统日志的过滤,比如日志的严重程度、日志的内容
fdlist: poll event 的文件描述符的过滤
完整的过滤器列表可以使用sysdig -l来查看,比如可以查看建立 TCP 连接的事件:
sudo sysdig evt.type=accept
过滤器组合
过滤器除了直接的相等比较之外,还有其他操作符,包括=、!=、>=、>、<、<=、contains、in 和 exists,
比如:
$ sysdig fd.name contains /etc
$ sysdig "evt.type in ( 'select', 'poll' )"
$ sysdig proc.name exists
多个过滤条件还可以通过 and、or 和 not 进行逻辑组合,比如:
$ sysdig "not (fd.name contains /proc or fd.name contains /dev)"
volatility简单描述
到这发现已经写了4千多字,volatility这里简要描述一下,详细的分析,等我之后对内存取证有了一个整体的框架再说。
Volatility是一个Python编写的跨平台,用于内存分析的法证工具,其目的是为了在数据犯罪中提取易失性数据 ,也可以用来进行Rootkit的检测和协助清除。Volatility分析主要依赖的是profile文件,profile文件是由两部分合成。以linux为例,大致如下:
Linux的System.map文件列出了详细的系统调用(syscall),而kernel-header源码通过dwarfdump生成的module.dwarf文件中会包含很多内核数据结构,将以上2个文件打包为profile文件。
再用这个profile文件解析dump下来的物理内存,就很容易找到植入Rootkit的机器活动时的进程(linux_psaux)、网络通信(linux_netstat)、活动文件(linux_lsof)、驱动模块(linux_lsmod)等等
最后
关注公众号:七夜安全博客

- 回复【1】:领取 Python数据分析 教程大礼包
- 回复【2】:领取 Python Flask 全套教程
- 回复【3】:领取 某学院 机器学习 教程
- 回复【4】:领取 爬虫 教程
- 回复【5】:领取 编译原理 教程
- 回复【6】:领取 渗透测试 教程
- 回复【7】:领取 人工智能数学基础 教程
一个Python开源项目-哈勃沙箱源码剖析(下)的更多相关文章
- 一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
前言 2019年来了,2020年还会远吗? 请把下一年的年终奖发一下,谢谢... 回顾逝去的2018年,最大的改变是从一名学生变成了一位工作者,不敢说自己多么的职业化,但是正在努力往那个方向走. 以前 ...
- 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...
- 百度开源分布式id生成器uid-generator源码剖析
百度uid-generator源码 https://github.com/baidu/uid-generator snowflake算法 uid-generator是基于Twitter开源的snowf ...
- vs2008编译QT开源项目--太阳神三国杀源码分析(三) 皮肤
太阳神三国杀的界面很绚丽,界面上按钮的图标,鼠标移入移出时图标的变化,日志和聊天Widget的边框和半透明等效果,既可以通过代码来控制,也可以使用皮肤文件qss进行控制.下面我们分析一下三国杀的qss ...
- Python开源项目Top30
原文地址:https://www.cnblogs.com/stoker/p/9101825.html No 1:Home-assistant (v0.6+) 基于Python 3的开源家庭自动化平台[ ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- Github上的python开源项目
Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...
- 教你阅读Python开源项目代码
为什么要阅读开源代码 阅读 Python 开源项目代码主要有如下三个原因: 在工作过程中遇到一些问题 Google 和 StackOverFlow 等网站找不到解决办法,只能去翻源码. 对某些项目或者 ...
- 机器学习 Top 20 Python 开源项目
转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...
随机推荐
- STL之容器(containers) 简介
什么是容器? 容器用来存储数据的,数据可以是用户自定义类型(对象),也可以是预定义类型,c++中的容器主要使用如vector,list (顺序容器) 这些都是已经封装好了. 1.结构(struct): ...
- css继承属性与非继承属性
一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...
- maven+spring+junit测试要注意的事情
使用maven方式创建webapp工程的资料网上一大堆,在这里也不详细说了.在创建完成之后,里面说到要转动态web工程时要切换为3.0版本,但是我本地切换不了,网上的方法好像也没用,暂时也没用到这块. ...
- SQLServer导数据到Oracle
从SQLServer导数据到Oracle大概有以下几种方法: 使用SSMS的导出数据向导,使用Microsoft ODBC for Oracle或Oracle Provider for OLE DB连 ...
- 误删mysql表物理文件的解决方法(不涉及恢复数据)
该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 并且是适用于平时没有全备的情况下 如果有全备 直接那全备的frm和idb文件放 ...
- MySQL查询计划 key_len计算方法
本文首先介绍了MySQL的查询计划中ken_len的含义:然后介绍了key_len的计算方法:最后通过一个伪造的例子,来说明如何通过key_len来查看联合索引有多少列被使用. key_len的含义 ...
- SDN期末作业博客
一.项目描述 A P4-based Network Load Balancing Application 基于P4的网络负载均衡项目 二.个人分工 The Controller : Acquire t ...
- Django基础与组件
第一章:Django系列之web应用与http协议 第二章:基于wsgiref模块DIY一个web框架 第三章:Django下载与简介 第四章:url控制系统 第五章:视图 第六章:Django模板语 ...
- Linux-centos安装node、nginx小记
一.安装node 1.进入/usr目录,新建toos目录 cd /usr && mkdir tools && cd tools 2.wget命令下载对应版本的node包 ...
- 2018-2019-2 20165302 《网络对抗技术》Exp4 恶意代码分析
实验要求 1.监控你自己系统的运行状态,看有没有可疑的程序在运行 2.分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systracer套 ...