关于工具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测试 的相关文章

随机推荐

  • 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