zoukankan      html  css  js  c++  java
  • 20145230 《信息安全系统设计基础》第5周学习总结

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

    教材学习内容总结

    机器级代码

    计算机系统使用了多种不同形式的抽象,对于机器级编程来说,其中两种抽象尤为重要:第一种是机器级程序的格式和行为,定义为指令集体系结构(ISA),第二种是机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。反汇编我们可以用到:gcc -s或者obj dump -d。

    在敲3.2.2代码示例时如果按照书上的敲就会提示我错误:

    我们将-01去掉后便能编译它了:

    但我们还是无法运行它,因为GCC运行编译器后,产生一个汇编文件code.s,但是不做其他进一步工作:

    然后我们进一步编译它,会产生目标代码文件code.o,因为它是二进制格式,所以无法直接查看,二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看:

    我想找到程序的字节表示,于是用到了GNU调试工具GDB,但它说没有符号表被读取:

    最后可以通过反汇编器查看目标代码文件的内容:

    所有以‘.’开头的行都是指导汇编器和链接器的命令。

    ATT格式和Intel格式的区别

    1. Intel代码省略了指示大小的后缀。我们看到指令mov,而不是movl。
    2. Intel代码省略了寄存器名字前面的‘%’符号。用的是esp,而不是%esp。
    3. Intel代码用不同的方式来描述存储器中位置。

    访问信息

    esi edi可以用来操纵数组,esp ebp用来操纵栈帧。 对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,32位的eax,16位的ax,8位的ah,al都是独立的。

    数据的传送

    • 语句int x=*xp;表示我们将读存储在xp所指位置中的值,并将它存放到名字为x的局部变量中。这个读操作称为指针的间接引用。
    • 语句*xp=y;它将参数y的值写到xp所指的位置。这也是一种指针间接引用的形式,但是它表明的是一个写操作。

    在运行117页书上示例时花了很多功夫,基本上是vim里面自己犯的一些错误,自己修改了无数次代码后总算弄出来了:

    总之,指针就是地址,局部变量保存在寄存器中。

    算术和逻辑操作

    指令leal实际上是movl指令的变形,它的指令形式是从存储器读数据到寄存器,但实际上它没有引用存储器。leal指令下,目的操作数必须是一个寄存器。特别需要我们注意的是,如果涉及到减法,是目的操作数减去源操作数。移位操作移位量可以是立即数或%cl中的数。

    控制

    条件码通常不会直接读取,常用的使用方法有三种:

    1. 可以根据条件码的某个组合,将一个字节设置为0或者1
    2. 可以条件跳转到程序的某个其他的部分
    3. 可以有条件地传送数据

    控制中最核心的语句:有条件跳转(实现if,switch,while,for),无条件跳转jmp(实现goto)。有条件跳转的条件看状态寄存器(教材上叫条件码寄存器), 注意leal不改变条件码寄存器。 SET指令根据t=a-b的结果设置条件码。

    过程

    数据传递、局部变量的分配和释放通过操纵程序栈来实现。机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复、以及本地存储。为单个过程分配的那部分栈称为栈帧。寄存器%ebp为栈指针,而寄存器%esp为栈指针。call指令有一个目标,即指明被调用过程起始的指令地址。call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。

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

    在编译教材上code代码时,尝试了gdb,但好像没有什么作用。

    还有一个问题就是自己做了实验楼的练习后尝试用gdb的一些frame等命令,但它都提醒我no stack,我不知道为什么。

    本周代码托管截图

    20145230/IS-design-20145230 - 码云 - 开源中国 http://git.oschina.net/20145230/IS-design-20145230

    其他(感悟、思考等,可选)

    通过本周的学习,我学会了认真地看书,第三章的内容很多,有一百多页书,要想马虎应付一会就能翻完,但那样你根本没有任何知识的印象,学习就要认真地学。我本周还结合了实验楼上的指导来学,感觉这样学起来要踏实一些吧,虽然很累,但自己也有所得,并不亏。然后我这周尝试用了ubuntu下安装了git,也用它上传了我的git文件,感觉很方便。总之,自己必须更加努力才能追上优秀同学的步伐!

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 2000行 20篇 400小时
    第一周 2/2 20/20 初步了解Linux的一些基本命令
    第二周 1/3 15/35 了解vim编辑器
    第三周 86/86 1/4 25/60 了解了信息的表示和处理
    第五周 79/79 1/5 30/90 了解了程序的机器级表示

    参考资料

  • 相关阅读:
    [K/3Cloud] 首页增加一个自定义页签及页面内容
    [K/3Cloud]DBServiceHelper.ExecuteDataSet(this.Context, sql)) 返回数据问题
    [K/3Cloud] 表单python脚本使用QueryService的做法
    [K/3Cloud]有关单据显示行数限制和数据导出的建议
    [K/3Cloud]实现双击列表行后显示具体的某个单据明细。
    [K/3Cloud]K3Cloud的移动审批方面
    [K/3Cloud]K3Cloud的移动审批方面
    [K/3Cloud]关于数据库sa密码更改,管理中心登录不上的问题。
    游戏编程最前沿....
    marmalade android 5.0 JNI 调用失败的解决方案
  • 原文地址:https://www.cnblogs.com/kobe20145230/p/5967616.html
Copyright © 2011-2022 走看看