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格式的区别
- Intel代码省略了指示大小的后缀。我们看到指令mov,而不是movl。
- Intel代码省略了寄存器名字前面的‘%’符号。用的是esp,而不是%esp。
- 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中的数。
控制
条件码通常不会直接读取,常用的使用方法有三种:
- 可以根据条件码的某个组合,将一个字节设置为0或者1
- 可以条件跳转到程序的某个其他的部分
- 可以有条件地传送数据
控制中最核心的语句:有条件跳转(实现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 | 了解了程序的机器级表示 |