Preview

决定回归本质,短期内放下 CTF 认真去研究研究底层。

k4👴:等你底层学完了,CTF 不跟玩似的?

我就信了k4👴的这句话,开搞!

我的学习路线是跟着天问之路的任务来的。

第一周是 CSAPP 或者南京大学的计算机系统基础(我是链接

看完第一集,我得出了一个结论,我是土狗!!!

我 C语言 白学了!我的逆向也白学了!

img

Question

1 C 语言中一下三个表达式的 返回结果 是多少?

1.1、-2147483648 < 2147483647;

1.2、

1
2
3
C
int i = -2147483648;
i < 2147483647;

1.3、-2147483647 - 1 < 2147483647

这几个问题在之前出逆向题目的时候,就碰到过,因为一个数据溢出导致了整个逆向题垮掉。

2 我直接截图课件算了,记录博客更重要的是方便自己回忆。

img

img

冯诺依曼体系

输入设备,输出设备,存储器,控制器,运算器

img

现代计算机体系

一些名词:

CPU :central processing unit 中央处理器

MAR :Memory Address Register 地址寄存器

MDR :Memory Data Register 数据寄存器

ALU :Arithmetic Logic Unit 算术逻辑运算单元

GPRs :General Purpose Register 通用寄存器组,s表复数

PC :program counter 程序计数器

IR :Instruction Register 指令寄存器

ISA :Instruction Set Architecture 指令集体系结构

现代计算机结构基本与冯诺依曼体系相同。

img

img

计算机是如何工作的?

img

OP:操作码,表示指令的 操作类型 和操作性质。

ADDR:地址字段,指出指令存放的地址单元。

所以,结合之前我所学的汇编指令,就可以很清楚的划分出指令结构。

操作码 + 操作数(一个或两个,也可以是地址)+目标地址

MOV EAX , ECX.

程序转换过程

GCC + Linux 程序转换过程

img

程序执行的数据流

img

计算机系统层次结构

⭐️ 程序的执行结果不仅取决于 算法、程序编写。而且取决于 语言处理系统、操作系统

ISA(指令集体系结构)、微体系结构。

img

上层是下层的抽象,下层是上层的实现。底层为上层提供支撑环境!

ISA

ISA 是一种规约,他规定了如何使用硬件。

⭐️可执行的指令集合,包括指令格式,操作种类以及每种操作对应烦人操作数的相关规定;

⭐️指令可以接受的操作数类型;

⭐️操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;

⭐️操作数所能存放的存储空间的大小和编址方式;

⭐️操作数在存储空间存放时按照大端还是小端方式存放;

⭐️指令获取操作数的方式,即寻址方式;

⭐️指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等。

定点数和浮点数

计算机那个只能通过约定小数点位置来表示:

🦋小数点位置约定在固定位置的数称为 定点数;

🦋小数点位置约定为可浮动的数称为 浮点数;

🍌定点小数 用来表示浮点数的尾数部分;

🍌定点整数 用来表示整数,分为 带符号整数 和 无符号整数(unsigned)

img

要解决数值数据的表示问题,只要解决定点数的编码问题!

PS. 为了方便,整数都采用补码来表示,但 浮点数 的尾数用原码定点小数表示。

移码

img

补码中的模运算

在一个模运算系统中,一个数与他除以 “模” 后的余数等价。

🍊一个负数的补码等于模减去该负数的绝对值。

🍊对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。

意义:补码的模运算,实现了 “+” 和 “-” 的统一。

小阳子的疑问:

合着我算个减法,要先算个除法,再算个加法,不麻烦吗?数太大除起来要半天,咋算?

img

解惑:

在计算机中,使用的是二进制,只有0和1,补码实际上并不需要像十进制一样求余。取补码的操作就是:符号位不变其余取反加一。

🍏🍏🍏

例如 -10:

原码为 1,1010

反码为 1,0101

补码 = 反码 + 1 = 1,0110

🍎🍎🍎

Summary

今天就先学到这里,还有一些作业没有写完,要不然会挂科,艹了。

总的来说今天的学习效率还是差不多的,但是和预想的差不少,并不能完全静下心来。

也可能是因为这些课程是真的枯燥,或许我可以试试在临界点时候,去做一些别的事情,玩玩docker、出一出CTF题目、写一写生活类博客啥的。

这篇文章写得比较杂乱,记得都是我认为比较重要的知识,从标题都能看出来,跨度比较大,从计算机历史的冯诺依曼架构,一直到机器码。

我必须静下心来,打好基础,这样在之后的逆向学习和pwn的学习中能轻松不少。

反正最近也没事干,闲着也是闲着,学点东西不比 打游戏强?

就酱紫!

OVER!