20145337 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
X86 寻址方式经历三代:
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全;
2 8086的分段模式;
3 IA32的带保护模式的平坦模式;ISA
- ISA即指令集体系结构,定义处理器的软件如何构建,处理器状态、指令格式、及每条指令对状态的影响
- ISA在编译器和处理器之间提供抽象层
Intel的ISA为IA-32,ARM32位的ISA为ARMv4T、ARMv5TEJ和ARMv6体系结构中使用的基本32位ISA
- 存储器系统的实际————将多个硬件存储器和操作系统软件组合起来
- 汇编代码比之机器代码的二进制格式,具有可读性更好的文本格式表示
使用gcc -S xxx.c -o xxx.s或者objdump -d xxx获得汇编代码
二进制文件可使用od或x命令查看
Intel与ATT
- Intel代码省略指示大小的后缀
- Intel代码省略寄存器前的%号
- Intel代码用不同的方式描述存储器中的位置
- 带有多操作数的指令情况下,操作数顺序相反
- 数据传送指令:movb(传送字节)、movw(传送字)、movl(传送双字)
- esi edi可以用来操纵数组,esp ebp用来操纵栈帧。eax,ebx,ecx,edx为通用寄存器,其中ah,al高低8位相互独立
操作数指示符
- 操作数分为立即数、寄存器和存储器。有许多不同的寻址方式,其中立即数寻址,包括:立即数偏移、基址寄存器、变址寄存器和比例因子构成
有效地址=Imm+R[Eb]+R[Ei]*s
,s必须为1、2、4、8- 在大小为1、2、4个字节的数据有movb、movw、movl
- MOVS为符号扩展指令,MOVZ为零扩展指令
- MOV类指令,源操作数为立即数,存储在寄存器或者存储器中,目的操作数指定寄存器或者存储器地址
- 栈是一个数据结构,遵循“先进后出”的原则,push压栈,pop弹栈
- 栈向下增长,栈顶元素为栈中元素地址最低,压栈减小栈指针,弹栈增大栈指针
- 所谓“指针”就是地址,局部变量保存在寄存器中
- 操作有:加载有效地址、一元操作、二元操作、移位。
- 加载有效地址指令leal是movl指令的变形,目的操作数必须是一个寄存器
- 二元操作中,第一个操作是源操作数,第二个操作既是源又是目的。第一个操作数可以是立即数、寄存器或是存储器位置,第二个操作数可以是寄存器或是存储器位置
- 移位量可以是一个立即数,或者放在单字节寄存器%cl中。左移指令称SAL或SHL,右移分算术右移SAR(填符号位)与逻辑右移SHR(填0)
- 状态寄存器的条件码有 CF(进位标志)、ZF(零标志)、SF(符号标志)、OF(溢出标志)
- leal指令不改变任何条件码,因为它是用来进行地址计算的。
比较和测试指令,这些指令不修改任何寄存器的值,只设置条件码
CMP与SUB
- CMP指令后往往跟着条件转移指令,实现根据比较的结果产生不同的程序分支的功能。
- CMP虽同SUB指令一样执行减法的操作,但它并不保存运算结果,根据结果设置相关标志位
二者区别就是 如SUB AX,BX SUB指令执行后,原来BX中的值被更新,CMP则数值不变
- 执行比较命令,根据
t = a -b
设置条件码 - 一个过程调用包括将 数据 和 控制 从代码的一部分传递到另一部分
- 数据传递、局部变量的分配和释放通过操作程序栈来实现
call指令有一个目标,即指明被调用过程起始的指令地址。同跳转一样,
调用可以是直接的,也可以是间接地。直接调用的目标是一个标号,而间接调用的目标是*后面跟一个操作数指示符。
call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是在程序中紧跟在call后面的那条指令的地址。
ret指令从栈中弹出地址,并跳转到这个位置。栈指针要指向前面call指令存储返回地址的位置。
返回值存在%eax中。
代码调试中的问题和解决过程
- 无法生成密钥
- 会不会是代理有问题呢
- 看来不是。尝试安装gitosis,然后将windowsx下生成的id_rsa.pub上传到Linux服务器,但是由于对教程一知半解还是失败了
看了好几个教程,都说一路回车,只能检索不到生成密钥失败,是只有我一个人有这个问题?
课后作业中的问题和解决过程
实验
本周代码托管截图
- 按照教程建立相应目录
- 进行配置
- 简化程序
其他(感悟、思考等,可选)
这周的学习进一步了解了汇编指令,个人觉得将C语言和GCC对应起来后,理解了一部分,但是根据跳转指令写C语言还是不是完全清楚
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五周 | 20/1300 | 2/9 | 30/90 |