zoukankan      html  css  js  c++  java
  • 20145206 《信息安全系统设计基础》第5周学习总结

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

    教材学习内容总结

    ·X86 寻址方式经历三代:
    DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
    8086的分段模式
    IA32的带保护模式的平坦模式
    · gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧。MAC OS中没有objdump, 有个基本等价的命令otool
    Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
    · 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
    od code.o | more
    od code.o > code.txt
    ·esi edi可以用来操纵数组,esp ebp用来操纵栈帧。对于寄存器,32位的eax,16位的ax,8位的ah,al都是独立的。
    ·操作数的三种类型:立即数、寄存器、存储器;有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
    · MOV相当于C语言的赋值”=“,不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。
    MOV:MOV类中的指令将源操作数的值复制到目的操作数中。
    MOVS和MOVZ:MOVS和MOVZ指令类都是将一个较小的源数据复制到一个较大的数据位置,高位用符号位扩展(MOVS)或者零扩展(MOVZ)进行填充。
    ·栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。
    ·指针就是地址;局部变量保存在寄存器中。
    ·控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)
    · 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)注意leal不改变条件码寄存器
    思考一下:CMP和SUB用在什么地方
    答:CMP指令根据它们的两个操作数之差来设置条件码。除了只设置条件码而不更新目标寄存器之外,CMP指令与SUB指令的行为是一样的。
    ·SET指令根据t=a-b的结果设置条件码
    · 跳转与标号
    · if-else 的汇编结构
    ·IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序.
    ·call/ret; 函数返回值存在%eax中
    · bt/frame/up/down :关于栈帧的gdb命令
    ·反汇编器:
    根据目标代码产生一种类似于汇编代码的格式。在linux中,可以通过objdump -d xxx.o 实现

    实验楼学习情况

    ·用vim编辑器编写代码:

    ·查看汇编文件:

    ·去掉以.开头的语句后的汇编代码:

    教材学习中的问题和解决过程

    练习3.5

    C代码如下:

    编译成汇编文件如下:

    练习3.9

    补充C语言代码中缺失的那部分之后:

    编译成汇编文件如下:

    练习3.14

    考虑以下C语言代码:

    int test(data_t a)
    {
        return a TEST 0;
    }
    

    根据以下每条指令序列,确定哪种数据类型和比较TEST会使编译器产生这样的代码?
    A. testl %eax,%eax setne %al

    B. testb %al,%al setg %al

    练习3.16

    已知下列C代码:

    void cond(int a,int *p)
    {
        if(p&&a>0)
            *p +=a;
    }
    

    用C语言写一个goto版本:

    练习3.29

    补充之后的C语言代码:

    int switcher(int a,int b,int c)
    {
        int answer;
        switch(a)
        {
            case 5 :
                c = b ^ 15;
            case 0 :
                answer = c+112;
                break;
            case 2 :
            case 7 :
                answer = (c+b)<<2;
                break;
            case 4 :
                answer = a;
                break;
            default :
                answer = b;
        }
        return answer;
    }
    

    本周代码托管截图

    ·托管实验楼中的代码

    ·托管练习中的代码

    其他(感悟、思考等,可选)

    本周学习内容联系到很多汇编知识,由于上学期学过汇编课程,所以对于汇编有一些了解,但还需要更加深入地学习,这周学会了通过C语言文件汇编成汇编文件,从而查看,练习方面还需要多做以巩固这一部分的知识。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/2 20/30 学习了一些Linux核心命令
    第二周 250/250 1/3 20/50 学习了vim编辑器基础
    第三周 280/530 1/4 18/68 熟练在vim里编程并运行
    第五周 300/830 1/5 15/83 学会生成汇编文件并查看

    参考资料

  • 相关阅读:
    sql当前行数据和之前行数据相加减循环处理
    Sql 查询库、表、列名的语句
    sql 特殊字符替换
    pandas 篇
    JAVA学习--面向对象的特征二:继承性
    JAVA学习--super使用
    JAVA学习--方法的参数传递
    JAVA学习--可变个数的形参的方法
    JAVA学习--面向对象思想的落地法则
    JAVA学习--方法的重载
  • 原文地址:https://www.cnblogs.com/ZouJR/p/5959791.html
Copyright © 2011-2022 走看看