0 Preview

知识点开始聚合了,之前学的都会用到。
学这个是真的煎熬!
立个flag:从今天开始假期内,博客日更!

1 存储模式(字节排序)

关于存储模式,我之前跟着滴水逆向学的时候记过笔记,感觉没有csapp里面详细,就再记一遍。

img

1.1 代码验证

补充个前提知识,Union(共用体) 数据类型。

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

🍊共用体采用的是小端存储,所以我们可以提前预想一下程序的运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C
#include<stdio.h>
void main()
{
union NUM
{
int a;
char b;
}num;
num.a = 0x12345678;
if(num.b == 0x12)
printf("Big Endian\n");
else
printf("Little Endian\n");
printf("num.b = 0x%X\n",num.b);
}

img{:height=“50%” width=“50%”}

1.2 字节交换问题

存放在不同的机器间程序移植或数据通信时,会发生一些问题:

音视频和图像等文件格式或处理程序都涉及到字节顺序问题:
ex. Little endian: GIF、PC Paintbrush、Microsoft RTF、etc

Big endian: Adobe Photoshop、JPEG、MacPaint、etc

又是新东西,可以出题整活了。

2 逻辑运算和门电路

2.1 逻辑运算

这个之前写过就不记了。

🌴传送门🌴

2.2 门电路

下图都为一位的门电路,如果逻辑值位数为 “ n " 只需要在箭头上面画个斜杠写个 n 即可。

img{:height=“50%” width=“50%”}

2.2.1 加法器

本来这个东西我打算跳过的,一遍玩着手机一边听,也听了个大概。太震惊了!
WOC!人类的智慧!加法器的发明太神奇了!
于是我打算从头再学一遍这个东西,👴突然有了兴趣。

这个看一下就行了,感觉和逆向不怎么沾边,但是之前学标志寄存器时候,一直不知道那几个标志位咋来的,就顺手也学一学。

img{:height=“50%” width=“50%”}

img

img

看完上面的这些,我们再回过头看一下之前学的计算机内部部件。
是不是豁然开朗!

img

3 从 C 表达式到运算类指令

3.1 C语言中的基本数据类型、基本运算类型

—基本数据类型
​ · 无符号数(二进制位串)、带符号数(补码)
​ · 浮点数(IEEE 754标准)
​ · 位串、字符(串)(ASCII码)
​ —基本运算类型
​ · 算数( + - * / % > < >= <= == != )
​ · 按位(| & ~ ^)
​ · 逻辑(|| && !)
​ · 移位(<< >>)
​ · 扩展和截断

3.2 运算流程

img

简化过的转换流程,和各层次运算:

img

4 各类运算

4.1 移位运算

img

4.1.1 例题折磨

这东西可以出题玩玩,放逆向里面,纯恶心人,基础不牢的直接劝退。

img

4.2 逻辑运算

与按位运算的差别
· 运算过程不同:按位 ~ 整体
· 结果类型不同:位串 ~ 逻辑值(1/0)

4.3 位扩展和位截断运算

—用途
​ · 类型转换时可能需要数据拓展或截断
​ —操作
​ · 没有专门的操作运算符,根据类型转换前、后数据长短确定是扩展还是截断
​ · 扩展:短转长
​ 无符号数:0扩展(前面补0)
​ 带符号数:符号扩展(前面补符)

4.3.1 例题折磨

img

img

OVER

壁纸: