zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155201 《信息安全系统设计基础》第五周学习总结

    2017-2018-1 20155201 《信息安全系统设计基础》第五周学习总结

    教材学习内容总结

    一、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
    
    

    代码托管

    结对及互评

    本周结对学习情况

    • 20155313

    • 结对学习内容
      汇编代码、函数调用的栈情况

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 195/195 1/1 10/10
    第三周 314/706 1/2 15/25
    第五周 254/960 1/3 10/35
    • 计划学习时间:12小时

    • 实际学习时间:10小时

    参考资料

  • 相关阅读:
    Android 如何自定义EditText 下划线?
    一步一步理解 Java 企业级应用的可扩展性
    客户案例—北京优络时代科技有限公司
    11个显著提升 ASP.NET 应用程序性能的技巧——第1部分
    如何用 React Native 创建一个iOS APP?(二)
    如何与 DevOps 为伍?
    通过 DevOps 整合开发和应用安全管道
    性能为王:选择模拟监控的10大理由!
    模拟监控和真实用户体验监测,选哪个?
    PHP 之 Laravel 框架安装及相关开源软件
  • 原文地址:https://www.cnblogs.com/zhuohua/p/7712507.html
Copyright © 2011-2022 走看看