20145317《信息安全系统设计基础》第五周学习总结2
20145317《信息安全系统设计基础》第五周学习总结2
教材学习内容总结
X86 寻址方式经历三代:
DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
8060的分段模式
IA32的带保护模式的平坦模式
程序编程
1、代码含义
gcc -01 -o p p1.c
-
-01 表示使用第一级优化。优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择。
-
-o 表示将p1.c编译后的可执行文件命名为p
2、机器级编程的两种抽象
- 指令集结构ISA
是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
- 机器级程序使用的存储器地址是虚拟地址
看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。
执行汇编命令:gcc –s xxx.c –o xxx.s
反汇编命令:objdump –d xxx
64位处理器得到32代码的命令:gcc –m32 –s xxx.c
访问信息
1、三种操作数:
立即数:常数值。表示为$c标准表示的整数。
寄存器:表示某个寄存器的内容。
存储器:根据计算出来的地址访问某个存储器位置
2、数据传送指令
-
栈的特点
a、 遵循“后进先出”的原则 b、 push压栈,pop出栈 c、 栈顶:总是从这端插入和删除元素 d、 栈顶元素的地址是最低的 e、 栈指针%esp保存着栈顶元素的地址
3、数据传送示例
局部变量通常保存在寄存器中;
寄存器访问比存储器访问要快的多。
1.在栈帧之间切换
frame args 将当前栈帧设置为args(编号或Address)指定的栈帧,并打印该栈帧的简要信息。
up n 向上回退n个栈帧(更外层),n默认为1.
down n 向下前进n个栈帧(更内层),n默认为1.
2.打印栈帧信息(不移动栈帧)
frame 打印当前栈帧的简要信息。
info frame 打印当前栈帧的详细信息。
info frame args 打印指定栈帧的详细信息。
info args 打印函数参数信息。
info locals 打印当前可访问的局部变量的信息。
3.打印调用堆栈
backtrace 打印全部栈帧的简要信息,按Ctrl-c可终止打印。
backtrace n 打印最内层的n个栈帧的简要信息。
backtrace -n 打印最外层的n个栈帧的简要信息。
backtrace full 打印全部栈帧的详细信息。
backtrace full n 打印最内层的n个栈帧的详细信息。
backtrace full -n 打印最外层的n个栈帧的详细信息。
gdb调试
课后作业中的问题
1、P113练习3.1刚开始看题就晕了,很多操作数搞混了,仔细看了表格后,明白了:$Imm是立即数,Imm是存储器位置,Ea是寄存器,(Ea)是存储器位置;此外,比例因子只和变址寄存器的值相乘,最后总结答案如下:
Ox100
OxAB
Ox108
OxFF
OxAB(和第二个等价)
Ox11
Ox13
OxFF
Ox11
2、P155练习3.32题不会做,反复阅读P153~P154后,发现漏看了返回值放在%eax寄存器中这句话,很关键,解答思路如下:
1、代码最后两行:
subl %eax,%edx
movl %edx,%eax
以及return x-c,可确定:%edx为x,%eax为c,注意到有后缀“l”,所以c和x为long int型。
2、看前两行,movsbl、movl命令说明%edx、%eax为双字,第三行代码明显是*p=d,所以,%edx为d,%eax为p,全部为long int型。
3、完整c代码如下:
long int fun(long int d,long int p)
{
*p=d;
long int c=p;
long int x=d;
return x-c
}
本周代码托管截图
https://git.oschina.net/717py/py-20145317/tree/master
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 1/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 200/1000 | 1/4 | 22/60 | |
第五周 | 200/1300 | 1/5 | 20/80 |
参考资料