2017-2018-1 20155201 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
一、Linux内核分析实验一
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
int g(int x){
return x+3;
}
int f(int x){
return g(x);
}
int main(void){
return f(8)+1;
}
通过输入gcc -S -o main.s main.c -m32
将c程序编译成32位汇编代码
cat main.s
查看汇编码
查询资料知道:
eax:函数返回值保存寄存器
ebp:栈底指针寄存器
esp:栈顶指针寄存器(运行中的每个程序都有一段堆栈空间,用来存放程序运行中的数据)
eip:当前指令位置寄存器
······
-
教材导读:程序的机器级表示
-
gcc -S xxx.c -o xxx.s
获得汇编代码;想要64位机器上获得32位汇编代码gcc -m32 -S xxx.c
-
objdump -d xxx.o
反汇编 -
不同数据的汇编代码后缀:
-
寄存器的理解:
-
寻址方式:操作数(operand)指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。第一种立即数,用来表示常数值;第二种寄存器表示某个寄存器的内容。第三种内存引用,根据计算出来的地址(有效地址)访问某个内存位置。有效地址的计算方式:
Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
-
数据传送指令
-
算术与逻辑操作
-
汇编语言中的条件控制
## x in %rdi ,y in %rsi absdiff_se: cmpq %rsi, %rdi ##比较x,y jge .L2 ## if x>=y 跳转L2 addq $1, lt_cnt(%rip) ##lt_cnt++ movq %rsi, %rax %rsi送入%rax subq %rdi, %rax ##%rax-%rdi送入%rdi ret ##return .L2: addq $1, ge_cnt(%rip) ##ge_cnt++ movq %rdi, %rax ##向x传值 subq %rsi, %rax ##%rax-%rsi的值送入%rax ret ##return
- while循环
## n in %rdi fact_do: movl $1, %eax ##set %eax=1 .L2: imulq %rdi, %rax ##%rax * %rdi送入%rax subq $1, %rdi ##%rdi自减 cmpq $1, %rdi ##比较n:1 jg .L2 ## if n>1, 跳转.L2 rep; ret ##return
-
教材学习中的问题和解决过程
- 问题1:如何理解运行时的栈?
- 问题1解决方案:当过程P调用过程Q时,会把返回的地址压入P的栈帧中,指明当Q返回时,P从哪里开始执行。
Q的代码会扩展当前栈的边界,分配他的栈帧所需要的空间,在这个空间,它可以保存寄存器的值,分配局部变量的空间,为调用过程设置参数。当Q运行时,P以及所有在向上追溯到P的调用链中的过程都是被挂起的,同时此时Q的栈帧在栈顶。
代码调试中的问题和解决过程
- 问题1:如何理解实验楼课程linux内核汇编码
main.s
- 问题1解决方法:
##%esp栈顶指针 %ebp栈底指针
_g:
pushl %ebp ##将%ebp压栈
movl %esp, %ebp ##将%esp保存到%ebp 函数标准开头
pushl %eax ##将%eax压栈
movl 8(%ebp), %eax ##%eax=8
movl %eax, -4(%ebp) ##%ebp-4=%eax=8
movl -4(%ebp), %eax
addl $3, %eax ##%eax+3=8+3
addl $4, %esp ##%esp+4
popl %ebp
retl
_f:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, (%esp)
calll _g
addl $8, %esp
popl %ebp
retl
_main:
pushl %ebp ##将%ebp压栈
movl %esp, %ebp ##将%esp保存到%ebp 函数标准开头
subl $24, %esp ##增加栈空间%esp-24
movl $8, %eax ##%eax=8
movl $0, -4(%ebp) ##%ebp-4=0
movl $8, (%esp) ##%esp=8
movl %eax, -8(%ebp) ##%ebp-8=x
calll _f
addl $1, %eax ##%eax++
addl $24, %esp ##%esp+24
popl %ebp ##%ebp弹栈
retl
代码托管
结对及互评
本周结对学习情况
-
结对学习内容
汇编代码、函数调用的栈情况
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 195/195 | 1/1 | 10/10 | |
第三周 | 314/706 | 1/2 | 15/25 | |
第五周 | 254/960 | 1/3 | 10/35 |
-
计划学习时间:12小时
-
实际学习时间:10小时