20145310《信息安全系统设计基础》第五周学习总结

20145310《信息安全系统设计基础》第五周学习总结

教材学习内容总结

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

访问信息

三种操作数:
立即数:常数值。表示为$c标准表示的整数。
寄存器:表示某个寄存器的内容。
存储器:根据计算出来的地址访问某个存储器位置
数据传送指令
栈的特点
a、 遵循“后进先出”的原则
b、 push压栈,pop出栈
c、 栈顶:总是从这端插入和删除元素
d、 栈顶元素的地址是最低的
e、 栈指针%esp保存着栈顶元素的地址
3、数据传送示例
局部变量通常保存在寄存器中;
寄存器访问比存储器访问要快的多。

二进制文件用od命令查看
·ATT与Intel汇编代码格式区别:
Intel代码省略了指示大小的后缀
Intel代码省略了寄存器前面的‘%’符号
Intel代码用不同的方式来描述存储器中位置
在带有多个操作数的指令情况下,列出操作数的顺序相反

·栈:遵循“后进先出”的原则
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 打印当前可访问的局部变量的信息。

打印调用堆栈
backtrace 打印全部栈帧的简要信息,按Ctrl-c可终止打印。
backtrace n 打印最内层的n个栈帧的简要信息。
backtrace -n 打印最外层的n个栈帧的简要信息。
backtrace full 打印全部栈帧的详细信息。
backtrace full n 打印最内层的n个栈帧的详细信息。
backtrace full -n 打印最外层的n个栈帧的详细信息。

数据格式

过程调用:

进入,为过程的局部变量分配空间
将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。
退出,释放这些空间。

IA32程序用程序栈来支持过程调用。注意:栈是向低地址增长的。
栈帧结构:用来传递参数、储存返回信息、保存寄存器、以及本地存储
call/ret; 函数返回值存在%eax中
leave指令可以使栈做好返回的准备
程序寄存器是唯一能被所有过程共享的资源。

转移控制
call
call指令和转移指令相似,同样分直接和间接,直接调用的目标是标号,间接调用的目标是*后面跟一个操作数指示符,和JMP一样。
call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。
ret
ret指从栈中弹出地址,并跳转到这个位置。
在上学期的汇编语言学习中,call和ret常被用来进行子函数、子模块的调用。

课后练习截图


编辑代码


将代码转换为汇编语言并查看


将含有代码中以"."开头的编译器指令删除

课后作业中的问题和解决过程

如果在c文件中输入头文件#include<stdio.h>则无法转换。。

本周代码托管截图

参考资料

posted @ 2016-10-16 20:54  20145310刘宇飞  阅读(183)  评论(1编辑  收藏  举报