汇编语言:第一讲

前言:

  这学期选修了汇编语言,通过发表学习记录,希望可以帮助加深我的理解,扎实掌握汇编语言相关知识。这门课是网络安全攻防课程的基础,学校强调逆向工程方法。除此之外,我还希望可以深入学习到汇编程序的开发,落实一些编程方法,掌握一部分单片机的开发技巧。另外,本文不仅是课上的学习记录,也包含了补充和拓展。

参考书籍:

C++反汇编与逆向分析技术揭秘(第2版)

C++反汇编与逆向分析技术揭秘(第2版)-钱林松 张延清-微信读书 (qq.com)

《汇编语言》王爽

汇编语言-王爽-微信读书 (qq.com)

《深入理解计算机系统》

深入理解计算机系统(原书第3版) -兰德尔 E.布莱恩特 等-微信读书

目录

前言:

 备注:

 正文:

随堂笔记:

冯诺依曼计算机:

课堂实验:以静态方式逆向修改输出字符串

Linux部分:

Windows部分:

巩固拓展:

 备注:

Q:为什么学汇编?

A:

学会了汇编语言,就能够在CPU的寄存器上进行控制和操作,掌握直接对计算机硬件编程的方法,从而对计算机有更深刻的认识。对网络空间安全来说,与汇编直接相关的逆向工程是一个重要方向。

Q:汇编语言和高级语言的比较

A:

汇编语言与处理器密切相关,高级语言与具体计算机无关

汇编语言功能有限,涉及硬件细节,高级语言提供强大的功能,不必关系琐碎问题

汇编语言本质上就是机器语言,高级语言不针对具体计算机系统

Q:汇编语言的应用场合

A:

 关于课程:

1. 11次*3小节,星期一 第10-12节 (1-11周)

2. 平时成绩(50%):作业1次+签到4次

3. 期末作业(50%):简单逆向题目

4. 课程内容:6次汇编基础课程+逆向实战

 正文:

随堂笔记:

  

冯诺依曼计算机:

计算机的基本工作原理是存储程序和程序控制

冯诺依曼计算机基本特点:

1>采用存储程序方式,即程序和数据放在同一个存储器中

2>存储器按地址访问

3>指令由操作码和地址码构成

4>机器以运算器为中心,输入/输出设备都要经过CPU和存储器

计算机由运算器、控制器、存储器、输入设备、输出设备五大部件构成。

机器字长:

是指该计算机能进行多少位二进制数的并行 运算,实际上是指该计算机中的运算器有多少位,通常计 算机的数据总线和寄存器的位数与机器字长一致。

运算器:

是对信息或数据进行处理和运算的部件,可以 实现各种算术运算和逻辑运算。

控制器:

主要用来实现计算机本身运行过程的自动化, 即实现程序的自动执行,是计算机的管理机构和指挥中心。

寄存器:

中央处理器内的组成部分。寄存器是有限存储 容量的高速存储部件,它们可用来暂存指令、数据等。

CPU:

每一个CPU芯片都有许多管脚,这些管脚和总线相连。

一个CPU可以引出的三种总线的宽度标志了这个CPU的不同方面的性能。

地址总线:

地址总线的宽度决定了CPU的寻址能力;

数据总线:

数据总线的宽度决定了CPU与其它器件进行数据传送 时的一次数据传送量;

控制总线:

控制总线宽度决定了CPU对系统中其它器件的控制能 力。

存储器:

课堂实验:以静态方式逆向修改输出字符串

现在假设,源代码不见了,只有这个exe文件,我想输出其他字符串怎么办? 

 现使用这个C程序进行实验:

#include<cstdio>
#include<cstdlib>
int main()
{
	printf("hello world!");
	system("pause");
	return 0;
}

实验步骤:编译,运行,查看编译后代码、修改、查看运行结果、 

Linux部分:

以RHEL8为例:

dnf -y install gcc
vim hello.c
gcc hello.c
chmod 777 hello.c
./hello.c
gcc -S hello.c
cat hello.s

可以看到汇编文件内容:

.file	"hello.c"
	.text
	.section	.rodata
.LC0:
	.string	"hello world!"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 8.2.1 20180905 (Red Hat 8.2.1-3)"
	.section	.note.GNU-stack,"",@progbits
xxd a.out

 可以看到可执行程序部分:

Windows部分:

 出现这种状况的原因是Windows的保护机制,因此下面尝试修改成与“world”等长的"SCUuu"


可以发现:

在Windows中:可执行文件PE,以MZ为标志

在Linux中,可执行文件以ELF为标志 

巩固拓展:

《汇编语言》Chapter1

1.1机器语言

机器语言是机器指令的集合,机器指令是一台机器可以正确执行的命令。

电子计算机的机器指令是一列二进制数字。计算机将之转变为高低电平,以使计算机的电子器件受到驱动,进行运算。

每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制。

所以,每一种微处理器都有自己的机器指令集,也就是机器语言

1.2汇编语言

汇编语言的主体是汇编指令。

汇编指令是机器指令便于记忆的书写格式

1.3汇编语言由三类指令组成:汇编指令、伪指令、其他符号

1.4存储器

1.5指令和数据:在内存或磁盘上,没有任何区别,都是二进制信息。

1.6存储单元:存储器被划分为若干个存储单元。

微机存储器的存储单元是以字节,其容量就是以字节最小单位来计算的。

1.7CPU 

CPU要想进行数据的读写,必须和外部器件进行3类信息交互:

                      地址信息、控制信息、数据信息

分别通过 地址总线、控制总线、数据总线进行传送

1.8地址总线:一个CPU有N根地址线,则可以说这个CPU地址总线宽度为N。

1.9数据总线:数据总线的宽度决定了CPU和外界的数据传送速度。

1.10控制总线:有多少根控制总线,意味着CPU对外部器件的多少种控制

小结:

每一种CPU都有自己的汇编指令集、存储单元从0开始编号

1.11内存地址空间

举例,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元——

——每根导线上0/1不同状态的组合指向内存不同的位置——2^10=1024个内存单元

1.12主板

每一台PC机都有一个主板,主板上核心器件通过总线相连。

1.13接口卡

计算机所有可用程序控制其工作的设备,必须受到CPU的控制。

CPU对外部设备都不能直接控制,直接控制这些设备的是插在扩展槽上的接口卡。

1.14各类存储芯片

随机存储器、ROM、接口卡上的RAM

1.15内存地址空间

对于上图的各类存储器,CPU把他们都当作内存来看待

把它们总的看作一个由若干存储单元组成的逻辑存储器,

这个逻辑存储器就是我们所说的内存地址空间

每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。

CPU在这个空间中读写数据,实际上就是在相对应的物理存储器中读写数据。

内存地址空间的大小受到CPU地址总线宽度的限制。

举例:

8086CPU:地址总线宽度20,则可以定位2^20个内存单元——内存1MB

80386CPU:地址总线宽度32,则可以定位2^32个内存单元——内存4GB

现代的64位计算机,地址总线宽度64,可定位2^64个内存单元——理论最大内存16384PB

总结:

我们在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间分配情况。因为当我们想在某类存储器中读写数据时,必须知道它的第一个单元的地址和最后一个单元的地址,才能保证读写操作是在预期的存储器中进行。

比如,我们希望显示器输出,就必须将这段信息写到显存中,显卡才能将它输出到显示器,而要向显存中写入数据,就必须知道显存在内存地址空间中的地址。

举例8086PC机内存地址空间分配情况:

 我们用汇编语言写程序时,必须要从CPU角度考虑问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值