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

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

学习目标

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

教材学习内容总结

本章概述:

本周学习了c提供的抽象层下面的东西,了解机器级编程。通过编译器产生机器级程序的汇编代码表示,我们了解了编译器和它的优化能力,还有一些机器、数据类型和指令集。机器级程序和它们的汇编代码表示与C程序的差别很大。程序是以指令序列来表示的,每条指令都完成一个单独的操作。编译器必须使用多条指令来产生和操作各种数据结构。
用字节代码作为程序的低级表示,优点是相同的代码可以在许多不同的机器上执行。

x86汇编,采用ATT汇编代码格式,讨论的是一个运行Linux的x86系统。使用gcc编译器,gdb调试器,objdump等相关工具观察反汇编代码。
关于寻址模式、堆栈、进制表示、CPU结构、系统的硬件组成等相关必需知识及概念,本文暂不涉及,相关必备基础请自行学习。
1、寄存器
寄存器用作处理器之内的本地数据存储区域,防止对数据进行待见巨大的内存访问。
x86平台寄存器分类:
通用寄存器(整数寄存器)
EAX 累加器,用于操作数和结果数据的累加
EBX 指向数据内存段中的数据的指针
ECX 计数器,字符串和循环操作的计数
EDX I/O指针
EDI 字符串操作的目标的数据指针
ESI 字符串操作的源的数据指针
ESP 栈指针(指向栈顶位置)
EBP 基指针(指向栈底位置)
段寄存器
CS 代码段寄存器
DS 数据段寄存器
SS 堆栈段寄存器
ES 附加段指针,用于指向数据段,分隔数据元素,确保不会重叠
FS 同上
GS 同上
指令指针寄存器
EIP寄存器,也称程序计数器(Program Counter),存储下一条指令的地址,在分段内存模式下使用cs:eip确定下一条指令的实际地址
浮点寄存器
控制寄存器
CR0 控制操作模式和处理器状态的系统标志
CR1 目前未用到
CR2 内存页面错误信息
CR3 内存页面目录信息
CR4 支持处理器特性和说明处理器特性能力的标志
调试寄存器
2、ATT汇编代码格式
2.1、数据格式
相关术语:16位数据类型用字表示,32位数据用双字表示,64位数据用四字表示。
数据类型与汇编代码后缀见下表:
2.2、操作数指示符
几乎每一条完整的指令都是有指令+操作数构成,操作数指出指令要引用的源数据值,以及放置结果的目标位置。
常见的操作数分类:
立即数(常数值) $后跟整数表示,例如$0x34
寄存器 表示某个寄存器的内容,%后跟寄存器表示例如%eax
存储器引用 根据相应的寻址模式,计算出有效地址来访问某个存储器位置。例如:-12(%ebp)表示根据基址+偏移量寻址
2.3、常见的指令
数据传送指令mov,push,pop,movs,movz
movb movw movl  传送字节,字,双字
pushl 将栈中的值弹出
popl 将值压入栈
movsbw movsbl movswl 将符号扩展的字节传送到字,双字;将符号扩展的字传送到双字
movzbw movzbl movzwl 将零扩展的字节传送到字,双字;将零扩展的字传送到双字
算数和逻辑指令
2.4、一些常见指令的说明:
leal(load effective address)加载有效地址,该指令将有效地址写入目的操作数,
call
leave
ret

     ISA(Instruction Set Architecture)指令集体系架构,是在最底层把硬件结构抽象出来供软件编程控制的,指令集解决了最基本的软件兼容性问题。指令集类型主要分为CISC和RISC两类,Intel的x86是很古老的CISC指令集,虽然有很多弊端但今天依然广泛使用;RISC类型的指令集主要有ARM、MIPS、Power等。
     每种广泛采用的指令集背后都有一个强大的生态系统,就像生物学里的生态系统一样,每个ISA生态系统都有清晰的食物链结构:PC和服务器领域是x86的地盘,x86生态系统占据食物链顶层的是Intel和微软;ARM生态圈主要分布在智能手机、平板电脑及嵌入式设备中,占据ARM食物链顶层的是高通、苹果和三星。
     指令集是也一道天然的壁垒,外面想进入、里面想出来都很难,因为它不仅仅是一类半导体芯片,它背后是一个庞大的生态系统,这个生态系统入驻的有编译器、操作系统、芯片方案、应用程序等等。
    很多时候指令集就是一个国家的IT战略根基,去年工信部召集国内半导体公司和科研机构召开了“中国国家指令集架构计划”的一次会议,打算统一国内的指令集架构。通过打造统一的CPU指令集架构,芯片设计、软件开发等便可以进行统一集中研发,这将降低研发成本,有利于国产CPU快速形成生态系统。我想既然如此,这个统一的指令集必然要求核心专利要在我们手中,最好是完全自主的指令集架构。但创造一个新的指令集生态系统却是一个漫长而艰难的工作。
   参考现有指令集架构(包括MIPS、SPARC、Alpha、ARM以及PowerPC)设计,虽然可以享受现成的软硬件生态系统资源,但从长远来看,由于没有核心专利,未来发展难免会被掣肘。比如去年MIPS被ARM和Imagination收购,对自主发展的龙芯来说未来增加许多变数,至少能明显让我们感觉到危机:外国公司占领了专利制高点永远是规则的制定者,而自主CPU企业只是普通的授权IC设计公司,发展也是在繁荣别人的生态圈,这也警示我们没有指令集架构的核心专利,未来发展只能被别人左右。

对栈的概念参考:https://blog.csdn.net/small_prince_/article/details/80682110

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

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

课后作业中的问题和解决过程

本周代码托管截图

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

  • 本周主要学习了信息的表示和处理,主要是C语言的数据表示和处理,数据存储和处理这些知识比较抽象,理解比较困难,只有通过例子或者题目才能更好地理解
posted @ 2019-12-16 21:33  20175327Fkn  阅读(131)  评论(0编辑  收藏  举报