cum15-213程序bomb破解
0x01 前言最近在学习csapp时,发现第三章作业是一个程序叫bomb,要求破解六个步骤拆除炸弹。bomb是一个elf文件,我们用ida64分析,然后打开kali虚拟机远程调试,准备工作就做好了。
0x02 前五个部分炸弹的前五个部分十分简单。第一部分就是比较一个输入的字符串,而这个字符点开加密函数phase_1就可以找到。
1Border relations with Canada have never been better.
第二部分是输入6个数字,然后数字前后直接要满足后面一个是前面一个两倍的关系
12345678910111213141516171819202122__int64 __fastcall phase_2(__int64 a1){ __int64 result; // rax char *v2; // rbx int v3; // [rsp+0h] [rbp-38h] BYREF char v4; // [rsp+4h] [rbp-34h] BYREF char v5; // [rsp+18h] [rbp-20h] BYREF read_s ...
数据表达实验
0x01 实验前的环境部署和操作安装gcc-multilib插件由于实验自带的检验和打分等程序是32位程序,而我的虚拟机是Ubuntu64位的,因此安装这个插件来兼容64位系统。
1sudo apt-get install gcc-multilib
实验步骤简述我这里用vscode远程连接本地Ubuntu虚拟机,打开datalab-handout文件夹的bits.c文件,根据里面的要求补全函数。
(参考网站:vscode远程连接本地虚拟机;出现无法连接的问题时)
实验结果检验在linux终端中输入以下命令
12make 编译./btest 测试
0x02 补全bits.c里的函数思路01 bitXor根据异或公式,(~x & y) | (x & ~y),由于这里不允许使用或|,于是使用摩根定律替换
1234567891011//1/* * bitXor - x^y using only ~ and & * Example: bitXor(4, 5) = 1 * Legal ops: ~ & * Max ops: 14 * Rating ...
安装Ubuntu虚拟机
0x01 创建虚拟机先在VMware创建一个虚拟机容器,直接点击”创建新的虚拟机“就好了。
点击稍后安装操作系统,到时候去Ubuntu官网下载一个映像文件。
选择Ubuntu 64位,操作系统当然是Linux。
之后的虚拟机名称,默认就好了,无所谓,位置放到一个容易管理的文件夹里。
选择将虚拟磁盘储存为单个文件,最大磁盘大小并不会一开始就占用你20GB内存,而是动态扩展的,有大容量需求的话可以多分配一点,对我来说20GB绰绰有余了。
之后点击完成,虚拟机就创建好了。
0x02 安装Ubuntu去Ubuntu的官网下载Linux系统映像文件(传送门)
我安装了这个23.10版本,是去年10月份的最新版本。
大概有4GB左右,安装得有点慢。
安装好后将他放在随便一个文件夹里,最好是能找得到的,我创建了一个software文件夹来存放它。
再次打开Vmware,选择我们之前创建的虚拟机,点击编辑此虚拟机,
这里可以调整内存大小,我们先不管,点击CD/DVD,选择使用ISO映像文件,预览我们之前下载好的映像文件。
选择好之后就可以启动虚拟机了。
第一次启动会配置一些东西,一直下一步就 ...
图论算法
0x01 Dijkstra算法(寻找有权图最短路径)看视频的讲解实现的,P4(视频地址)
这里默认源点是1,之后再改改自定义源点的,
这个算法的大致思路是,从一个源点开始,把他压入优先队列(小的先出),然后给存储最短路径的dis数组全部初始化无穷大,接着就可以开始循环了。只要队列不为空,我们就一直取队列里的元素,然后判断由这个节点到下个节点的路径是不是最小的,如果是就把下个节点压入队列,若不是就不压入。每个节点到源点的最短路径是递归而来的。
算法就是一直在完善这个表。由于有优先队列存在,省去了无意义的路线判断,很大程度上一次就可以寻得最短路径,因为是从小权重的边开始寻路的。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include<iostream>#include<math.h>#include<algorithm>#include< ...
STL队列和栈
0x01 栈1#include<stack>
先记录一下栈stack。
和数据结构教材讲的性质基本一致,这里记录一下STL实现栈的方法。
1stack<typename T, typename Container = deque<T>>
栈的类模板,第一个参数是存储对象的类型,第二个参数是底层容器的类型。
还有一个swap函数,swap(stack &other_stack),能将当前栈中的元素和参数中的元素交换。stack模板还有赋值运算符重载,operator=( )。
访问栈:
123456789101112deque<int> data{0,1,2,3,4}; //初始化一个栈stack<int> data(data); cout<<"data : "<<data.size()<<endl; while(!data.empty()){ //获得栈顶元素 cout<<data.top()<< ...
线段树转载记录
原文章(线段树)
0x01 种一颗线段树假如我现在有一个数组A,总共有n个元素,我既想实现区间修改,又想单个修改,这时候种一颗线段树来维护这个数组,能平衡收益。
0x02 怎么建立?线段树是一颗平衡二叉树,双亲结点是区间的和,左右子节点是双亲区间分两半的区间
每个节点 p 的左右子节点的编号分别为 2p 和 2p+1,假设 双亲结点p 的为区间 [l , r]的和。
设 mid = [(l + r)/2],那么两个子节点分别存储[l , mid] 和 [mid+1 , r]的和。可以发现,左节点对应的区间长度,与右节点相同或者比之恰好多1。
知道这些后,便可以用递归的方法来种一颗线段树了。大体的思想就是,从叶子结点开始,从下往上逐步建立。这便是递归的思想
12345678910111213141516void build(elem l = 1, elem r = n, elem p = 1){ // 到达叶子节点 if (l == r){ // 到达叶子节点 tree[p] = A[l]; // 用数组中的数据赋值 ...