20145336张子扬 《信息安全系统设计基础》第5周学习总结
20145336张子扬 《信息安全系统设计基础》第5周学习总结(一)
教材学习内容总结
学习目标
- 理解逆向的概念
- 掌握X86汇编基础,能够阅读(反)汇编代码
- 了解ISA(指令集体系结构)
-
理解函数调用栈帧的概念,并能用GDB进行调试
学习内容
-
ISA:定义了处理器状态,指令的格式,每条指令对状态的影响。
gcc -O1 -S text.c
-
使用gcc产生一个汇编文件code.s,可以使用vim查看
-
gcc -O1 -c text.c
-
使用gcc产生目标代码文件。从中可知及其实际执行的程序只是对一系列指令进行编码的字节序列。
-
objdump -d test.o
- 查看目标代码文件的内容,将他们转换成一种类似与汇编代码的格式。
- 64位机器上想要的到32代码:gcc -m32 -S text.c
- 二进制文件可以使用od命令查看,或者使用gdb的x命令
-
不同数据的汇编代码的数据
字节 b 1 字 w 2 双字/双精度 l 4/8 单精度 s 4 拓展精度 t 10/12
- %eax,%ebx,%ecx,%edx,常用的寄存器,用来存储整数数据和指针,占32位,%ax16位,%ah、%al各占8位。
- 栈指针%esp,帧指针%ebp
- 大多数指令有一个或者多个操作数,指出执行下一个操作中要引用的源数据值,以及放置结果的目标位置。操作数分为三种:第一种立即术,即为常数值;第二种寄存器,,表示寄存器中的内容;第三种存储器,通常根据有效地址访问某个存储位置。(p113表格)
- %esp是栈指针,通常指向栈顶,栈顶在底部,地址不断增大,指向位于顶部的栈底
- pushl指令的功能是把数据要入到栈顶,popl是弹出数据(p115详解)
操作数三种类型
- 立即数($加一个数表示整数立即数)
- 寄存器(表示寄存器里存在的内容)
- 存储器
movl类
- movb传送字节
- movw传送字
- molv传送双字
add类
- addb字节加法
- addw字加法
- addl双字加法
这些操作被分为四组:加载有效地址、一元操作、二元操作和移位
leal指令
若%eax存储x,leal 7(%edx,%edx,4) 是将%eax的值设置委5x+7
- 一元操作:只有一个操作数,既是源又是目的
- 二元操作:第二个操作数既是源又是目的
- 移位操作:先给位移量,然后给出唯一的数值,可进行算数和逻辑右移
jump指令可以改变一组机器代码指令的执行顺序。
条件码寄存器:描述了最近的算数或逻辑操作的属性
- CZ:进位标志
- ZF:零标志
- SF:符号标志
- OF:溢出标志
过程
一个过程调用包括将数据和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。
I32程序用程序栈来支持过程调用
机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。
call
call指令有一个目标,即指明被调用过程起始的指令地址,调用可以是直接的也可以是间接的
call指令效果是将返回地址入栈,并跳转到被调用过程的起始处。
ret
ret指令从栈中弹出地址,并跳转到这个位置。栈指针要指向前面call指令所存储返回地址的位置。
寄存器%eax、%edx和%ecx被划分委调用者保存寄存器(P调用Q时,Q可以覆盖这些寄存器,而不会破坏P所需的任何数据
寄存器%ebx、%esi和%edi被划分委调用者保存寄存器(Q必须在覆盖这些寄存器的值之前将他们保存在栈中)
教材学习中的问题和解决过程
本周解决了git推送代码的问题,并且成功将代码推送至开源中国。
一开始不知道什么原因,不能push,再我不断尝试后终于成功了
本周代码托管截图
心得体会
本周学习了深入理解计算机系统第3章的知识,本章学习的内容主要是学习计算机的汇编语言。认识计算机如何将c语言程序转换为汇编语言,然后再将汇编语言转换为机器语言。在学习本章时还是觉得学习进程很缓慢,有时在一个知识点需要停留很久才能搞懂,以后还得多加练习,勤能补拙。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第二周 | 0/0 | 1/2 | 19/20 | |
第三周 | 80/80 | 1/3 | 25/44 | |
第四周 | 110/190 | 1/4 | 23/67 | |
第五周 | 60/250 | 2/6 | 26/93 |