前言:
这学期选修了汇编语言,通过发表学习记录,希望可以帮助加深我的理解,扎实掌握汇编语言相关知识。这门课是网络安全攻防课程的基础,学校强调逆向工程方法。除此之外,我还希望可以深入学习到汇编程序的开发,落实一些编程方法,掌握一部分单片机的开发技巧。另外,本文不仅是课上的学习记录,也包含了补充和拓展。
参考书籍:
C++反汇编与逆向分析技术揭秘(第2版)
C++反汇编与逆向分析技术揭秘(第2版)-钱林松 张延清-微信读书 (qq.com)
《汇编语言》王爽
《深入理解计算机系统》
目录
备注:
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角度考虑问题。