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

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

    教材学习内容总结

    寻址方式经历:

    • DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
    • 8060的分段模式
    • IA32的带保护模式的平坦模式

    代码编译:

    • 编译产生汇编代码:gcc –s xxx.c 得到.s文件
    • 编译产生目标代码文件:gcc -o1 xxx.c 得到.o文件

    • 反汇编命令:objdump –d xxx

    • 直接编译64位处理器得到32代码的命令:gcc –m32 -S xxx.c

    二进制文件可以用od 命令查看,也可以用gdb的x命令查看。

    有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
    od code.o | more
    od code.o > code.txt

    操作数的三种类型

    • 立即数:常数值,表示为$c标准表示的整数
    • 寄存器:表示某个寄存器的内容
    • 存储器:根据计算出来的地址访问某个存储器位置

    栈的特点

    • 遵循“后进先出”的原则
    • push压栈,pop出栈
    • 栈顶:总是从这端插入和删除元素
    • 栈顶元素的地址是最低的
    • 栈指针%esp保存着栈顶元素的地址

    四组操作

    • 加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器
    • 一元操作:只有一个操作数,既是源又是目的
    • 二元操作:源操作数是第一个,可以是立即数、寄存器、存储器,目的操作数是第二个,可以是寄存器、存储器,但两个不能同时为存储器
    • 移位:第一个是移位量,用单个字节编码且只允许0-31位的移位,可以是立即数或者放在单字节寄存器%cl中(算术右移SAR,填上符号位/逻辑右移SHR,填上0)目的操作数可以是一个寄存器或存储器

    条件码

    • CF:进位标志
    • ZF:零标志
    • SF:符号标志
    • OF:溢出标志

    jump指令

    • 直接跳转:后面跟标号作为跳转目标
    • 间接跳转:*后面跟一个操作数指示符

    call指令

    • call指令有一个目标,即指明被调用过程起始的指令地址。
    • call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。

    ret指令

    • ret指从栈中弹出地址,并跳转到这个位置。
    • ret指令返回到call指令后的那条指令。

    gdb

    使用流程

    • 进入GDB  #gdb test
    • test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb)
    • 查看源码  (gdb) l
    • 设置断点  (gdb) b 6
    • 这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。
    • 查看断点处情况  (gdb) info b
    • 可以键入"info b"来查看断点处情况,可以设置多个断点;
    • 运行代码  (gdb) r
    • 显示变量值  (gdb) p n
    • 在程序暂停时,键入"p 变量名"(print)即可;
    • 在程序暂停时,键入"p 变量名"(print)即可;
    • 单步运行  (gdb) n
    • 程序继续运行  (gdb) c
    • 退出GDB  (gdb) q

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

    这周学习教材内容时,遇到了一些比较难以区分的指令和定义,在此加以比较。

    Mov movs movz的区别:

    将源操作数的值复制到目的操作数中时(不涉及数据大小的转换),用mov

    将一个较小的源数据复制到一个较大的数据位置时,用movs或者movz:

    当数据是有符号数的时候,用movs

    当数据是无符号数的时候,用movz

    Leal mov指令:

    mov是将数据从源操作传到目的操作数中

    lea是将源操作数的地址传到目的操作数中

    一个是数据,一个是地址

    比如:D1 dw 0x0000

    汇编以后可能变成:

    地址 值

    0x9000 00

    0x9001 00

    那么lea SI,D1,SI的值是0x9000而不是0000,要用mov就是0000了

    算数右移和逻辑右移 (SAR K,D SHR K,D):

    逻辑右移:左边统一加0

    算术右移:左边加原数符号位上的数:

    eg:1010101010,其中[]位是添加的数字

    逻辑右移一位:[0]101010101

    算数右移一位:[1]101010101

    (此外,逻辑左移=算术左移,右边都加0)

    CMP 和SUB

    sub S,D 是D-S结果送回D中,即目的操作数中

    而cmp S,D也是相减但结果不送回目的操作数中,一般用作比较数大小时用

    本周代码托管截图

    链接:https://git.oschina.net/20144303sys/work

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

    本周主要学习的是第三章的内容,与之前学的汇编语言有很大的联系。这章有很多类似的定义和指令,看起来内容很多,十分的复杂,但我发现把相似的知识拿来比较,总结他们的相同的和不同点以及各自的用法,可以更快的理解掌握,这样的学习方法可以提高学习效率,以后要多运用。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/1 20/20
    第二周 300/300 1/2 20/40
    第三周 300/600 1/3 20/60
    第五周 200/800 1/4 20/80

    参考资料

  • 相关阅读:
    CentOS 7 源码编译安装 Mysql 5.7
    Nginx 负载均衡 后端 监控检测 nginx_upstream_check_module 模块的使用
    cronolog 对 tomcat 7 进行日志切割
    OpenStack
    Oracle GoldenGate 异构平台同步(Mysql到Oracle)
    ELK 日志分析体系
    Tengine TCP 负载均衡
    MariaDB GTID 复制同步
    Mycat 安装配置
    Navicat破解
  • 原文地址:https://www.cnblogs.com/20144303sys/p/5968132.html
Copyright © 2011-2022 走看看