关于工具trinity:syscall测试

2023-11-16

git地址:
https://github.com/kernelslacker/trinity

linux下对syscall的模糊测试。

main函数位于trinity.c中。

int main(int argc, char* argv[])
{
	int ret = EXIT_SUCCESS;
	const char taskname[16]="test-main";

	outputstd("Trinity " VERSION "  Dave Jones <davej@codemonkey.org.uk>\n");

	progname = argv[0];

	mainpid = getpid();

	getrlimit(RLIMIT_NOFILE, &max_files_rlimit); //获取或设定资源使用限制
	// eg.RLIMIT_NOFILE进程能打开的最大文件数

	page_size = getpagesize();
	num_online_cpus = sysconf(_SC_NPROCESSORS_ONLN);
	max_children = num_online_cpus * 4;	/* possibly overridden in params. -C可配置*/

	select_syscall_tables(); //根据系统架构选择系统调用表eg.syscalls-x86_64.h

	create_shm();//创建共享内存

	parse_args(argc, argv);//对传入的参数解析

	init_uids();//当前进程的uid,gid以及nobody用户的信息

	change_tmp_dir();

	init_shm();//用于查看每个子进程的syscall records

	init_taint_checking();//'/proc/sys/kernel/tainted'内核是否被污染
	if (munge_tables() == FALSE) {
		ret = EXIT_FAILURE;
		goto out;
	}

	if (show_syscall_list == TRUE) {
		dump_syscall_tables();
		goto out;
	}

	if (show_ioctl_list == TRUE) {
		dump_ioctls();
		goto out;
	}

	if (show_unannotated == TRUE) {
		show_unannotated_args();
		goto out;
	}

	init_syscalls();

	do_uid0_check();

	if (do_specific_domain == TRUE)
		find_specific_domain(specific_domain_optarg);

	pids_init();

	init_logging();

	init_object_lists(OBJ_GLOBAL);

	setup_initial_mappings();

	parse_devices();

	/* FIXME: Some better object construction method needed. */
	create_futexes();
	create_sysv_shms();


	setup_main_signals();

	no_bind_to_cpu = RAND_BOOL();

	prctl(PR_SET_NAME, (unsigned long) &taskname);

	if (open_fds() == FALSE) {
		if (shm->exit_reason != STILL_RUNNING)
			panic(EXIT_FD_INIT_FAILURE);	// FIXME: Later, push this down to multiple EXIT's.

		_exit(EXIT_FAILURE);
	}

	setup_ftrace();

	main_loop();

	destroy_global_objects();

	if (is_tainted() == TRUE)
		stop_ftrace();

	output(0, "Ran %ld syscalls. Successes: %ld  Failures: %ld\n",
		shm->stats.op_count, shm->stats.successes, shm->stats.failures);
	if (show_stats == TRUE)
		dump_stats();

	shutdown_logging();

	ret = set_exit_code(shm->exit_reason);
out:

	exit(ret);
}

trinity通过spawn_child产生子进程去执行系统调用。子进程内调用child_process,其中random_syscall即随机匹配系统调用去执行。

	// spawn_child中代码段
	
	pid = fork();

	if (pid == 0) {
		child_process(child, childno);
		_exit(EXIT_SUCCESS);
	} else {
		if (pid == -1) {
			debugf("Couldn't fork a new child in pidslot %d. errno:%s\n",
					childno, strerror(errno));
			return FALSE;
		}
	}

random_syscall函数中,set_syscall_nr随机系统调用号

syscallnr = rnd() % max_nr_syscalls;
bool random_syscall(struct childdata *child)
{
	struct syscallrecord *rec;
	int ret = FALSE;

	rec = &child->syscall;

	if (set_syscall_nr(rec) == FAIL)
		return FAIL;

	memset(rec->postbuffer, 0, POSTBUFFER_LEN);

	/* Generate arguments, print them out */
	generate_syscall_args(rec);

	output_syscall_prefix(rec);

	do_syscall(rec);

	output_syscall_postfix(rec);

	handle_syscall_ret(rec);

	ret = TRUE;

	return ret;
}

系统调用的参数随机生成

syscalltrinity/include/syscalls-x86_64.h该文件中存在struct syscalltable结构体数组,每一个元素都是一个系统调用。

struct syscalltable {
	struct syscallentry *entry;
};

syscalltrinity/syscalls/文件夹下,对于每个系统调用,实现了对应的结构体。

eg. syscall_poll

