二进制基础

捣鼓捣鼓二进制安全的基础,争取快些入门二进制安全

了解系统

二进制安全都是围着系统进行的。

第一,我们得理解系统,要深入理解计算机系统的运行机制

第二,得去破坏系统,从中学习创造漏洞挖崛与利用技巧

第三,学会挖掘和利用后我们得去学系统的重构,设计与构建系统防护

了解二进制安全的系统体系结构

第一就是机器指令与汇编语言

机器语言

机器语言是用二进制代码表示的计算机能识别的一种机器指令的集合

机器语言也叫指令集,也可以成为机器码

机器语言的的特点就是灵活、直接执行和速度快

缺点就是麻烦,程序员自己得处理每条指令和每一条数据的储存分配和输入输出,而且,机器语言的指令代码直观性太差,很容易出错

汇编语言

汇编语言是比机器语言高级一点,直观性比机器语言好

本质是一种助记符表示的仍可以面向机器的计算机语言,汇编语言也可以叫符号语言

优点:保持了机器语言的灵活性,而且也保持了机器语言的速度快的特点,因为这是轻量级的语言,所以编制的系统软件和控制软件,占用内存空间少,运行速度快,这是高级语言不能比的

缺点:很明显,汇编语言也是使用起来很繁琐的,通用性也很差

低级语言的问题

上诉的机器语言和汇编语言都是低级语言,而这类语言对机器了解要求是很大的,低级语言是要求使用者对硬件结构及其工作原理都要十分熟悉

高级语言

计算机行业不断的发展,低级语言已经不能满足人们了,渐渐了人们寻求到了一些与人类自认语言相接近的且能被计算机接受的语言

特点:语意明确、规矩明确、自然直观、通用兼容和能面向任何的机型(通过高级编译和解译程序)

cpu的运作原理

我总结了网上学习的内容和看视频所做的笔记,做了一个思维导图

第二就是cpu的设计与实现

指令系统

属性:CUP能够处理的全部指令的集合。

指令的格式

一条指令包括两个部分:操作码和地址码

操作码其实就是指令序列号,用来告诉CPU需要执行的是那一条指令。

地址码包括源操作数地址、目的地址和下一条指令的地址

指令可以不必有地址码,比如一条空指令就只有操作码而没有地址码

指令的分类

算术逻辑运算指令:包括加减乘除算术运算指令,与非或异等逻辑指令,现在的指令系统还加入了一些十进制运算指令以及字符串运算指令等。

浮点数运算指令:用于对浮点数进行运算。浮点运算要大大复杂于整数运算,所以CPU中一般还会有专门负责浮点运算的浮点运算单元。现在的浮点指令中一般还加入了向量指令,用于直接对矩阵进行运算,对于现在的多媒体和3D处理很有用。

位操作运算指令:指令系统中有一组位操作指令,如左移一位右移一位等。对于计算机内部以二进制码表示的数据来说,这种操作是非常简单快捷的。

其他指令:上面三种都是运算型指令,除此之外还有许多非运算的其他指令。这些指令包括:数据传送指令、堆栈操作指令、转移类指令、输入输出指令和一些比较特殊的指令,如特权指令、多处理器控制指令和等待、停机、空操作等指令。

对于指令中的地址码,也会有许多不同的寻址(编址)方式,主要有直接寻址,间接寻址,寄存器寻址,基址寻址,变址寻址等,某些复杂的指令系统会有几十种甚至更多的寻址方式。

CPU内核结构

CPU内核分为运算器和控制器

①运算器

算术逻辑运算单元ALU(Arithmetic and Logic
Unit):主要用来计算二进制的加减乘除、与或非异或

浮点运算单元FPU(Floating Point Unit):FPU主要负责浮点运算和高精度整数运算。

通用寄存器组:是一组最快的存储器,用来保存参加运算的操作数和中间结果。

专用寄存器:通常是一些状态寄存器,不能通过程序改变,由CPU自己控制,表明某种状态。

②控制器

运算器只能完成运算,而控制器用于控制着整个CPU的工作。

指令控制器:它要完成取指令、分析指令等操作,然后交给执行单元(ALU或FPU)来执行,同时还要形成下一条指令的地址。

时序控制器:作用是为每条指令按时间顺序提供控制信号。

总线控制器:主要用于控制CPU的内外部总线,包括地址总线、数据总线、控制总线等等。

中断控制器用于控制各种各样的中断请求,并根据优先级的高低对中断请求进行排队,逐个交给CPU处理。

__________________________

汇编语言基本指令

机器码,又称机器码

ultraedit打开exe文件,可以看到许多的由0,1,2,3等等组成的数码,这些数码就是机械码

修改程序时必须通过修改机器码来修改exe文件

全部汇编知识

cmd a,b 比较a与b

mov a,b 把b的值送给a

ret 返回主程序

nop 无作用,是英文“no operation”的简写,意是是“do nothing”(机器码90)(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)
call 调用子程序

je 或 jz 若不相等则跳(机器码74或0F84)

jne或jnz 若不相等跳(机器码75或0F85)

jmp 无条件跳(机器码EB)

jb 若小于则跳

ja 若大于则跳

jg 若大于则跳

jge 若大于等于则跳

j1 若小于则跳

j1e 若小于则跳

pop 出栈