一、概述
我们来看一下 CPU(Central Processing Unit) Architecture 的结构,看一下 CISC(Complex Instruction Set Computer) 和 RISC(Reduced Instruction Set Computer) 的区别,看一下 CPU Architecture Register 的概念和类型,看一下 Memory Architecture 的结构,看一下 MMU(Memory Management) 的结构。 Unit)角色 虚拟内存 (Virtual Address)了解连接结构。探索已开发程序运行的过程。 Debugger解释你所学习的实践练习的概念和部分。 汇编语言命令和 OpCode, Operand他谈到了这个问题。
Ⅱ. CPU 架构
CPU(Central Proccessing Unit)
CPU(Central Processing Unit)中央处理单元在计算机中起着重要作用,负责存储、解释、计算和控制。我们现在正在学习的内容就是 CPU重点是理解操作的结构,而不是如何创建它们,以及如何解释程序结构。因此,总结来说,首先 Stored-program concept你需要了解这一点。由于所有现代计算机都以这种方式运行,即是冯·诺伊曼提出的程序指令方法,应用程序也以我们刚才讨论的方式存储在内存中。 CPU它一次执行一行(一组数据)。它将执行结果写回内存,然后读取下一行指令并执行它们。此过程无限次重复。 Stored-program concept也就是说。
CISC(Complex Instruction Set Computer), RISC(Reduced Instruction Set Computer)

然后 CPU Stored-program concept我们如何做到这一点? CISC和 RISC 设计方法它存在。 CISC如上表所示 它支持复杂命令、可变长度命令,兼容性强,但速度较慢。 它相对昂贵,且耗电量大。 您可以在许多常规台式机上看到这一点 Intel, AMD有的。 RISC 它执行简单的命令、固定长度的指令,速度相对较快,成本低,功耗小。 因此,我们通常所说的智能手机中的主芯片 ARM, Mips, GPU有的。
了解处理器和进程之间的区别是很有必要的。处理器指的是物理设备,例如 CPU 或 GPU,而进程指的是正在执行的程序(应用程序)。
※ 要安装 Windows 等操作系统,需要基于 CISC 的 CPU,但由于 MacBook 使用基于 RISC 的 CPU,因此无法以通常的方式使用 Windows。
注册
以上 CPU Stored-program concept他说他正在这样做。所以 CISC和 RISC 根据设计方法的不同 CPU如果是这样,我们如何实际存储程序,执行指令(数据),并再次存储结果呢?
没错,就在 CPU 内部。 Register 正因为如此。 Register是一个功能强大的存储空间 General Purpose Register 32 位 8和 Segment Register 16 位 6, Program Status and Control Register 1 x 32 位, Instruction Pointer 1 个 32 位它由以下部分组成:
① 通用寄存器
作为通用寄存器,它存储各种值。
通用寄存器 | 要存储的值类型 |
EAX | 数学计算值,函数返回值 (Return) |
EBX | ESI 可以与 EDI 寄存器和存储器地址相结合 |
ECX | 在循环中存储和执行迭代计数器 |
EDX | 与 EAX 一起使用,它可用于辅助算术运算(如符号扩展、大数乘法、除法等)。 |
ESI, EDI | 在数据被操作(字符串比较)或复制时,ESI 会存储源数据地址(原始数据地址),而 EDI 会存储目标地址(数据在复制后将移动到的地址)。 |
ESP | 堆栈 (Stack)底部的最后一个地址被存储起来 |
EBP | 堆栈 (Stack)地址栏的顶部,存储着第一个地址 |
※ 我们稍后会讨论这个问题,但栈 (Stack) 是一个 LIFO 结构 (Last 在 First Out 中)。它是最后添加的元素,也是插入数据时首先删除的元素。
② 分段寄存器
表示当前正在执行的指令的位置。它表示程序数据所在的内存地址。
分段寄存器 | 要存储的值类型 |
CS | Code Segment, 代码区的起始地址 |
SS | Stack Segment, 堆栈区的起始地址 |
DS | Data Segment, 数据区的起始地址 |
ES, FS, GS | Data Segment 是数据区的起始地址,但对于 ES, 它是一个字符串,对于 FS, 它是额外的数据(特殊用途数据),而对于 GS, 它是用于各种应用程序的存储 |
③ 程序状态和控制寄存器
控制寄存器 | 要存储的值类型 |
传输标志(CF) | 当在加法和减法中发生溢出时,设置为 1(Borrow) |
奇偶校验标志(PF) | 如果操作结果为偶数,则将其设置为 1;如果为奇数,则将其设置为 0 |
辅助标志(AF) | 16(8) 在 16 位操作期间出现进位时设置为 1 |
零标志(ZF) | 如果操作结果为 0 (等于时),将其设置为 1 |
标志标志(SF) | 如果操作结果为 1 (负数, 符号位), 将其设置为 1 |
溢出标志(OF) | 如果操作的结果超出容量,则设置为 1 |
※ 对于 Zero Flag(ZF), 如果执行字符串比较操作后的结果与普通的算术比较操作后的结果相同,则将其设置为 0 和 1。如果为 0,则结果可视为不同。此寄存器可被操纵,以改变代码的条件。
④ 指令指针
IP Register 是网络的 IP 地址,用于标识服务器的位置。对于 32 位系统,该值为 EIP,对于 64 位系统,该值为 RIP。
※ 通过修改 IP Register,您可以随意控制程序的行为。RCE(Reverse Engineering): 反向工程,也称为反向工程,是指分析现有程序的代码并将其还原为原始源代码。它用于黑客(恶意软件)。
※ 漏洞评估: 攻击者可以利用代码中的问题(漏洞)导致错误出现。在 Windows 中,这可能会导致出现蓝屏,或者在普通程序(应用程序)中,会弹出错误窗口。漏洞评估是关于如何为这种情况做好准备,以及哪些部分容易受到攻击的问题。
※ CPU 在计算过程中 Big-endian和 Little-endian它存在。 Big-endian通常这是一个按降序操作数字的过程,就像我们写数字一样。 Little-endian另一方面,这是一个从低数到高数进行操作的过程。 Big-endian用人类眼睛阅读时很容易,但 CPU因为它需要经过转换过程 Little-endian比平时慢。 CPU Little-endian可以认为它已经被处理了。
Ⅲ. 内存体系结构
内存
CPU工作进行的空间通常是 RAM只需将其视为比磁盘更快的存储设备即可。 CPU它也是冯·诺依曼体系结构,但由于资源有限,它很不稳定。在过去, Single Tasking效率低下,因为另一个程序无法运行,直到第一个程序完成,从而浪费了处理器资源。但是,使用单个 CPU此外, Multi Tasking(多任务处理)允许实现现代多任务处理的调度技术使得这一点成为可能。
※ 在 Windows 上,查看正在运行的进程列表的命令为 'tasklist'。每次执行进程时,显示的 PID 都是随机的。
据说可以通过调度实现并行计算,但当 CPU 和 RAM 受限时,这是如何实现的呢?

