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