在拆弹实验中。你将直面真实环境下的汇编指令,这里做一个简单intro,帮助大家快速入门一些汇编指令。
一些基础的指令表如下:
基础框架只需要查询如上的基础指令就可以大致解决。
此外还有一些特殊指令,通常是起到一些控制的作用,或者是在体系结构上有所考量,这里做一些简单地分析。值得一提的是,通常这些指令你并不需要做一些很细致的了解,甚至在分析的时候都可以忽略。
大家可能很频繁会看到这个指令enbr64
在函数调用的返回位置,其实这是一个保护指令,放置一些出现攻击代码对调用栈的攻击,本质上他除了保护程序运行正常之外,不会对程序的功能造成任何实质性的影响,
对相关问题感兴趣的同学可以查阅Intel相关文档:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
大家可能会频繁看到各种nop
,注意所有的nop本质上都是什么都没执行,它本身就是no operation
,那么他为什么要存在呢?可能是刷新流水线的需求,也可能只是为了去为了一些特殊指令去对齐内存等等,任何带有nop
前缀的指令都是无需在功能上做一些考察的。
但是在CPU设计或者体系结构层面,适时的插入一些nop
事实上都是非常关键且必要的。这一点大家在之后的第四章和计组课程的学习中都会有所体会。
可以看做是jmp,BND 前缀是英特尔 MPX(内存保护扩展)的一部分,表示返回目标(或一般分支目标,因为 BND 可以应用于任何控制流指令)应该根据 BND0 到 BND3 寄存器中指定的边界进行检查, 否则会产生一个异常——表示潜在的堆栈溢出、编程错误或恶意代码攻击。
具体内容:可以参见 https://en.wikipedia.org/wiki/Intel_MPX