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

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

    教材学习内容总结

    学习目标

    理解逆向的概念
    掌握X86汇编基础,能够阅读(反)汇编代码
    了解ISA(指令集体系结构)
    理解函数调用栈帧的概念,并能用GDB进行调试

    • 1.通用数据传送指令
      MOV 传送字或字节.
      MOVSX 先符号扩展,再传送.
      MOVZX 先零扩展,再传送.
      PUSH 把字压入堆栈.
      POP 把字弹出堆栈.
      PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
      POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
      PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
      POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
      BSWAP 交换32位寄存器里字节的顺序
      XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
      CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
      XADD 先交换再累加.( 结果在第一个操作数里 )
      XLAT 字节查表转换.
      ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
      0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )

    • 2.输入输出端口传送指令
      IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
      OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
      输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
      其范围是 0-65535.

    • 3.目的地址传送指令.
      LEA 装入有效地址.
      例: LEA DX,string ;把偏移地址存到DX.
      LDS 传送目标指针,把指针内容装入DS.
      例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
      LES 传送目标指针,把指针内容装入ES.
      例: LES DI,string ;把段地址:偏移地址存到ES:DI.
      LFS 传送目标指针,把指针内容装入FS.
      例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
      LGS 传送目标指针,把指针内容装入GS.
      例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
      LSS 传送目标指针,把指针内容装入SS.
      例: LSS DI,string ;把段地址:偏移地址存到SS:DI.

    • 4.标志传送指令.
      LAHF标志寄存器传送,把标志装入AH.
      SAHF 标志寄存器传送,把AH内容装入标志寄存器.
      PUSHF 标志入栈.
      POPF 标志出栈.
      PUSHD 32位标志入栈.
      POPD 32位标志出栈.
      ADD 加法.
      ADC 带进位加法.
      INC 加 1.
      AAA 加法的ASCII码调整.
      DAA 加法的十进制调整.
      SUB 减法.
      SBB 带借位减法.
      DEC 减 1.
      NEG 取补
      CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
      AAS 减法的ASCII码调整.
      DAS 减法的十进制调整.
      MUL 无符号乘法.
      IMUL 整数乘法.
      以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
      AAM 乘法的ASCII码调整.
      DIV 无符号除法.
      IDIV 整数除法.
      以上两条,结果回送:
      商回送AL,余数回送AH, (字节运算);
      或 商回送AX,余数回送DX, (字运算).
      AAD 除法的ASCII码调整.
      CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
      CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
      CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
      CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
      AND 与运算.
      or 或运算.
      XOR 异或运算.
      NOT 取反.
      TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
      SHL 逻辑左移.
      SAL 算术左移.(=SHL)
      SHR 逻辑右移.( 每位右移, 低位进 CF, 高位补 0)
      SAR 算术右移.(每位右移, 低位进 CF, 高位不变)
      ROL 循环左移.
      ROR 循环右移.
      RCL 通过进位的循环左移.
      RCR 通过进位的循环右移.
      以上八种移位指令,其移位次数可达255次.
      移位一次时, 可直接用操作码. 如 SHL AX,1.
      移位>1次时, 则由寄存器CL给出移位次数.
      如 MOV CL,04
      SHL AX,CL

    • 逆向
      逆向工程(又称逆向技术),是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。

    • 函数栈帧
      在子函数调用时,执行的操作有:父函数将调用参数从后向前压栈 -> 将返回地址压栈保存 -> 跳转到子函数起始地址执行 -> 子函数将父函数栈帧起始地址(%rpb) 压栈 -> 将 %rbp 的值设置为当前 %rsp 的值,即将 %rbp 指向子函数栈帧的起始地址。
      上述过程中,保存返回地址和跳转到子函数处执行由 call 一条指令完成,在call 指令执行完成时,已经进入了子程序中,因而将上一栈帧%rbp 压栈的操作,需要由子程序来完成。函数调用时在汇编层面的指令序列如下:

    ...   # 参数压栈
    call FUNC  # 将返回地址压栈,并跳转到子函数 FUNC 处执行
    ...  # 函数调用的返回位置
    FUNC:  # 子函数入口
    pushq %rbp  # 保存旧的帧指针,相当于创建新的栈帧
    movq  %rsp, %rbp  # 让 %rbp 指向新栈帧的起始位置
    subq  $N, %rsp  # 在新栈帧中预留一些空位,供子程序使用,用 (%rsp+K) 或 (%rbp-K) 的形式引用空位
    
    • 保存返回地址和保存上一栈帧的%rbp 都是为了函数返回时,恢复父函数的栈帧结构。在使用高级语言进行函数调用时,由编译器自动完成上述整个流程。对于”Caller Save” 和 “Callee Save” 寄存器的保存和恢复,也都是由编译器自动完成的。
      需要注意的是,父函数中进行参数压栈时,顺序是从后向前进行的。但是,这一行为并不是固定的,是依赖于编译器的具体实现的,在gcc 中,使用的是从后向前的压栈方式,这种方式便于支持类似于 printf(“%d, %d”, i, j) 这样的使用变长参数的函数调用。

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

    • 问题1:ISA有什么作用?
    • 问题1解决方案:ISA在编译器编写者(CPU软件)和处理器设计人员(CPU硬件)之间提供了一个抽象层

    代码调试中的问题和解决过程

    • 问题1:无法调用命令行参数
    • 问题1解决方案:argv[0]指向输入的程序路径及名称。
      argv[1]指向参数para_1字符串。

    [代码托管]

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 6/6 1/1 20/20
    第二周 117/123 1/2 5/25
    第三周 83/206 2/3 5/30

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难软件工程 估计方法

    • 计划学习时间:XX小时

    • 实际学习时间:XX小时

    • 改进情况:

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表
    )

    参考资料

  • 相关阅读:
    一道编程题: 在1~n之间选择若干个数,使其和为m
    关于raft算法
    程序员算法基础——动态规划
    c++中两个类互相引用的问题
    c++ 之模板进阶
    jmeter分布式操作-远程启动功能探索
    linux下安装不同版本的jdk
    Jmeter插件监控服务器性能
    测试开发面试-技术持续累积
    python:Jpype安装和使用
  • 原文地址:https://www.cnblogs.com/20155222lzj/p/7712735.html
Copyright © 2011-2022 走看看