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

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

[博客目录]

数据传送指令

mov — Move (Opcodes: 88, 89, 8A, 8B, 8C, 8E, ...)

mov指令将第二个操作数(可以是寄存器的内容、内存中的内容或值)复制到第一个操作数(寄存器或内存)。mov不能用于直接从内存复制到内存,其语法如下所示:

mov <reg>,<reg>
mov <reg>,<mem>
mov <mem>,<reg>
mov <reg>,<const>
mov <mem>,<const>

实例:

mov eax, ebx            //将ebx的值拷贝到eax
mov byte ptr [var], 5   //将5保存找var指示内存中的一个字节中

push— Push stack (Opcodes: FF, 89, 8A, 8B, 8C, 8E, ...)

push指令将操作数压入内存的栈中,栈是程序设计中一种非常重要的数据结构,其主要用于函数调用过程中,其中ESP只是栈顶。在压栈前,首先将ESP值减4(X86栈增长方向与内存地址编号增长方向相反),然后将操作数内容压入ESP指示的位置。其语法如下所示:

push <reg32>
push <mem>
push <con32>

实例:

push eax        //将eax内容压栈
push [var]      //将var指示的4直接内容压栈

pop— Pop stack

pop指令与push指令相反,它执行的是出栈的工作。它首先将ESP指示的地址中的内容出栈,然后将ESP值加4. 其语法如下所示:

pop <reg32>
pop <mem>

实例:

pop edi       //pop the top element of the stack into EDI.
pop [ebx]     //pop the top element of the stack into memory at the four bytes starting at location EBX.

lea— Load effective address

lea实际上是一个载入有效地址指令,将第二个操作数表示的地址载入到第一个操作数(寄存器)中。其语法如下所示:

lea <reg32>,<mem>

实例:

lea eax, [var]          //var指示的地址载入eax中.
lea edi, [ebx+4*esi]    // ebx+4*esi表示的地址载入到edi中,这实际是上面所说的寻址模式的一种表示方式.

返回目录

算术和逻辑指令

add— Integer Addition

add指令将两个操作数相加,且将相加后的结果保存到第一个操作数中。其语法如下所示:

add <reg>,<reg>
add <reg>,<mem>
add <mem>,<reg>
add <reg>,<con>
add <mem>,<con>

实例:

add eax, 10             //EAX ← EAX + 10
add BYTE PTR [var], 10  //10与var指示的内存中的一个byte的值相加,并将结果保存在var指示的内存中

sub— Integer Subtraction

sub指令指示第一个操作数减去第二个操作数,并将相减后的值保存在第一个操作数,其语法如下所示:

sub <reg>,<reg>
sub <reg>,<mem>
sub <mem>,<reg>
sub <reg>,<con>
sub <mem>,<con>

实例:

sub al, ah      // AL ← AL - AH
sub eax, 216    //eax中的值减26,并将计算值保存在eax中

inc, dec— Increment, Decrement

inc,dec分别表示将操作数自加1,自减1,其语法如下所示:

inc <reg>
inc <mem>
dec <reg>
dec <mem>

实例:

dec eax             //eax中的值自减1.
inc DWORD PTR [var] //var指示内存中的一个4-byte值自加1

imul— Integer Multiplication

整数相乘指令,它有两种指令格式,一种为两个操作数,将两个操作数的值相乘,并将结果保存在第一个操作数中,第一个操作数必须为寄存器;第二种格式为三个操作数,其语义为:将第二个和第三个操作数相乘,并将结果保存在第一个操作数中,第一个操作数必须为寄存器。其语法如下所示:

imul <reg32>,<reg32>
imul <reg32>,<mem>
imul <reg32>,<reg32>,<con>
imul <reg32>,<mem>,<con>

实例:

imul eax, [var]     //eax→ eax * [var]
imul esi, edi, 25   // ESI → EDI * 25

idiv— Integer Division

idiv指令完成整数除法操作,idiv只有一个操作数,此操作数为除数,而被除数则为EDX:EAX中的内容(一个64位的整数),操作的结果有两部分:商和余数,其中商放在eax寄存器中,而余数则放在edx寄存器中。其语法如下所示:

idiv <reg32>
idiv <mem>

实例:

idiv ebx
idiv DWORD PTR [var]
 and, or, xor— Bitwise logical and, or and exclusive or

逻辑与、逻辑或、逻辑异或操作指令

用于操作数的位操作,操作结果放在第一个操作数中。其语法如下所示:

