# 2017-2018-1 20155232 《信息安全系统设计基础》第五周学习总结

2017-2018-1 20155232 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

本周学习第三章

  • 编译产生汇编代码:gcc –s xxx.c 得到.s文件

  • 编译产生目标代码文件:gcc -o1 xxx.c 得到.o文件

  • 反汇编命令:objdump –d

  • 操作数的三种类型

1.立即数

2.寄存器

3.存储器

    • push压栈
    • pop出栈
  • 加载有效地址leaq

  • 条件码

  • 跳转指令

jmp无条件跳转

1.直接跳转:后面跟标号作为跳转目标

2.间接跳转:*后面跟一个操作数指示符

  • 条件控制(if-else)

  • do-while循环

  • while循环

  • switch语句

  • gdb

  1. 查看源码  (gdb) l

2.设置断点  (gdb) b 5

这样会在运行到源码第5行时停止,可以查看变量的值、堆栈情况等

  1. 查看断点处情况  (gdb) info b

4.查看断点处情况,可以设置多个断点;

5.运行代码  (gdb) r

  1. 显示变量值  (gdb) p n
    在程序暂停时,"p 变量名"(print)即可;

  2. 单步运行  (gdb) n
    8.程序继续运行  (gdb) c

  3. 退出GDB  (gdb) q

  • 对抗缓冲区溢出攻击
    1.栈随机化
    2.栈破坏检测
    3限制可执行代码区域.

  • 课本p114页代码mstore.c

long mult2(long, long);
void multstore(long x ,long y,long *dest) {
long t =mult2(x,y);
*dest = t;
}

使用命令

gcc -Og -S p114.c

gcc运行编译器,产生汇编文件p114.s


使用

gcc -Og -c p114.c

gcc会编译并汇编该代码,因为p114.o文件时二进制格式,所以无法直接查看。

  • 使用
objdump -d p114.o

产生了一种类似于汇编代码的格式,右边是等价的汇编语言:

  • 课本p156页3.26:
    根据汇编代码写出c语言代码:

    使用gcc编译器得到如下汇编代码:

  • 在实验楼实验时:
    使用命令

gcc –S –o shiyanlou.s shiyanlou.c -m32

运行结果:(使用cat命令查看)

删除“·”开头的:

查看二进制文件shiyanlou.o:(用od命令)

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

  • 课本3.29练习题:
    原代码和运行结果:

将程序改写成while代码:

因为continue语句阻止i被修改,导致运行结果无限循环,使用ctrl+c退出。

  • 解决方法使用goto语句代替continue语句,会跳出循环体余下部分,直接到update的部分:

代码调试中的问题和解决过程

  • 问题1:在做实验楼的实验时输入命令:
gcc –S –o shiyanlou.s shiyanlou.c -m32

后出现错误:

  • 解决:
    因为需要按照顺序生成所需要的文件:

1.C预处理器——扩展源代码-生成.i文件

2.编译器——产生两个源代码的汇编代码-——生成.s文件

3.汇编器——将汇编代码转化成二进制目标代码——生成.o文件

4.链接器——产生可执行代码文件
之后按照通过汇编器的步骤生成了汇编文件

  • 问题2:
    对实验楼的代码如下,进行gdb调试,以及观察栈针和寄存器时,出现了no stack的问题:
#include<stdio.h>
int add(int x)
{
  return x + 3;
}

int add2(int x)
{
  return add(x);
}

int main(void)
{
  return add2(5232) + 1;
}

在用GDB进行栈帧追踪时,输入

bt

显示是

no stack

的问题。

  • 解决:
    上网查询了相关问题,网上说因为在编译时没有使用
gcc -g

再次试验,还是显示no stack:

于是换了以前运行过的代码后,再次试验:

结果还是不对,在查书时,发现是命令输入有误,于是做了修改:
命令为:

info frame
info registers

结果显示正确:

寄存器显示:

代码托管

上周考试错题总结

结对及互评

点评模板:

暂无

本周结对学习情况

- [20155215](http://www.cnblogs.com/xuanyan/p/7711671.html)


- 结对学习内容
    - 共同学习课本第三章和实验楼内容
    - 分析课本中代码遇到的问题

思考

这周的学习内容主要是机器代码汇编。教材中有很多的代码,通过自己练习加深了理解。汇编是接近机器语言的一种语言,很难懂,虽然现在基本用不上了,但是理解读懂汇编代码才能更好的理解和学习计算机,而且汇编知识上学期也学过,所以更加深了印象。

学习进度条

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第四周 12/12 1/1 20/20
第五周 271/283 1/2 15/15
第6周 276/283 2/3 18/18
第7周 150/283 4/4 21/23

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:21小时

  • 实际学习时间:23小时

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

原文地址:https://www.cnblogs.com/lsqsjsj/p/7711776.html