这是因为虚拟内存。如下图所示,首先,虚拟内存被创建,而不是实际内存。虚拟内存使得图中每个程序(应用程序)A、B 和 C 看起来都占用了一块内存。那么物理内存是如何使用的呢?
这是因为存在 MMU(Memory Management Unit) (如下图所示)。MMU 将虚拟内存映射到实际物理内存。每当 CPU 访问 Access(地址) 的内存时,它将虚拟内存中的地址 (Virtual Memory Address)映射到物理内存地址 (Physical Memory Address) 。
※ 尽管看起来似乎会在以后进行,但实际上,内存不仅用于 RAM,还用于磁盘。在 Windows 中,您可以在"设置"-"系统"-"信息"(最下方)-"高级系统设置"(中间)-"高级"选项卡上的"设置"-"高级(虚拟内存)"。

那么,我们来看看它实际是如何工作的。一般来说, DRAM Stack, Heap, 代码区是数据区中用于存储多个值的存储区,不仅仅是 DRAM。 SRAM它存在。 SRAM(Static Random Access Memory)是固定内存 DRAM(Dynamic Random Access Memory)存储了多个程序(如上图所示) A, B, C) 中间 A 当程序首次运行时,它具有优先权 CPU我分配了寄存器 B 程序运行时,它会替换和分配现有的寄存器。也就是说, 切换 (Conetxt Switching)去做吧。 SRAM这是一种快速而昂贵的设备。 SRAM有那么多 CPU这表明了系统在多任务处理方面的出色表现。总之, DRAM运行在物理内存中的程序都被存储在多个虚拟内存中,每次执行时都会重新加载。 SRAM这种切换使其可用于同时进行的(多任务)操作。
此外,对于这种多任务处理,我们之前已经提到过 调度技术用于实现此功能,其中包括单处理器等相关技术CPU, GPU)依次执行每个程序(进程、应用程序) TDM(Time Division Multiplex)它存在。

TDM系统每隔几秒钟随机决定运行哪个虚拟内存。虚拟内存按照顺序切换,隐藏实际运行的程序所使用的物理内存(尽管该内存已分配给物理内存)。 页(Page)虚拟内存地址空间具有固定大小,是独立的。
如果您在 C 中开发应用程序,编译器(>链接器)将生成对象代码(obj),>文件系统(可执行文件,EXE等)将存储这些对象代码,>加载程序(将应用程序可执行文件分配给内核和内存)按照这个顺序进行操作。