and <reg>,<reg>
and <reg>,<mem>
and <mem>,<reg>
and <reg>,<con>
and <mem>,<con>
or <reg>,<reg>
or <reg>,<mem>
or <mem>,<reg>
or <reg>,<con>
or <mem>,<con>
xor <reg>,<reg>
xor <reg>,<mem>
xor <mem>,<reg>
xor <reg>,<con>
xor <mem>,<con>

实例:

and eax, 0fH //将eax中的钱28位全部置为0,最后4位保持不变.
xor edx, edx //设置edx中的内容为0.

not— Bitwise Logical Not
位翻转指令,将操作数中的每一位翻转,即0->1, 1->0。其语法如下所示:

not <reg>
not <mem>

实例:

not BYTE PTR [var] — 将var指示的一个字节中的所有位翻转.

neg— Negate
取负指令。语法为:

neg <reg>
neg <mem>

实例:

neg eax // EAX → - EAX

shl, shr— Shift Left, Shift Right
位移指令,有两个操作数,第一个操作数表示被操作数,第二个操作数指示位移的数量。其语法如下所示:

shl <reg>,<con8>
shl <mem>,<con8>
shl <reg>,<cl>
shl <mem>,<cl>
shr <reg>,<con8>
shr <mem>,<con8>
shr <reg>,<cl>
shr <mem>,<cl>

实例:

shl eax, 1      // Multiply the value of EAX by 2 (if the most significant bit is 0),左移1位,相当于乘以2
shr ebx, cl     //Store in EBX the floor of result of dividing the value of EBX by 2n where n is the value in CL.

返回目录

控制转移指令

X86处理器维持着一个指示当前执行指令的指令指针(IP),当一条指令执行后,此指针自动指向下一条指令。IP寄存器不能直接操作,但是可以用控制流指令更新。
一般用标签(label)指示程序中的指令地址,在X86汇编代码中,可以在任何指令前加入标签。如:

       mov esi, [ebp+8]
begin: xor ecx, ecx
       mov eax, [esi]

如第二条指令用begin指示,这种标签的方法在某种程度上简化了汇编程序设计,控制流指令通过标签实现程序指令跳转。

jmp — Jump

控制转移到label所指示的地址,(从label中取出执行执行),如下所示:

jmp <label>

实例:

jmp begin   //Jump to the instruction labeled begin.

jcondition— Conditional Jump
条件转移指令,条件转移指令依据机器状态字中的一些列条件状态转移。机器状态字中包括指示最后一个算数运算结果是否为0,运算结果是否为负数等。机器状态字具体解释请见微机原理、计算机组成等课程。语法如下所示:

je <label> (jump when equal)
jne <label> (jump when not equal)
jz <label> (jump when last result was zero)
jg <label> (jump when greater than)
jge <label> (jump when greater than or equal to)
jl <label> (jump when less than)
jle <label>(jump when less than or equal to)

实例:

cmp eax, ebx
jle done        //如果eax中的值小于ebx中的值,跳转到done指示的区域执行,否则,执行下一条指令。

cmp— Compare
cmp指令比较两个操作数的值,并根据比较结果设置机器状态字中的条件码。此指令与sub指令类似,但是cmp不用将计算结果保存在操作数中。其语法如下所示:

cmp <reg>,<reg>
cmp <reg>,<mem>
cmp <mem>,<reg>
cmp <reg>,<con>

实例:

cmp DWORD PTR [var], 10
jeq loop,

比较var指示的4字节内容是否为10,如果不是,则继续执行下一条指令,否则,跳转到loop指示的指令开始执行

call, ret— Subroutine call and return
这两条指令实现子程序(过程、函数等意思)的调用及返回。call指令首先将当前执行指令地址入栈,然后无条件转移到由标签指示的指令。与其它简单的跳转指令不同,call指令保存调用之前的地址信息(当call指令结束后,返回到调用之前的地址)。
ret指令实现子程序的返回机制,ret指令弹出栈中保存的指令地址,然后无条件转移到保存的指令地址执行。
call,ret是函数调用中最关键的两条指令。具体细节见下面一部分的讲解。语法为:

call <label>
ret

