深入理解计算机系统(一)
Preview
决定回归本质,短期内放下 CTF 认真去研究研究底层。
k4👴:等你底层学完了,CTF 不跟玩似的?
我就信了k4👴的这句话,开搞!
我的学习路线是跟着天问之路的任务来的。
第一周是 CSAPP 或者南京大学的计算机系统基础(我是链接)
看完第一集,我得出了一个结论,我是土狗!!!
我 C语言 白学了!我的逆向也白学了!
Question
1 C 语言中一下三个表达式的 返回结果 是多少?
1.1、-2147483648 < 2147483647;
1.2、
1 | C |
1.3、-2147483647 - 1 < 2147483647
这几个问题在之前出逆向题目的时候,就碰到过,因为一个数据溢出导致了整个逆向题垮掉。
2 我直接截图课件算了,记录博客更重要的是方便自己回忆。
冯诺依曼体系
输入设备,输出设备,存储器,控制器,运算器
现代计算机体系
一些名词:
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 指令集体系结构
现代计算机结构基本与冯诺依曼体系相同。
计算机是如何工作的?
OP:操作码,表示指令的 操作类型 和操作性质。
ADDR:地址字段,指出指令存放的地址单元。
所以,结合之前我所学的汇编指令,就可以很清楚的划分出指令结构。
操作码 + 操作数(一个或两个,也可以是地址)+目标地址
MOV EAX , ECX.
程序转换过程
GCC + Linux 程序转换过程
程序执行的数据流
计算机系统层次结构
⭐️ 程序的执行结果不仅取决于 算法、程序编写。而且取决于 语言处理系统、操作系统
ISA(指令集体系结构)、微体系结构。
上层是下层的抽象,下层是上层的实现。底层为上层提供支撑环境!
ISA
ISA 是一种规约,他规定了如何使用硬件。
⭐️可执行的指令集合,包括指令格式,操作种类以及每种操作对应烦人操作数的相关规定;
⭐️指令可以接受的操作数类型;
⭐️操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;
⭐️操作数所能存放的存储空间的大小和编址方式;
⭐️操作数在存储空间存放时按照大端还是小端方式存放;
⭐️指令获取操作数的方式,即寻址方式;
⭐️指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等。
定点数和浮点数
计算机那个只能通过约定小数点位置来表示:
🦋小数点位置约定在固定位置的数称为 定点数;
🦋小数点位置约定为可浮动的数称为 浮点数;
🍌定点小数 用来表示浮点数的尾数部分;
🍌定点整数 用来表示整数,分为 带符号整数 和 无符号整数(unsigned)
要解决数值数据的表示问题,只要解决定点数的编码问题!
PS. 为了方便,整数都采用补码来表示,但 浮点数 的尾数用原码定点小数表示。
移码
补码中的模运算
在一个模运算系统中,一个数与他除以 “模” 后的余数等价。
🍊一个负数的补码等于模减去该负数的绝对值。
🍊对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。
意义:补码的模运算,实现了 “+” 和 “-” 的统一。
小阳子的疑问:
合着我算个减法,要先算个除法,再算个加法,不麻烦吗?数太大除起来要半天,咋算?
解惑:
在计算机中,使用的是二进制,只有0和1,补码实际上并不需要像十进制一样求余。取补码的操作就是:符号位不变其余取反加一。
🍏🍏🍏
例如 -10:
原码为 1,1010
反码为 1,0101
补码 = 反码 + 1 = 1,0110
🍎🍎🍎
Summary
今天就先学到这里,还有一些作业没有写完,要不然会挂科,艹了。
总的来说今天的学习效率还是差不多的,但是和预想的差不少,并不能完全静下心来。
也可能是因为这些课程是真的枯燥,或许我可以试试在临界点时候,去做一些别的事情,玩玩docker、出一出CTF题目、写一写生活类博客啥的。
这篇文章写得比较杂乱,记得都是我认为比较重要的知识,从标题都能看出来,跨度比较大,从计算机历史的冯诺依曼架构,一直到机器码。
我必须静下心来,打好基础,这样在之后的逆向学习和pwn的学习中能轻松不少。
反正最近也没事干,闲着也是闲着,学点东西不比 打游戏强?
就酱紫!
OVER!