栈和寄存器
0x01 寄存器和栈
被调用者保护%rbp ,%rbx和%r12~15
被调用者保护的寄存器在进入一个函数后会先压入栈来保存原先的值
返回值%rax
寄存器rax通常存储着一个函数的返回值
调用者保护除被调用者保护外。
和被调用者保护相反,可以随意修改该寄存器里的值而不需要压入栈来保存
参数%rdi,%rsi,%rdx,%rcx,%r8,%r9
这里默认有六个参数寄存器,在传入函数时使用,超过的参数将在栈帧上保存
栈指针%rsp
指示着栈顶的位置,栈往低处生长
0x02 运行时栈
返回地址在进入一个函数前,先将该call该函数的指令的下一条指令的地址压入栈,当执行ret指令时将该返回地址从栈中弹出,作为%rip的值(下一条执行指令的地址)
被保存的寄存器对应寄存器中的被调用者保护寄存器,进入函数前先保存。
局部变量有时,局部数据必须存放在内存中,常见的情况包括:
1、寄存器不足够存放所有的本地数据。
2、对一个局部变量使用地址运算符'&',因此必须能够为它产生一个地址
3、某些局部变量是数组或结构,因此必须能够通过数组或结构引用被访问到
参数构造区当传入的函数的参数超过六个(对应六个 ...
结构体数据类型所占字节长度
记录一下结构体的数据类型大小怎么算,主要看对齐数和地址偏移量
计算原理举个例子
12345678910111213#include<iostream>typedef struct student { int num; char name[10];//8 byte int com, math, english; double average;//8 byte} stu;stu boy[1000], * p;int main() { std::cout << sizeof(stu)<<"\n"; std::cout << sizeof(int); return 0;}
对齐数的大小,在vs编译器里,是数据类型大小和默认对齐数(vs是8)的最小值。
从第二个数据开始,数据首个字节的地址的偏移量要为对齐数的整数倍
对于数据类型stu,num先填充4 bytes,之后第二个char name[10]的对齐数是10和8的较小值,为8 bytes,首地址应为8的整数倍的偏移地址量,最小为8,所 ...
联合和数据对齐
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 分母 此时分数仅有一层 ...
数据表达实验
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 ...