zoukankan      html  css  js  c++  java
  • # 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小时

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

    参考资料

  • 相关阅读:
    Linux05——用户操作
    租房子-----多选题
    查询
    增删
    PHP基础
    数据库--高级查询
    CRUD查询
    CRUD操作
    数据库
    轮播
  • 原文地址:https://www.cnblogs.com/lsqsjsj/p/7711776.html
Copyright © 2011-2022 走看看