20145240 《信息安全系统设计基础》第五周学习总结
发布日期:2021-08-31 22:55:21 浏览次数:2 分类:技术文章

本文共 3225 字,大约阅读时间需要 10 分钟。

20145240 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

X86 寻址方式经历三代:

DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。8060的分段模式IA32的带保护模式的平坦模式

程序编程

1、代码含义

gcc -01 -o p p1.c
  • -01 表示使用第一级优化。优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择。

  • -o 表示将p1.c编译后的可执行文件命名为p

2、机器级编程的两种抽象

  • 指令集结构ISA

是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。

  • 机器级程序使用的存储器地址是虚拟地址

看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。

执行汇编命令:gcc –s xxx.c –o xxx.s反汇编命令:objdump –d xxx 64位处理器得到32代码的命令:gcc –m32 –s xxx.c

访问信息

1、三种操作数:

立即数:常数值。表示为$c标准表示的整数。寄存器:表示某个寄存器的内容。存储器:根据计算出来的地址访问某个存储器位置

2、数据传送指令

  • 栈的特点

    a、 遵循“后进先出”的原则  b、 push压栈,pop出栈  c、 栈顶:总是从这端插入和删除元素  d、 栈顶元素的地址是最低的  e、 栈指针%esp保存着栈顶元素的地址

3、数据传送示例

局部变量通常保存在寄存器中;寄存器访问比存储器访问要快的多。

算术和逻辑操作

1、四组操作

加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器。一元操作:只有一个操作数,可以是寄存器也可是存储器位置。二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 ;目的操作数是第二个,可以是寄存器、存储器;两个不能同时为存储器。

移位##:第一个是移位量,用单个字节编码(只允许0-31位的移位),可以是立即数或者放在单字节寄存器%cl中 ;算术右移SAR,填上符号位;逻辑右移SHR,填上0。目的操作数可以是一个寄存器或存储器。

2、特殊的算术操作

889914-20161016160908061-328850149.png

控制

1、条件码

CF:进位标志 ZF:零标志SF:符号标志OF:溢出标志

2、访问条件码

  • 条件码常用的使用方法

根据条件码的某个组合,将一个字节设置为0或1。

SET指令根据t=a-b的结果设置条件码; 可以条件跳转到程序的某个其他部分;可以有条件的传送数据。

3、跳转指令及其编码

  • jump指令

    直接跳转:后面跟标号作为跳转目标  间接跳转:*后面跟一个操作数指示符
  • 其他跳转指令

除了jump指令外,其他跳转指令都是有条件的。有条件跳转是指根据条件码的某个组合,或者跳转或者继续执行下一条指令。

4、翻译条件分支

将条件表达式和语句从c语言翻译成机器语言,最常用的方式就是结合有条件和无条件跳转。

5、循环

  • 循环结构的三种形式

    do-while:先执行循环体语句,再执行判断,循环体至少执行一次。  while: 把循环改成do-while的样子,然后用goto翻译   for: 把循环改成do-while的样子,然后用goto翻译

汇编中用条件测试和跳转组合实现循环的效果。大多数汇编器根据do-while形式来产生循环代码,其他的循环会首先转换成do-while形式,然后再编译成机器代码。

6、条件传送指令

  • 实现条件转移的方式

传统方式: 利用控制的条件转移。当条件满足时就,程序沿着一条执行路径进行,而当条件不满足时,就走另一路径。

数据的条件转移方式。

注意:基于条件数据传送的代码比基于条件控制转移的代码性能好。

7、switch语句

跳转表是一种非常有效的实现多重分支的方法,是一个数组,表项i是一个代码段的地址,这个代码段实现当开关索引值等于i时程序应该采取的动作。

过程

1、栈帧结构

机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。

最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。

2、转移控制

  • call指令

    call指令有一个目标,即指明被调用过程起始的指令地址。   call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。
  • ret指令

    ret指从栈中弹出地址,并跳转到这个位置。  ret指令返回到call指令后的那条指令。
  • leave指令

leave指令可以使栈做好返回的准备 等价于:

movl %ebp,%esppopl %ebp

3、寄存器使用惯例

  • 程序寄存器组是唯一能被所有过程共享的资源。

惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖

  • 使用惯例:

    %eax,%edx,%ecx 调用者保存寄存器  %ebx,%esi,%edi 被调用者保存寄存器  %ebp,%esp 保持寄存器
  • 保存某值的两种方式

由调用者保存。在调用之前就压进栈。

由被调用者保存,在刚被调用的时候就压进栈,并在返回之前恢复。

gdb调试

889914-20161016160942608-211280967.png

实验练习中的问题和解决过程

使用gcc –S –o main.s main.c -m32命令编译成汇编代码,如下代码中的数字和函数名请自行修改以防与他人雷同

889914-20161016161601030-1167703047.png

  • 通过cat命令查看汇编代码