返回目录

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

  • 问题:如何理解逆向?
  • 解决:通过在百度搜索,我在百度百科中找到了答案:逆向工程(又称逆向技术),是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。软件逆向工程有多种实现方法,主要有三:
    • 1.分析通过信息交换所得的观察。
      最常用于协议逆向工程,涉及使用总线分析器和数据包嗅探器。在接入计算机总线或网络的连接,并成功截取通信数据后,可以对总线或网络行为进行分析,以制造出拥有相同行为的通信实现。此法特别适用于设备驱动程序的逆向工程。有时,由硬件制造商特意所做的工具,如JTAG端口或各种调试工具,也有助于嵌入式系统的逆向工程。对于微软的Windows系统,受欢迎的底层调试器有SoftICE。
    • 2.反汇编,即使用反汇编器,把程序的原始机器码,翻译成较便于阅读理解的汇编代码。这适用于任何的计算机程序,对不熟悉机器码的人特别有用。流行的相关工具有OllyDebug和IDA。
    • 3.反编译,即使用反编译器,尝试从程序的机器码或字节码,重现高级语言形式的源代码。

  • 问题:指令集体系结构(Instruction-Set Architecture, ISA)
  • 解决:通过阅读CSDN上的博客我找到相关知识辅助我理解:
    一个处理器支持的指令和指令的字节级编码就是这个处理器的ISA,包括很多个部分:
    • 指令集
    • 指令集编码
    • 基本数据类型
    • 一组编程规范
    • 寄存器
    • 寻址模式
    • 存储体系
    • 异常事件处理
    • 中断
    • 外部I/O
  • 作用:ISA在编译器编写者(CPU软件)和处理器设计人员(CPU硬件)之间提供了一个抽象层:
    • 处理器设计者:依据ISA来设计处理器
    • 处理器使用者(如:写编译器的牛*程序员):依据ISA就知道CPU选用的指令集,就知道自己可以使用哪些指令以及遵循哪些规范
    • 定义处理器上的软件如何构建,这是ISA的最重要内涵,现代处理器都是支持高级语言编程、操作系统等等特性,ISA要定义出指令集内的指令是如何支撑起C语言里堆栈、过程调用,操作系统里异常、中断,多媒体平台里数字图像处理、3D加速等等。

  • 问题:在汇编中如何调用函数
  • 解决:如果要调用一个函数,实现将数据和控制代码从一个部分到另一个部分的跳转。我们如何来分配执行函数的变量空间,并在返回的时候释放空间,将返回值返回。下面是一张图,非常便于理解:
    1071604-20180101215926909-100894154.png

返回目录

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


返回目录

本周结对学习情况

  • 结对学习博客
    20155302
  • 结对学习图片
    1071604-20171022224838396-1072634140.jpg
  • 结对学习内容
    • 教材第三章

返回目录

代码托管

返回目录

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周0/01/110/10
第二周0/00/110/20
第三周200/2002/310/30
第四周100/3001/410/40
第五周200/5002/510/50
  • 计划学习时间:10小时
  • 实际学习时间:10小时

返回目录

参考资料

返回目录

转载于:https://www.cnblogs.com/blackay03/p/7712304.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息安全技术 数据安全能力成熟度模型》(GB/T 37988-2019)是我国信息安全领域的一项技术标准。该标准的主要目的是为组织和企业提供一个评估其数据安全管理能力的框架,帮助其了解自身数据安全管理水平,并提供逐步改进的方向。 该模型基于数据安全管理的不同层次,将数据安全能力分为初级、基础、适度、优秀和领先五个层次。每个层次都定义了具体的能力要求和达到要求的关键性指标。企业可以根据自身实际情况,选择符合其当前能力水平和发展需求的层次作为目标,逐步提升自己的数据安全管理能力。 模型主要包括五个方面的设计要素,即目标、过程、方法、评估和改进。通过这些要素的综合运用,可以实现对企业数据安全能力的评估、改进和监控。其中,目标阐述了数据安全能力的五个层次,过程描述了实现这些层次的关键过程,方法提供了具体的实施指导,评估为企业提供了自我评估和第三方评估的方法,而改进则是持续改进数据安全能力的关键环节。 该模型的实施可以帮助组织和企业全面了解自身数据安全管理水平的现状,识别存在的不足和风险,并有针对性地进行改进。同时,该模型也可以作为评估企业数据安全管理能力的参考标准,有助于提高行业整体的数据安全水平。 总而言之,GB/T 37988-2019《信息安全技术 数据安全能力成熟度模型》是一项在数据安全管理领域的重要标准,能够指导企业进行数据安全能力评估和改进,提高数据安全管理水平,保护信息系统和数据的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值