2019-2020-1 20175313 《信息安全系统设计基础》第三周学习总结
一、教材学习内容总结
数据类型
- 注意:汇编代码也使用"l"来表示4字节整数和8字节双精度浮点数。这不会产生歧义,因为浮点数使用的是一组完全不同的指令和寄存器。
操作数
操作数可分为三种类型:
1. 立即数
2. 寄存器
3. 内存引用
操作指示符
过程
P调用Q:
call Q
该指令会把P中call Q
的下一条指令的地址A压入栈中,并把程序计数器设置为Q的代码的起始位置.retq
该指令会将地址A从栈中弹出,并将A赋值给PC
gdb调试
- objdump -d mstore.o进行反汇编
缓冲区溢出
最小化程序缓冲区溢出攻击漏洞三种方式:
- 栈随机化:在程序开始之前,在栈上分配0-n字节之间程序不使用的随机大小空间,使得栈的位置在程序每次运行时都有变化。
- 栈破坏检测:在帧栈中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值,在恢复寄存器状态和从函数返回之前,检查金丝雀值是否被该函数的某个操作或者该函数调用的某个函数的某个操作改变了。以此来判断缓冲区是否溢出。
- 限制可执行代码区域:只有保存编译器产生的代码那部分内存才需要是可执行的,其他部分可以被限制为只允许读和写。以此来消除攻击者向系统中插入可执行代码的能力。
二、教材学习中的问题和解决过程
- 问题1:对教材114页上的代码进行验证时,在进行汇编的时候,显示
:错误:无效的选项参数'-Og'
。
-
解决方法1:将其改为
gcc -O1 -c mstore.c
,因为有的版本编译器不支持-Og
-
运行结果如下:
- 问题2:对于markdown的表格语法,在有道云上能够显示表格,但是传到博客园上就无法显示。
- 解决方法2:未能解决。
- 问题3:使用gdb对教材上的代码进行调试
- 使用
gcc -g week302.c -o week302
进行汇编 - 使用
b f
在f函数处设置一个断点 - 使用
run
运行至断点处 - 使用
disas
进行反汇编 - 使用
display /i $pc
查看每次执行的汇编语句 - 使用
stepi
每次运行一句汇编语句 - 使用
i r
查看每个寄存器的值 - 运行结果如下:
三、心得体会
本周学习内容较为繁杂,只要之前的汇编课认真听讲,理解起来也虽然不是很难。
四、学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第三周 | 301/706 | 1/34 | 18/40 |
-
计划学习时间:20小时
-
实际学习时间:18小时
五、参考资料
- 在linux里面如何调试C语言程序
- GDB如何调试没有符号表(未加-g选项的编译)的程序
- GDB调试程序用法
- GDB调试汇编堆栈过程分析
- 程序的机器级表示(1)
- 程序的机器级表示(2)
- 程序的机器级表示(3)
- 《深入理解计算机系统》