联合和数据对齐
0x01 联合联合允许以多种类型来引用一个对象
123456union U3{ char c; int i[2]; double v;}//三种数据结构仅能存储一种
一个联合的总的大小等于它最大字段的大小
应用场景:
一个数据结构中的个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分 ,而不是结构的一部分,会减小分配空间的总量。
union还可以用来访问不同的数据类型的位模式,用一种数据类型才存储联合中的参数,又用另一种数据类型来访问它,除了有一样的位模式外,数值一般没有任何关联。
0x02 数据对齐许多计算机系统对基本数据类型的合法地址做出了 些限制,要求某种类型对象的地址必须是某个值 K( 通常是2,4或8) 的倍数。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。
对齐原则对齐原则是任何K字节的基本对象的地址必须是K的倍数。
align 8
这段声明保证了它后面的数据的起始地址是8的倍数,常用于8字节数据类型的对齐。
结构体看下面的例子:
结构体的起始地址和其中的数据类型,一般要满足对齐(对齐大小一般最大的数据类型大小) ...
数学公式编辑
0x01 前言打算记录一些数学题目,发现不会编辑数学公式,遂记录。
编辑数学公式前,要将其囊括在首尾两个美元符号的大括号中。
0x02 常用符号整合一些常用的符号例如古希腊字母,积分符号,求和符号等等。
古希腊字母
各种运算符号
三角函数和对数只需要在反斜杠后加上对应字母表示
补充一下圆周率是pi
向量符号和根号等
调整大小主要是math mode
0x03 基本编辑方法记录一些数学公式编辑方法
如何输入上下标^ 表示上表,_ 表示下标,如果上下标的内容多于一个字符,需要用 {}将这些内容括成一个整体
1${e{^x_y}=(x+2)^5}$
${e{^x_y}=(x+2)^5}$
如何显示分数通常使用 \frac {分子} {分母} 来生成一个分数,分数可多层嵌套。如果分式较为复杂,亦可使用 分子 \over 分母 此时分数仅有一层 ...
C++11关于四个引用的学习
0x01 引用的嵌套It is permitted to form references to references through type manipulations in templates or typedefs, in which case the reference collapsing rules apply: rvalue reference to rvalue reference collapses to rvalue reference, all other combinations form lvalue reference
引用折叠规则:右值对右值的引用折叠为右值引用,所有其他组合为左值引用。
0x02 左值引用Lvalue references can be used to alias an existing object (optionally with different cv-qualification):
左值引用可以作为一个已存在对象的别名,且可以用多个别名,别名之间共享一个对象。
1234567891011int main(){ 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 ...
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 ...
安装Ubuntu虚拟机
0x01 创建虚拟机先在VMware创建一个虚拟机容器,直接点击”创建新的虚拟机“就好了。
点击稍后安装操作系统,到时候去Ubuntu官网下载一个映像文件。
选择Ubuntu 64位,操作系统当然是Linux。
之后的虚拟机名称,默认就好了,无所谓,位置放到一个容易管理的文件夹里。
选择将虚拟磁盘储存为单个文件,最大磁盘大小并不会一开始就占用你20GB内存,而是动态扩展的,有大容量需求的话可以多分配一点,对我来说20GB绰绰有余了。
之后点击完成,虚拟机就创建好了。
0x02 安装Ubuntu去Ubuntu的官网下载Linux系统映像文件(传送门)
我安装了这个23.10版本,是去年10月份的最新版本。
大概有4GB左右,安装得有点慢。
安装好后将他放在随便一个文件夹里,最好是能找得到的,我创建了一个software文件夹来存放它。
再次打开Vmware,选择我们之前创建的虚拟机,点击编辑此虚拟机,
这里可以调整内存大小,我们先不管,点击CD/DVD,选择使用ISO映像文件,预览我们之前下载好的映像文件。
选择好之后就可以启动虚拟机了。
第一次启动会配置一些东西,一直下一步就 ...