软件逆向工程——混淆指令序列分析报告
初始状态说明分析对象为以下指令序列,涉及栈操作、寄存器操作及条件转移相关逻辑: push addr_branch_default ; 压入默认分支地址 push ebx ; 压入ebx寄存器值 push edx ; 压入edx寄存器值 mov ebx, [esp+8] ; 从栈中读取默认分支地址到ebx mov edx, addr_branch_jmp ; 将目标跳转地址存入edx cmovz ebx, edx ; 若ZF=1,ebx更新为addr_branch_jmp;否则ebx保持不变 mov [esp+8], ebx ; 将ebx的值写回栈中(覆盖原默认分支地址位置) pop edx ; 恢复edx寄存器 pop ebx ; 恢复ebx寄存器 ret ; 从栈顶弹出地址并跳转 栈偏移说明:假设初始栈顶为esp0,每条指令执行后...
信息安全基础与密码学综合实验(一)——Fermat素性检测算法
实验目的(包括实验环境、实现目标等等)实验环境: Window11 Visual Studio Code v1.105.0 python v3.12.0a7 实现目标:实现Fermat素性检测算法,并对两个大整数进行分析。 方案设计(包括背景、原理、必要的公式、图表、算法步骤等等)原理:给定素数p,a∈Z,则有; 奇整数m,若任取一整数$2≤a≤m-2,(a,m)=1$,使得,则m至少有的概率为素数。 算法步骤:给定奇整数m≥3和安全参数k: (1)随机选取整数a,$2≤a≤m-2$; (2)计算$g=(a,m)$,如果$g=1$,转(3);否则,跳出,m为合数; (3)计算$r=a^{(m-1)} (modm )$,如果r=1,m可能是素数,转(1),否则,跳出,m为合数; (4)重复上述过程k次,如果每次得到m可能为素数,则m为素数的概率为。 方案实现(包括算法流程图、主要函数的介绍、算法实现的主要代码等等) 算法流程图 主要函数介绍fermat_primality_test(n, k) 功能:实现费马素性检测算法,用于判断一个数是否为素数 参数: n:待检测...
操作系统综合实验(五)——文件系统
实验题目下面的练习检查了UNIX或Linux系统上文件和inode之间的关系。在这些系统上,文件用inode表示。也就是说,一个inode是一个文件(反之亦然)。可以在随本文提供的Linux虚拟机上完成此练习。也可以在任何Linux、UNIX或MacOSX系统上完成练习,但需要创建两个名为file1.txt和file3.txt的简单文本文件,其内容是唯一的句子。 相关原理与知识 inode(索引节点)在UNIX和Linux系统中,每个文件都由一个唯一的inode表示。inode是文件系统中用于存储文件元数据的数据结构,包括文件的大小、权限、时间戳等信息,但不包含文件名。文件名仅作为目录条目的一部分存在。 硬链接与软链接• 硬链接:多个文件名可以指向同一个inode。硬链接不会创建新的文件,而是为现有文件提供额外的入口。• 软链接(符号链接):软链接是一个特殊的文件,它指向另一个文件的路径。软链接有自己的inode。 文件与inode的关系• 每个文件都有一个唯一的inode编号。• 删除文件时,实际上是从目录中移除文件名与inode的关联。只有当inode...
操作系统综合实验(四)——多线程与信号量编程
实验题目生产者—消费者问题在第 5.7.1 节中,我们提出了一种使用有界缓冲区的信号量解决方案来解决生产者消费者问题。你将使用图 5.9 和 5.10 中所示的生产者和消费者进程来设计有界缓冲区问题的编程解决方案。5.7.1 节中介绍的解决方案使用三个信号量:empty 和 full,它们计算缓冲区中空槽和满槽的数量,以及 mutex,它是一个二进制(或互斥)信号量,用于保护实际插入或删除缓冲区中的项目。你将使用标准计数信号量表示empty和full,并使用互斥锁而不是二进制信号量来表示mutex。生产者和消费者作为单独的线程运行——将产品移入和移出与empty、full和mutex结构同步的缓冲区。可以使用 Pthreads 或 Windows API 实现。生产者线程将在随机休眠一段时间和将随机整数插入缓冲区之间交替。随机数将使用 rand() 函数产生,该函数产生介于 O 和 RAND_MAX 之间的随机整数。消费者也会随机休眠一段时间,醒来后会尝试从缓冲区中删除一个项目。生产者和消费者线程的概要如图 5.26 所示。如前所述,您可以使用 Pthreads 或 Window...
操作系统综合实验(三)——多线程编程
实验题目 Project 2——多线程排序应用编写一个多线程排序程序,其工作方式如下:一个整数列表被分成两个大小相等的较小列表。两个单独的线程(我们将其称为 sorting threads)使用您选择的排序算法对每个子列表进行排序。这两个子列表随后由第三个线程——a merging thread——它将两个子列表合并为一个排序列表。 相关原理与知识 线程的概念 ⼀个线程就是⼀个“执行流”.每个线程之间都可以按照顺序执行自己的代码多个线程之间“同时”执行着多份代码,main()⼀般被称为主线程(Main Thread)。 多线程的优点和使用场景多线程程序在提高计算机系统的并发性和响应性方面有着极其重要的作用。它可以更好地利用计算机的多核和多处理器资源,在提高系统吞吐量的同时缩短响应时间。常见的使用场景包括: 程序需要用户交互并保持响应性 后台任务需要异步完成 大量计算密集型任务需要加速 线程的生命周期 多线程程序的生命周期包括: 创建线程 运行线程 线程流程控制 等待其他线程完成 销毁线程 pthread库相关函数 pthread_create线程创建 pthread...
操作系统综合实验(二)——多进程编程
实验题目Project 1 — UNIX Shell和历史记录 该项目包括设计一个 C 程序作为一个 shell 接口,它接受用户命令,然后在单独的进程中执行每个命令。这个项目可以在任何 Linux、UNIX 或 Mac OS X 系统上完成。shell 界面给用户一个提示,然后输入下一个命令。下面的示例说明了提示符 osh> 和用户的下一个命令:cat prog.c 。 (此命令使用 UNIX cat 命令在终端上显示文件 prog.c。) `cosh> cat prog.c ` 实现 shell 接口的一种技术是让父进程首先读取用户在命令行中输入的内容(在本例中为 cat prog.c),然后创建一个单独的子进程来执行该命令。除非另有说明,否则父进程在继续之前等待子进程退出。这在功能上类似于图 3.10 中所示的新流程创建。但是,UNIX shell 通常还允许子进程在后台或同时运行。为此,我们在命令末尾添加一个与号 (&)。因此,如果我们将上面的命令重写为 `osh> cat prog.c & ` ...
基于SVD的水印嵌入与还原实验报告
实验要求每位同学任意选取彩色载体图像矩阵A(MN3),W(mn3)作为待嵌入水印的彩色图像矩阵,M>m,N>n,选择合适的水印强度参数a,通过SVD将W(mn3)嵌入到A(MN3)中,交给其他同学必须的数据进行水印的验证。 实验分析 数字水印技术数字水印技术是一种基于内容的、非密码机制的计算机信息隐藏技术。它可以将一些标识信息直接嵌入数字载体当中,且不影响原载体的使用价值,也不容易被探知和再次修改,从而实现保护版权、信息隐藏的功能。 奇异值分解(SVD)奇异值分解(Singular Value Decomposition,SVD)是线性代数中一种重要的矩阵分解方法,适用于任意形状的矩阵(包括非方阵)。其核心思想是将一个复杂的矩阵分解为三个简单矩阵的乘积形式,分别描述矩阵的旋转、缩放和旋转操作。 实验过程(1)水印嵌入12345678910111213141516171819202122232425262728293031323334353637383940414243444546%% 水印嵌入主程序 % 读取图像并调整尺寸 A = imread('航天...
操作系统综合实验(一)——系统调用基础
一、 实验题目 在 2.3 节中,我们描述了一个将一个文件的内容复制到目标文件的程序。该程序首先提示用户输入源文件和目标文件的名称。使用 Windows 或 POSIX API 编写此程序。请务必包括所有必要的错误检查,包括确保源文件是否存在。 正确设计和测试程序后,如果你使用支持它的系统,请使用跟踪系统调用的实用程序运行该程序。 Linux 系统提供 strace 实用程序,Solaris 和 Mac OS X 系统使用 dtrace 命令。由于 Windows 系统不提供此类功能,您将不得不使用调试器跟踪此程序的 Windows 版本。 二、 相关原理与知识 c语言编写与编译在Linux命令行中使用gcc对cp.c源程序进行编译。 c语言文件读取与写入操作使用fopen( )函数来创建一个新的文件或者打开一个已有的文件,使用fclose( )函数关闭已打开的文件,使用fread( )函数读取文件内容,使用fwrite( )函数写入内容到文件。 Linux系统跟踪工具stracestrace...
哈夫曼树write up
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include <iostream>#include <vector>#include <queue>using namespace std;// 定义哈夫曼树节点结构体struct HuffmanNode { int weight; HuffmanNode* left; HuffmanNode* right; HuffmanNode(int w) : weight(w), left(nullptr), right(nullptr) {}};// 比较函数,用于优先队列struct Compare { bool operator()(HuffmanNode* a, HuffmanNode* b) {...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment











