# 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
- 查看源码 (gdb) l
2.设置断点 (gdb) b 5
这样会在运行到源码第5行时停止,可以查看变量的值、堆栈情况等
- 查看断点处情况 (gdb) info b
4.查看断点处情况,可以设置多个断点;
5.运行代码 (gdb) r
-
显示变量值 (gdb) p n
在程序暂停时,"p 变量名"(print)即可; -
单步运行 (gdb) n
8.程序继续运行 (gdb) c -
退出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小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)