struct syscallentry syscall_poll = {
	.name = "poll",
	.num_args = 3,
	.arg1name = "ufds",
	.arg2name = "nfds",
	.arg3name = "timeout_msecs",
	.arg3type = ARG_RANGE,
	.low3range = 0,
	.hi3range = 1,
	.flags = NEED_ALARM,
	.sanitise = sanitise_poll,
	.post = post_poll,
};
//函数sanitise_poll即为poll对应的参数调整函数
static void sanitise_poll(struct syscallrecord *rec)
{
	struct pollfd *pollfd;
	unsigned int i;
	unsigned int num_fds = rnd() % 10;

	pollfd = zmalloc(num_fds * sizeof(struct pollfd));

	for (i = 0; i < num_fds; i++) {
		pollfd[i].fd = get_random_fd();
		pollfd[i].events = set_rand_bitmask(ARRAY_SIZE(poll_events), poll_events);
	}

	rec->a1 = (unsigned long) pollfd;
	rec->a2 = num_fds;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于工具trinity:syscall测试 的相关文章

  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String

随机推荐

  • typeAliases设置别名会爆红?sql映射写sql语句没有提示?

    typeAliases设置别名会爆红 明明设置了别名 为什么还是爆红
  • 【MVC】快递信息管理系统

    文章目录 项目介绍 开发环境 技术栈 使用说明 技术要求 思路过程 难点及解决方法 效果展示 总结 项目介绍 该项目主要介绍基于快递信息的增删改查 什么是MVC MVC是三个单词的首字母缩写 它们是Model 模型 View 视图 和Con
  • QT信号和槽的实现原理

    信号和槽是qt用于对象之间通信的核心机制 其目的类似于当一个动作发生的时候 需要对这个动作做出相应的处理 类似的还有借助于函数指针的回调机制 通过回调函数完成对此动作的操作 但是如果对一个庞杂的系统 这种回调函数的维护是相当的麻烦和危险的
  • 聚簇索引、二级索引、非聚簇索引 ?

    聚簇索引与非聚簇索引分别是MySQL不同存储引擎组织索引和数据存储的两种不同方式 按照官方文档的说法 InnoDB里面 除了聚簇索引之外其他都是二级索引 也就是没有非聚簇索引 而MyISAM使用的索引都是非聚簇索引 聚簇索引 将记录和文件一
  • Visual Studio项目属性配置

    此处的 项目属性 指的是菜单栏中 项目 下拉列表中的最后一个选项呈现的内容 界面如下图所示 首先要说明的是 配置项目属性不仅仅只有从菜单栏中选择这一种方法 还可以在 属性管理器 中进行配置 后者的优势在于 一个常用的 完整的属性配置可以方便
  • java web tcp 长连接_netty通过websocket实现服务器与客户端的长连接

    server端代码import com chinadaas bio chinadaasbio webSocket handler ServerHandler import io netty bootstrap ServerBootstrap
  • pyspark 连接远程hive集群配置

    今天本地spark连接远程hive集群 直接把配置导入进去 本地直接应用远程环境 1 安装spark 设置spark环境变量 2 拿到远程集群配置文件 将配置文件放在spark conf 目录下 xml 一共五个文件 3 将mysql co
  • FISCO BCOS环境搭建

    FISCO BCOS FISCO BCOS 环境搭建 系统环境 Ubuntu 16 04 安装依赖openssl curl ubuntu sudo apt install y openssl curl 在fisco bcos操作目录下执行下
  • Vscode配置代码片段不生效解决方法(仅仅改一下json配置就行了呜呜呜)

    Vscode配置代码片段不生效解决方法 仅仅改一下json配置就行了呜呜呜 东非不开森的主页 也许 不负光阴就是最好的努力 而努力就是最好的自己 如有错误或不足之处 希望可以指正 非常感谢 代码生成器 地址 方法 文件 gt 首选项 gt
  • nodejs中npm 安装无法进行及切换淘宝源的方法

    初步学习nodejs过程中 npm安装的时候进度条死活不懂 查了下资料估计是墙的原因 第一步解决方法 大家都建议安装包管理工具nrm 然后切换到淘宝源 操作 npm install nrm g 结果悲剧了 进度条还是一动不动 继续查找方法
  • 练习:银行复利计算(用 for 循环解一道初中小题)

    Python 官网 https www python org 这里 才 python 前沿 可惜是英文原版 所以 我要练习英文阅读 我的CSDN主页 My Python 学习个人备忘录 我的HOT博 老齐教室 自学并不是什么神秘的东西 一个
  • Redis简述

    1 什么是redis redis是一个nosql not only sql 不仅仅只有sql 数据库 也是一个非关系型数据库 2 redis的应用领域 1 分布式缓存 2 分布式session 3 保存博客或者论坛的留言回复等 总之就是用在
  • 七天玩转Redis

    文章目录 Redis五大数据类型 1 String字符串 2 Hash哈希 3 List列表 4 Set集合 5 ZSet有序集合 sorted set Redis五大数据类型 Redis的五大数据类型分别是String List Set
  • 华为OD机试真题-最大利润【C++ Java Python】

    文章目录 目录 题目内容 解题思路 Java代码 Python代码 C 代码 题目内容 商人经营一家店铺 有number 种商品 由于仓库限制每件商品的最大持有数量是 item index 每种商品的价格是 price item index
  • 人工智能AI 全栈体系(一)

    第一章 神经网络是如何实现的 这些年人工智能蓬勃发展 在语音识别 图像识别 自然语言处理等多个领域得到了很好的应用 推动这波人工智能浪潮的无疑是深度学习 所谓的深度学习实际上就是多层神经网络 至少到目前为止 深度学习基本上是用神经网络实现的
  • mysql 字段值(字符串)累加

    mysql在更新记录时 需要在原来的值上在累加新的值 例如原来有条记录 id country a784829a c0dc 4cb6 88a9 8c376fab83a6 USA 现在更新更新country字段 在原值的基础上添加 UK 使其变
  • 申请Google Player帐号上传自己开发的App

    1 访问https play google com apps publish signup 2 输入个人信息 3 在选择国家 地区时 由于列表中没有中国 所以我们只能选择香港 注册Google Player开发帐号是需要支付25美元费用的
  • Unity中关于委托与事件的使用及区别

    一 前言 1 什么是委托 个人理解 委托是一种容器 容器里面放的是函数方法 而函数的形式各不相同 参数 返回值各不相同 所以你做委托之前 先得要定义好这个委托容器存放的函数的类型 即委托类型 定义了好了函数类型后 将函数加入到委托容器后 你
  • 【Ubuntu】右键菜单添加用vscode打开

    右键菜单添加自定义命令 本文以添加右键使用vscode打开为例 1 进入 local share nautilus scripts文件夹 cd local share nautilus scripts 2 创建文件 vim Open in
  • 关于工具trinity:syscall测试

    git地址 https github com kernelslacker trinity linux下对syscall的模糊测试 main函数位于trinity c中 int main int argc char argv int ret