# 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

1065408-20171018213424724-1746330596.png
使用

gcc -Og -c p114.c

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

  • 使用
objdump -d p114.o

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

  • 课本p156页3.26:
    根据汇编代码写出c语言代码:
    1065408-20171018215256349-137881408.png
    使用gcc编译器得到如下汇编代码:
    1065408-20171018215428599-76119397.png

  • 在实验楼实验时:
    使用命令
gcc –S –o shiyanlou.s shiyanlou.c -m32

1065408-20171018221139974-321486760.png

运行结果:(使用cat命令查看)
1065408-20171018221547115-1982987762.png

删除“·”开头的:
1065408-20171018221721084-1655273764.png

查看二进制文件shiyanlou.o:(用od命令)
1065408-20171018222229193-1342674051.png

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

  • 课本3.29练习题:
    原代码和运行结果:1065408-20171018220328693-457716513.png

将程序改写成while代码:
1065408-20171018220425912-950015254.png
因为continue语句阻止i被修改,导致运行结果无限循环,使用ctrl+c退出。

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

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

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

后出现错误:

  • 1065408-20171018222844787-1653814242.png

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

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

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

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

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

  • 问题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;
}

1065408-20171019111317787-1733653246.png

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

bt

显示是

no stack

的问题。

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

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

1065408-20171019111712990-1188373949.png

于是换了以前运行过的代码后,再次试验:
1065408-20171019111930631-1694120120.png
结果还是不对,在查书时,发现是命令输入有误,于是做了修改:
命令为:

info frame
info registers

结果显示正确:
1065408-20171019112136568-1069937452.png
寄存器显示:
1065408-20171019112324302-307410239.png

代码托管

1065408-20171019205111709-266009075.png

上周考试错题总结

结对及互评

点评模板:

暂无

本周结对学习情况

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


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

思考

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

学习进度条

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第四周12/121/120/20
第五周271/2831/215/15
第6周276/2832/318/18
第7周150/2834/421/23

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

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

  • 计划学习时间:21小时

  • 实际学习时间:23小时

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

参考资料

转载于:https://www.cnblogs.com/lsqsjsj/p/7711776.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值