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

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

教材学习内容总结

逆向工程

正常的设计过程是设计人员在脑中构思出产品结构、性能和大致的技术参数,然后在细节设计中完善各类数据模型,最后将模型导入总设计中以完成产品设计。而逆向工程则是先获取已有的成品,然后通过反向分析推导出完成该产品所需的大部分数据。在计算机编程当中,使用逆向工程通常指的是对已有软件进行反汇编(反向开大日代码……),通过汇编代码来得到目标软件的设计思路及实现方式。

指令集体系结构

ISA(指令集体系结构)包含以下四种: 复杂指令集运算(Complex Instruction Set Computing,CISC);精简指令集运算(Reduced Instruction Set Computing,RISC) ;显式并行指令集运算(Explicitly Parallel Instruction Computing,EPIC);超长指令字指令集运算(VLIW)。其中CISC、EPIC能在64位操作系统中使用;RISC不能在Windows系统下运行;VLIW是一种将多条指令缩编到一个指令字上的指令集运算,能够有效利用计算机CPU。

函数调用栈帧的变化

某份被反汇编的代码:

#include<stdio.h>  
int fun(int x, int y)  
{  
    int c = 0xcccccccc;  
    return c;  
}  
int main()  
{  
    int a = 0xaaaaaaaa;  
    int b = 0xbbbbbbbb;  
    int ret = fun(a, b);  
    printf("You should runing here!\n");  
    return 0;  
} 

  • 先是主函数的堆栈基址入栈,以保存之前任务的信息。
  • 然后将主函数的栈顶指针的值赋给堆栈基址,作为新的基址(即被调用的函数fun()的栈底)。
  • 然后在这个基址(fun()函数的栈底)上开辟(一般用sub命令)相应的空间用作被调用者fun()函数的栈空间。
  • 函数fun()返回后,从当前栈帧的栈底即恢复为调用者函数main()的栈顶,使栈顶恢复函数fun()被调用前的位置,然后调用者main()再从恢复后的栈顶弹出之前的ebp值(可以这么做是因为这个值在函数调用前前一步被压入栈”main():retaddr”)。这样,堆栈基址和栈顶指针就都恢复了调用函数fun()之前的位置,也就是栈恢复函数fun()调用前的状态。

浮点机器代码

与C语言、Java不同,汇编语言只有一种浮点数float。AVX2指令集比原来的代码,更能提升CPU的浮点数运算能力。AVX的浮点数运算代码与汇编语言的整数运算代码相似,都使用一组寄存器保存和操作数值,也用同一组寄存器来传递函数参数。

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

  • 问题1:ISA体系下有四种指令集运算,其中2种明确只能在64位机器上使用,VLIW是将多条代码缩编到一个指令字上,并没有明确说明适用于32位机或64位机或两者皆可。那么32位机的ISA是怎么样的?
  • 问题1解决方案:已经上网寻找答案,但是网上并没有直接给出32位机的ISA体系结构。现在的情况是:ISA体系下的四种指令集中有两种(EPIC和CISC)是不可能在我的32位机使用的,VLIW尚不清楚,只剩RISC一种我是确定能使用的(在虚拟机)。
  • 问题2:AVX2浮点数计算基于x86-64CPU,然而我的笔记本确定是台32位机,能不能用我心里没底。
  • 问题2解决方案:虚拟机是64位的,就可能用得上AVX2的浮点代码。

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

  • 问题1:反汇编出来的代码看不太懂。
  • 问题1解决方案:下载一份汇编代码汇总,看到一条代码就翻汇总,就不信看不懂!

代码托管

上周考试错题总结

活动在博客发布前活动还没有结束,查不到错题。

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

有谁知道哪里或那位高人可以魔改笔记本电脑的吗?我想把

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
第一周 31/31 1/1 20/20
第三周 24/55 2/3 24/44 知道浮点数怎么储存的
第四周 177/328 2/5 17/61 现在我的C语言程序也会在Linux命令行下使用了:*)
第五周 54/382 2/7 18/79 复习一遍汇编语言

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

  • 计划学习时间:15小时

  • 实际学习时间:>=18小时

  • 改进情况:用电脑解决问题的时间延长。

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

参考资料

posted @ 2017-10-22 14:28  陆基神盾  阅读(185)  评论(0编辑  收藏  举报