20135210程涵——信息安全系统设计基础第五周学习总结
学习计时:共14小时 读书:3 代码:3 作业:2 博客:4 |
一、学习目标 |
1. 理解逆向的概念以及
2. 掌握X86汇编基础,能够阅读(反)汇编代码
3. 了解ISA(指令集体系结构)
4. 理解函数调用栈帧的概念,并能用GDB进行调试
|
二、学习资源 |
1. 教材:第三章《程序的机器级表示》,详细学习指导见这:重点是3.7,3.11 2. 课程资料:https://www.shiyanlou.com/courses/413 实验四,课程邀请码:W7FQKW4Y 3. 教材中代码运行、思考一下,读代码的学习方法见这。 |
三、学习方法 |
1. 进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。 2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“学号-信息安全系统设计基础第五周学习总结”
|
四、学习任务 |
1. 阅读教材,完成课后练习(书中有参考答案) 3.1-3.7中练习,重点:3.1,3.3,3.5,3.6,3.9,3.14,3.15,3.16,3.22,3.23,3.27,3.29,3.30,3.33,3.34 2. 考核:练习题把数据变换一下 3. 实验:需要动手的到实验楼中练习一下 4. 深化、实践题目,额外加分
|
五、后续学习预告(可选): |
第四章《处理器体系结构》 |
六、学习过程 |
(提示:此处由学生填写,学习过程,学习笔记,代码编译,运行结果,思考等)
3.2程序编码
一、机器级代码
对于机器级编程来说,两种抽象尤为重要。
二、代码示例
书第107页的代码如下: int accum = 0; int sum(int x, int y) { int t = x + y; accum += t; return t; }
反汇编器查看目标代码文件的内容。 objdump -d xxx.xx
二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。 od code.o | more
od code.o > code.txt
在读取地址时要注意是不是小端法,小端法的正确读法是与自然方向相反,比如109页第六行中后四个字节18 a0 04 08的正确顺序其实是08 04 a0 18,去掉最高位的0后即为0x804a018
三、关于格式的注解
所有以“.”开头的行都是指导汇编器和链接器的命令。我们通常可以忽略这行。 为了更清楚地说明汇编代码,有一种格式来表示汇编代码。 忽略了大部分指令,但包括行号和解释性说明。 以下是带解释的汇编代码:
Linux和windows的汇编格式的区别:
在带有多个操作数的指令情况下,列出操作数的顺序相反 (当带选项-S和-O1运行gcc时,会产生xxx.s文件,其中带有'.'开头的行是指导汇编器和链接器的命令)
3.3 数据格式 C语言数据类型在IA32中的大小:
大多数常用数据类型都是以双字形式存储的。
如图,大多数GCC生成的汇编代码指令都有一个字符后缀,表明操作数的大小。 浮点数使用的是一组完全不同的指令和寄存器。
3.4 访问信息
一、操作数指示符
操作数的三种类型:
有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
寻址方式和操作数格式:
二、数据传送指令 将数据从一个位置复制到另一个位置的指令。
不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下,因此需要两个指令。
3.5 算术和逻辑操作
按目的操作数分类:
1.加载有效地址 实际是将有效地址写入目的操作数,目的操作数必须是寄存器。
2.一元操作 操作数既是源又是目的。可以是寄存器也可以是存储器。
3.二元操作 第二个操作数既是源又是目的。但两个操作数不能同时是存储器。
4.移位操作 位移量是一个立即数或放在单字节寄存器%cl中。移位操作的目的操作数可以是一个寄存器或是一个存储器位置。
SAL 算术左移 SHL 逻辑左移 SAR 算术右移(补符号位) SHR 逻辑右移(补0
控制中最核心的是跳转语句: 有条件跳转(实现if,switch,while,for) 无条件跳转jmp(实现goto)
特殊的算术操作
3.6 控制
一、条件码寄存器
leal不改变任何条件码(CMP指令根据他们的两个操作数之差来设置条件码。除了至设置条件码而不更新目标寄存器之外。CMP与SUB相同)
二、访问条件码 1.根据条件码的某个组合,将一个字节设置为0或1。SET指令根据t=a-b的结果设置条件码 2.可以条件跳转到程序的某个其他部分 3.可以有条件的传送数据
三、跳转指令(导致执行切换到程序中一个全新的位置,跳转的目的地通常用一个标号指明) 无条件跳转:JMP 可以是直接跳转也可以是间接跳转(写法是*后面加操作数指示符) 有条件跳转:根据条件码的某个组合,或者跳转或者继续执行下一条指令
3.7 过程 包括将数据和控制从代码的一部分传递到另一部分,需要在进入时为过程的局部变量分配空间并在退出时释放空间,这通过程序栈实现。 IA32通过程序栈来实现过程调用。
栈的作用:传递过程参数、存储返回信息、保存寄存器、本地存储 栈帧:为单个过程分配的那部分栈 结构:最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。程序执行时,栈指针可以移动,大多数信息的访问都是相对于帧指针的。
栈向低地址方向增长
二、转移控制
有一个目标,即指明被调用过程起始的指令地址,效果是将返回地址入栈,并跳转到被调用过程的起始处。
从栈中弹出地址,并跳转到这个位置,使用这个指令栈指针要指向call指令存储返回地址的位置。
|
七、遇到的问题及解决 |
(提示:此处由学生填写,是重要的得分点,要写出遇到的问题和解决方案以及对出现问题的思考) 不能因为困难而半途而废呀……上周的学习出现了问题,因此测验成绩很低。学习的内容一旦多了,就会想要得过且过。 经过测验,重新反思了自己的学习习惯问题。以后会继续脚踏实地。 不过老师这次的书本阅读量好大,写博客就写了四个小时……前六节的基础很重要因此不能不看,第七节最重要,因此重点理解。 课后习题因为有参考答案所以并没有大问题,有在学习过程中遇到一些琐碎的问题,询问了同学和百度知道,都有不同程度地解决。
最后,还是希望老师可以减轻作业量……今天我的生日也全埋在教室里写作业了……
PS 闫佳鑫同学很强大,有少许内容借鉴她的博客。
|
八、其他 |
(提示:此处由学生填写,灵感,领悟等) |