889914-20161016161724874-2123941721.png

  • 删除gcc产生代码中以"."开头的编译器指令,针对每条指令画出相应栈帧的情况

889914-20161016162459045-1843227705.png

889914-20161016211115639-1971448640.jpg

  • 注释了栈帧情况的汇编代码

889914-20161016162626780-742346791.png

  • 详解

main函数保存%ebp,并设置新的帧指针。

pushl   %ebpmovl    %esp,%ebp

分配4字节的栈空间

subl    $4,%esp

设置 arg1=8

movl    $8,(%esp)

call调用f

f被调用,初始化帧指针,分配栈空间。
将(%esp)中的8给 %eax,即存入栈中

movl    %eax,(%esp)

call调用g

g被调用,初始化栈指针,分配栈空间
将 %eax 与立即数 20145240 相加

add     $20145240,%eax

在g结束前弹栈

popl    %ebp

ret返回f中call的调用位置

f也结束,return返回main中call调用的位置
main继续 %eax 加3的操作

addl    $3,%eax

leave为返回准备栈,相当于%ebp出栈,最后ret结束。

教材学习中的问题和解决过程

1.在命令行使用-s,就能得到c语言产生的汇编代码

889914-20161016163941514-1961736726.png

  • 将带.的部分删除,并再次查看code.s文件

889914-20161016164128327-1071676639.png

  • 为了便于记录可通过set nu命令增添行数

889914-20161016164257624-333483177.png

  • 查看代码的二进制代码,这里出现了乱码

889914-20161016164322045-547378390.png

2.在main.c文件中生成可执行文件prog

889914-20161016164433592-1226416966.png

  • 反汇编prog文件

889914-20161016164515249-2059837830.png

3.带选项-s运行GCC时

889914-20161016164626717-446190117.png

课本习题遇到的问题和解决办法

一开始在做练习题3.15的B题,思考为什么是ox8048359-25,-25是oxe7的补码表示,但25是转换成十进制的数,为什么可以直接和十六进制的数进行运算,为什么不能直接ox8048359+oxe7计算,这样的结果是ox8048440,但按照答案的解释是 ox8048340。结果发现是自己忽略了补码的问题。

心得体会

明显感觉这周比上周学习的认真多了,与多敲代码是密不可分的,增加的练习对掌握知识很有作用,希望自己能坚持下去。

本周代码托管截图

889914-20161016171634811-1924401593.png

  • 链接

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/2 20/20
第二周 300/500 1/3 18/38
第三周 200/1000 1/4 22/60
第五周 200/1300 1/5 20/80

参考资料

  • ...

转载于:https://www.cnblogs.com/20145240lsj/p/5967023.html

转载地址:https://blog.csdn.net/weixin_34092455/article/details/94215053 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:PHP WeBaCoo后门学习笔记
下一篇:html笔记(1)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月13日 17时53分00秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

MySQL如何管理客户端连接?线程池篇 2019-04-27
VScode 折叠函数快捷键 合上函数 2019-04-27
智能家居传感器:BME680--树莓派3B+ 搭配BME680的数据读取温湿度和气压。树莓派IIC BME680算法库 (未完成版本) 2019-04-27
domoticz智能家居系统 MQTT 异常以及解决方法 code=14 2019-04-27
智能家居传感器:BME680--树莓派3B+ 搭配BME680的数据读取温湿度和气压。树莓派IIC BME680算法库完整版 2019-04-27
lua语言笔记--注册dll内的函数到全局,lua 全局函数的注册 2019-04-27
工作笔记::c++ 运行命令行脚本 启动lua cmd lua 顺序执行多个文件的方法 c++ 开启一个命令行的方法 lua 启动多个文件 2019-04-27
工作笔记::lua 打印 一个table的方法 2019-04-27
工作笔记::VSCode使用笔记--VSCode 设置自定义快捷键 设置自定义运行脚本 2019-04-27
笔记--记录一次在libmodbus通讯过程socket的connect()遇到的Operation now in progress 的bug 2019-04-27
modbus调试工具开发(1)--windows下编译libmodbus库文件 2019-04-27
工作笔记-- 嵌入式linux设备的端口回收设置 2019-04-27
工作笔记--batch脚本语言的使用随笔--嵌入式linux的一种开发方法的介绍 2019-04-27
工作笔记 -- AltiumDesigner20 设置铺铜改变之后自动重新铺铜方法 2019-04-27
ethcat学习笔记:ethcat 进行FOE升级报错误代码0x8004的原因、分析以及解决方法 2019-04-27
嵌入式linux 学习笔记--如何使用udhcpc获取动态IP 2019-04-27
工作笔记--CMake使用笔记 配合libmodbus 分别编译出x86的服务器版本和arm的嵌入式linux版本 2019-04-27
嵌入式linux学习笔记--2021-01-16-- 字符设备驱动开发笔记 2019-04-27
相信自己的判断。 2019-04-27
Spring IOC容器生命周期阶段总结 2019-04-27