2018-2019-1 20165202 《信息安全系统设计基础》第三周学习总结

2018-2019-1 20165202 《信息安全系统设计基础》第三周学习总结

教材学习内容总结

一、Linux内核分析实验一

  1. 反汇编一个简单的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:当前指令位置寄存器
······
  1. 教材导读:程序的机器级表示

    1. gcc -S xxx.c -o xxx.s获得汇编代码;想要64位机器上获得32位汇编代码gcc -m32 -S xxx.c

    2. objdump -d xxx.o反汇编

    3. 不同数据的汇编代码后缀:

    4. 寄存器的理解:

    5. 寻址方式:操作数(operand)指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。第一种立即数,用来表示常数值;第二种寄存器表示某个寄存器的内容。第三种内存引用,根据计算出来的地址(有效地址)访问某个内存位置。有效地址的计算方式: Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

    6. 数据传送指令

    7. 算术与逻辑操作

    8. 汇编语言中的条件控制

    ## 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
    
    1. 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小时

参考资料

原文地址:https://www.cnblogs.com/jhs888/p/9788772.html