如上图所示, C 是一种直接管理内存的语言,因此很容易理解内存如何分配以及地址值如何映射。许多应用程序都是用 C 语言开发的,Windows 的可执行文件也都是用 C 语言编写的。EXE)这个编译器和链接器Binary - 我们使用的各种应用程序就是这样通过一个可以由计算机用机器语言执行的过程创建的。可执行文件的头部部分如下所示。 PEview正如我之前提到的,与程序执行相关的信息(模块、 IAT, EAT, 它包含诸如内存等信息。
虽然 C 并不是唯一的语言,但在编译过程中,编译器会添加称为 Stub 的代码。编译器在控制执行流程时,例如在集成数据库、建立网络连接、进行测试或设置环境变量时,或者在尚未实现的函数或需要控制硬件时,都会自动添加此代码。
四、调试器
Debug已经很熟悉了,因为它指的是在计算机运行过程中查找和修复错误的过程。Windows中的可执行文件类型包括EXE,SCR,DLL,SYS.它们都遵循PE(Portable Executable) Format(格式)或Structure(结构).简单地说,PE结构定义了可执行文件在Windows中的结构,您通常会看到EXE.SCR是一个屏幕保护程序可执行文件,而DLL(Dynamic Link Library)通常是内核(KERNEL32.dll)。SYS是一个与驱动程序相关的可执行文件。此外,还有一些BAT和PS1用于在Windows中可执行的脚本。这些脚本文件通常通过命令自动化编程进行使用。
※ 为了检测漏洞,我们通常使用依赖操作系统的脚本。例如,假设我们在客户的服务器上安装了一个独立的程序。是否可能呢?当然,我们无法篡改客户的计算机,因此可以说这是不可能的。虽然这并不总是如此,但通常是如此。
※ KERNEL32.dll 包含 Windows 应用程序接口中所有函数的定义,许多应用程序动态引用此内核。有关详细信息,请参阅 Microsoft 网站。
Windows Kernel-Mode 内核库 - Windows drivers
※ 为什么会有与 SYS 驱动程序执行相关的文件,是因为 Windows 无法直接访问驱动程序,必须通过名为驱动程序的 API 来访问。
为了更详细解释 DLL 文件,Windows 可执行文件包含 IAT(Import Address Table)和 EAT(Export Address Table)有的。用于代码维护管理 DLL由包括函数和类的模块组成,这些模块尺寸很小。 IAT和 EAT它引用 DLL 文件并执行模块的函数。可执行文件包含 IAT首先,我整理了需要使用的 Windows DLL 文件中的哪些函数。 EAT它引用和调用位于应用程序外部的 DLL 文件中的函数,然后释放这些函数。
对于 Debugger, 存在多个 Tool 版本, 但我这次了解到的就是 Tool GHIDRA (gidra)、 Cheat Engine、 HxD、 OllyDbg、 PEview、 IDA 等。 Debugger Tool 也可以作为黑客工具使用, 在 HxD 这个例子中, 它以十六进制格式显示 PE 文件, 而 OllyDbg 可以用来分析本练习中的代码。

文本可能太小以至于无法看到。 红色部分是组件 (Assembly) 以命令形式运行的程序代码这就是你可以看到的地方。 右边的黄色部分是 Register 部分, 右下方的紫色部分是堆栈Stack) 区域, 最后 左下方的紫色区域是内存转储 这只是其中的一部分。
PEview 使用该程序 'IMAGE_OPTIONAL_HEADER', 'SECTION .rdata'通过 您可以获得有关程序执行的大量信息。总结一下我们所学到的内容,在两种情况下: PE Header文中指出, PE Header与执行相关的一般信息(驱动程序、 DLL, 其中包括内存地址信息等。IMAGE_OPTIONAL_HEADER'需要注意的部分是 'Address of Entry Point'和 'Image Base'就是这样。Address of Entry Point'可执行文件指的是文件映射到内存后代码执行开始的内存位置。'Image Base'在内存中分配时,它具有一个引用地址值。'Image Base'通常是 EXE在这种情况下,它为 0x0040000 DLL在这种情况下,它是 0x10000000。因此,两个元素的和成为程序的起始点。此外, 'Base of Code'代码段(整个代码)有一个起始点。通常,这个起始点是Address of Entry Point'和 'Base of Code'是相同的。最后, 'Number of Data Directories'指定数据目录的数量。 'SECTION .rdata'它与上文所述的情况相同 IAT 它包含内容。

此外,该方案尚未得到充分利用,需要进一步研究。
例如 Debugger Tool使用以下工具分析可执行文件: Assembly 语言首先,很高兴知道 OpCode和 Operand有的。 OpCode这些命令与实际操作有关


存在这样的指令,例如 。Operand (操作码) 指示要操作的数据是哪些,可能存在也可能不存在。换句话说,Operand (参数 - Parameter) 可以被视为要操作的寄存器、内存地址或引用值。
评论
今天开始了应用理解与利用课程的第一堂课。由于这是在线课程,主要是理论课,理论课肯定很难。此外,由于我必须将一学期的学习内容压缩到一堂课,所以我必须根据您为本博文提供的内容和关键词进行更多的学习,因此花了三个多小时… 🤣 我仍然了解不多,所以我认为我需要更加努力。
登录