精华内容
下载资源
问答
  • 深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)
    万次阅读 多人点赞
    2016-02-09 16:12:56

    cpu的保护模式由来

    分段机制


    8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8。同时,8086的诞生也是处理器内存寻址技术的第一次飞跃。

    对于一根实际的、实实在在的、物理的、可看得见、摸得着的内存条而言,处理器把它当做8位一个字节的序列来管理和存取,每一个内存字节都有一个对应的地址,我们叫它物理地址,用地址可以表示的长度叫做寻址空间。而CPU是如何去访问内存单元里的数据的方式就叫做寻址。

    8086得CPU在内存寻址方面第一次引入了一个非常重要的概念—-。在8086之前都是4位机和8位机的天下,那是并没有段的概念。当程序要访问内存时都是要给出内存的实际物理地址,这样在程序源代码中就会出现很多硬编码的物理地址。这样的程序可想而知,难重定位,可控性弱,结构丑陋,那个年代写这样的程序在我们现在看来是多么让人恼火的一件事儿。

    8080问世后四年也就是1978年,Intel开始设计16位CPU,正常来说8086的寻址空间应该是 216=64KB 才对,但Intel就偏偏不这干,8086的目标寻址空间直指1M,也就是说8086的地址总线位宽要达到20位。如何让16位的内部寄存器对20位的外部地址空间进行寻址,Intel的工程师们从当时的PDP-11小型机身上找到了灵感。PDP-11是美国迪吉多电脑(Digital Equipment Corp.)公司于1970到1980年代热销的16位迷你电脑,PDP-11的内存管理单元(MMU)可以将16位地址映射到24位地址空间里(至于人家是怎么弄,我就真不晓得了)。

    为了支持分段机制,Intel在8086的CPU里新增了4个寄存器,分别是代码段CS,数据段DS,堆栈段SS和其他ES。这样一来,一个物理地址就由两个部分组成,分别是“段地址”:“段内偏移量”。

    例如,ES=0x1000,DI=0xFFFF,那么这个数据ES:DI在内存里的绝对物理地址就是:
    AD(Absolute Address)=(ES)*(0x10)+(DI)=0x1FFFF
    就是讲段基地址左移4位然后加上段内偏移量就得到了物理内存里的绝对地址,经过这么一个变换,就可以得到一个20位的地址,8086就可以对20位的1M内存空间进行寻址了。

    很明显,这种方式可以寻址的最高地址为0xFFFF:0xFFFF,其地址空间为0x00000~0x10FFEF,因为8086的地址总线是20位,最大只能访问到1MB的物理地址空间,即物理地址空间是0x00000~0xFFFFF。当程序访问0x100000~0x10FFEF这一段地址时,因为其逻辑上是正常的,CPU并不会认为其访问越界而产生异常,但这段地址确实没有实际的物理地址与其对应,怎么办?此时CPU采取的策略是,对于这部分超出1M地址空间的部分,自动将其从物理0地址处开始映射。也就是说,系统计算实际物理地址时是按照对1M求模运算的方式进行的,在有些技术文献里你会看到这种技术被称之为wrap-around。

    根据前面的讲解我们可以发现段基址有个特征,其低4位全为0,也就是说每个段的起始地址一定是16的整数倍,这是分段的一个基本原则。这样每个段的最小长度是16字节,而最大长度只能是64KB。这里我们可以计算一下,1MB的物理地址空间能划分成多少个段。

    如果每个段的长度为16字节,这样1MB物理地址空间最多可以划分成64K个段;

    如果每个段的长度为64KB,那么1MB的物理地址空间最多能划分成16个段。

    8086这种分段基址虽然实现了寻址空间的提升,但是也带来一些问题

    1、同一个物理地址可以有多种表示方法。例如0x01C0:0x0000和0x0000:0x1C00所表示的物理地址都是0x01C00。

    2、地址空间缺乏保护机制。对于每一个由段寄存器的内容确定的“基地址”,一个进程总是能够访问从此开始64KB的连续地址空间,而无法加以限制。另一方面,可以用来改变段寄存器内容的指令也不是什么“特权指令”,也就是说,通过改变段寄存器的内容,一个进程可以随心所欲地访问内存中的任何一个单元,而丝毫不受限制。不能对一个进程的内存访问加以限制,也就谈不上对其他进程以及系统本身的保护。与此相应,一个CPU如果缺乏对内存访问的限制,或者说保护,就谈不上什么内存管理,也就谈不上是现代意义上的中央处理器。

    总结一下:8086和后来的80186,这种只能访问1MB地址空间的工作模式,我们将其称之为“实模式”。我的理解就是“实际地址模式”,因为通过段基址和段偏移算出来的地址,经过模1MB之后得出来的地址都是实际内存的物理地址。

    保护机制


    为了支持多任务,对各任务实施保护是必须的。

    由于8086的上述问题,1982年,Intel在80286的CPU里,首次引入的地址保护的概念。也就是说80286的CPU能够对内存及一些其他外围设备做硬件级的保护设置(实质上就是屏蔽一些地址的访问)。自从最初的x86微处理器规格以后,它对程序开发完全向下兼容,80286芯片被制作成启动时继承了以前版本芯片的特性,工作在实模式下,在这种模式下实际上是关闭了新的保护功能特性,因此能使以往的软件继续工作在新的芯片下。后续的x86处理器都是在计算机加电启动时都是工作在实模式下。

    也就是说,在保护模式下,程序不能再随意的访问物理内存了,有些内存地址CPU做了明确的保护限制。保护机制能有效的实现不同任务之间和同一任务内的保护。

    1985年80386的问世,使Intel完成了从16位到32位CPU的飞跃,这中间80286毫无疑问的就成了这次飞跃的跳板。80286的地址线已经达到24位,可寻址空间是16MB,但Intel当初设计80286时提出的目标是向下兼容,这也是Intel一贯的作风,正是这种作风为Intel后面设计80386时增添了几根儿烦恼丝。所以,在“实模式”下,80286所表现的行为和8086所表现的完全一样。

    80386是32位CPU,也就是说它的ALU数据总线是32位,地址总线的位宽和CPU内部数据总线的位宽是一致的,都是32位,其寻址范围可达4GB。如果重新设计80386的架构,其结构应该相当简洁才对。但是80386却很遗憾的无法做到这一点,作为一个产品系列中的成员分子,80386必须继续维持“前辈”们的那些段寄存器,必须支持实模式,同时还要支持保护模式。可以看得出来,80386其实也不容易。

    所以,Intel决定在80386的段寄存器(CS,DS,SS,ES)的基础上构筑保护模式,并且继续保留段寄存器为16位,同时又增添了两个段寄存器FS和GS。显然,为了实现保护模式,光是用段寄存器来确定一个基地址是不够的,至少还要有一个地址段的长度,并且还需要一些诸如访问权限之类的其他信息。所以,这里需要的是一个数据结构(这个数据结构就叫做“段描述符”,以后会看到),而并非一个单纯的基地址。

    对此, Intel设计人员的基本思路是:

    在保护模式下改变段寄存器的功能,使其从一个单纯的段基址变成指向一个“段描述符”的指针。因此,当一个访存指令发出一个内存地址时, CPU按照下面过程实现从指令中的32位逻辑地址到32位线性地址,再到物理地址的转换:
    1、首先根据指令的性质来确定该使用哪一个段寄存器,例如操作指令中的地址在代码段CS里,而数据指令中的地址在数据段DS里。这一点与实地址模式相同。
    2、根据段寄存器里的内容,找到相应的“段描述符”结构。
    3、然后,从“段描述符”里得到的才是段基址。
    4、将指令中的地址作为偏移量,然后和段描述符结构中规定的段长度进行比较,看齐是否越界。
    5、根据指令的性质和段描述符中的访问权限来确定当前指令操作是否越权。
    6、最后才将指令中的地址作为偏移量,与段基址相加得到线性地址,或者叫虚拟地址。
    7、最后根据线性地址算出实际的物理地址。

    所以,实模式就是8086及其之前的CPU只能寻址1MB物理地址空间,且寻到的就是实实在在的物理地址的模式,用户程序想干啥干啥,无法无天;而保护模式,就是说用户层的程序,某些地址你是不能访问的,或者说是有限制性的访问,且你访问到的地址不再是物理地址了,而是一个虚拟的地址。这个虚拟地址要经过一系列算法处理,最终映射到实际物理地址单元里去。

    现在运行在X86CPU上的主流操作系统,如Linux,FreeBSD,Windows95以后的版本以及MAC OS X等都是工作在保护模式下。一般情况下,处理器只有在上电启动,引导阶段,初始化系统时才会进入实模式,当实模式阶段的任务完成后,它就切换到了保护模式。当切换到保护模式后就很难再回到实模式了,几乎不可能。

    • 1 为什么要有cpu的保护模式?

        我非常总结的说一下。保护模式主要目的保护多任务之间代码访问的完全隔离(使用虚拟地址),单任务的用户代码和系统代码的访问格式(使用cpu的privilege环)。当然虚拟地址也给内存管理带来了其他的好处,更细节的看下面的文章转载

    • 2 为什么一定要从实模式切换到保护模式,而不是开机就是保护模式?

        最主要的原因是:兼容以前的软件,不兼容以前的软件就会失去市场,所以intel处理器发展到今天回如此的复杂。

    不同任务之间的保护


    保护的一个重要方面是应用程序之间的保护。虚拟地址到物理地址的映射函数在每个任务中进行定义,随着任务切换,映射函数也切换。任务A的虚拟地址空间映射到物理地址空间的某个区域,而任务B的虚拟地址空间映射到物理地址空间的另外区域,彼此独立,互不相干。因此,两个不同的任务,尽管虚拟存储单元地址相同,但实际的物理存储单元地址可以不同。

    每个任务各有一组独立的映射表,即具有不同的地址转换函数。在x86上, 每个任务都有自己的段表及页表。当处理器进行切换并执行新的任务时,这种任务切换的一个重要部分,就是为新任务切换任务的转换表。为了使操作系统与所有的 应用程序相隔离,可以把操作系统存储在一个单一的任务中。然而,我们即将看到,在一个任务内操作的保护机制,更适合于保护操作系统,使其不被应用程序破 坏。这种机制,使操作系统由所有任务共享,并且可在每一任务中对其进行访问,而且仍然保护了操作系统,使其不被应用程序破坏。这种保护操作系统的方法,是 把操作系统存储在虚拟地址空间的一个公共区域,然后,再使每一任务按此区域分配一个同样的虚拟地址空间,并进行同样的虚拟–物理地址映射。各个任务公用的这部分虚拟地址空间,被称为全局地址空间。

    仅由一个任务占有的虚拟地址空间部分,即不被任何其它任务共享的虚拟地址部分,称为局部地址空间。局部地址空间包含的代码和数据,是任务私有的,需要与系统中的其它任务相隔离。

    每个任务中有不同的局部地址空间。因此,两个不同的任务中,对同一虚拟地址的访问,实际上转换为不同的物理地址。这就使操作系统对每个任务的存储器,可以赋予相同的虚拟地址,仍然保证任务的隔离。另一方面,对全局地址空间中同一虚拟地址的访问,在所有任务中都转换为同样的物理地址,从而支持公共的代码及数据的共享,例如对操作系统的共享。

    因此两个不同的任务,尽管虚拟地址单元相同,但是实际的物理存储单元地址可以不同。

    同一任务内的保护


    在一个任务之内,定义有四种执行特权级别,用于限制对任务中的段进行访问。按照包含在段中的数据的重要性和代码的可信程度,给段指定特权级别。把最高的特 权级别分配给最重要的数据段和最可信任的代码段。

    具有最高特权级别的数据,只能由最可信任的代码访问。给不重要的数据段和一般代码段分配较低的特权级别。 具有最低特权级别的数据,可被具有任何特权级别的代码访问。

    特权级别用数字0、1、2和3表示,数字0表示最高特权级别,而数字3表示最低特权级别,即数字较大的级别具有较低的特权。为了避免模糊和混淆,在比较特权级别时,不使用“大于”或“小于”这样的术语,而使用“里面”或“内层”这样的术语表示较高特权级,级别的数字较小;使用“外面”或“外层”这样的术语表示较低特权级别,级别的数字较大。0级为最内层的特权级别,3级为最外层的特权级别。

    特权级(Ring)也叫(hierarchical protection domains),有的也称为用户态(user mode)。它是一种机制来保护数据和阻止恶意行为(确保计算机安全)。电脑操作系统提供不同权限访问级别的资源。特权级分为4级,特权级0、1、2、3。

    CS代码段寄存器,一般用于存放代码,它就含有一个特殊的两位字段,用以标识CPU当前的特权级别(CurrentPrivilegeLevel,CPL),值为0代表最高优先级,值为3代表最低优先级。在linux和windows均只使用特权级0和特权级3。分别称为内核态和用户态。

    特权最高的一般是特权级0,可以直接操作硬件,如CPU和内存。

    一般操作系统和驱动运行在此级别下。特权级3是给一般的程序使用的,可以调用基本的CPU指令。在特权级三无法调用特权级0的指令,如果调用则显示为非法指令。
    引用特权级的概念是为了保护计算机,一些危险指令只有操作系统可以执行,防止普通程序滥用其他程序的资源。如间谍软件要想开启摄像头就必须向特权级0的驱动程序请求开启,否则就不允许。

    每一特权级都有各自独立的程序堆栈,以避免与共享栈区有关的保护问题。当一个程序从一个特权级切换到另一个特权级执行时,程序使用的堆栈,从原特权级的栈段改变为新特权级的栈段。对于堆栈段寄存器 SS来说,描述符特权级(DPL)必须等于当前代码段的特权级(CPL)。从一个特权级切换到另一特权级的方法将在控制转移方法一文中描述。

    每个存储器段都与一个特权级别相联系。特权级别限制是指,只有足够级别的程序,才可对相应的段进行访问。在任何时候,一个任务总是在四个特权级之一下运行,任务在特定时刻的特权级称为当前特权级 (Current Privilege level),标记为CPL,即当前运行程序的特权级。每当一个程序试图访问一个段时,就把CPL与要访问的段的特权级进行比较,以决定是否允许这一访问。对给定CPL执行的程序,允许访问同一级别或外层级别的数据段。

    虽然应用程序都在最外层,但由于各个不同的应用程序存储在不同的虚拟地址空间中,所以各应用程序被隔离保护。

    实模式


    实模式(即实地址访问模式)它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式。

    实模式被特殊定义为20位地址内存可访问空间上,这就意味着它的容量是2的20次幂(1M)的可访问内存空间(物理内存和BIOS-ROM),软件可通过这些地址直接访问BIOS程序和外围硬件。

    实模式下处理器没有硬件级的内存保护概念和多道任务的工作模式。但是为了向下兼容,所以80286及以后的x86系列兼容处理器仍然是开机启动时工作在实模式下。8086和早期的处理器仅有一种操作模式,就是后来我们所定义的实模式。实模式虽然能访问到1M的地址空间,但是由于BIOS的映射作用(即BIOS占用了部分空间地址资源),所以真正能使用的物理内存空间(内存条),也就是在640k到924k之间。1M地址空间组成是由16位的段地址和16位的段内偏移地址组成的。

    用公式表示为:物理地址=左移4位的段地址+偏移地址

    保护模式


    286处理器体系结构引入了地址保护模式的概念,处理器能够对内存及一些其他外围设备做硬件级的保护设置(保护设置实质上就是屏蔽一些地址的访问)。使用这些新的特性,然而必不可少一些额外的在8086及以前处理器没有的操作规程。

    自从最初的x86微处理器规格以后,它对程序开发完全向下兼容,80286芯片被制作成启动时继承了以前版本芯片的特性,工作在实模式下,在这种模式下实际上是关闭了新的保护功能特性,因此能使以往的软件继续工作在新的芯片下。直到今天,甚至最新的x86处理器都是在计算机加电启动时都是工作在实模式下,它能运行为以前处理器芯片写的程序.

    实模式和保护模式的区别


    寻址方式


    从表面上看,保护模式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱动来处理硬件,但二者有很多不同之处。

    我们知道,在实模式中内存被划分成段,每个段的大小为64KB,而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、 SS和ES)的内容形成了物理地址的一部分。具体来说,最终的物理地址是由16位的段地址和16位的段内偏移地址组成的。

    用公式表示为:物理地址=左移4位的段地址+偏移地址。

    在保护模式下,段是通过一系列被称之为“描述符表”的表所定义的。段寄存器存储的是指向这些表的指针。

    用于定义内存段的表有两种:全局描述符表(GDT) 和局部描述符表(LDT)。

    GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。在实模式中,段长是固定的(为64KB),而在保护模式中,段长是可变的,其最大可达4GB。

    LDT也是段描述符的一个数组。与GDT不同,LDT是一个段,其中存放的是局部的、不需要全局共享的段描述符。

    每一个操作系统都必须定义一个GDT,而每一个正在运行的任务都会有一个相应的LDT。

    每一个描述符的长度是8个字节。当段寄存器被加载的时候,段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中,以便下一次同一个段可以使用该信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址组成。

    程序的运行方式


    程序运行的实质是什么?其实很简单,就是指令的执行,显然CPU是指令得以执行的硬件保障,那么CPU如何知道指令在什么地方呢?

    对了,80x86系列是使用CS寄存器配合IP寄存器来通知CPU指令在内存中的位置.

    程序指令在执行过程中一般还需要有各种数据,80x86系列有DS、ES、FS、GS、SS等用于指示不同用途的数据段在内存中的位置。程序可能需要调用系统的服务子程序,80x86系列使用中断机制来实现系统服务。

    总的来说,这些就是实模式下一个程序运行所需的主要内容(其它如跳转、返回、端口操作等相对来说比较次要。)

    无论实模式还是保护模式,根本的问题还是程序如何在其中运行。因此我们在学习保护模式时应该时刻围绕这个问题来思考。和实模式下一样,保护模式下程序运行的实质仍是“CPU执行指令,操作相关数据”,因此实模式下的各种代码段、数据段、堆栈段、中断服务程序仍然存在,且功能、作用不变。

    那么保护模式下最大的变化是什么呢?答案可能因人而异,我的
    答案是“地址转换方式”变化最大。

    地址转换方式


    先看一下实模式下的地址转换方式,假设我们在ES中存入0x1000,DI中存入0xFFFF,那么ES:DI=0x1000*0x10+0xFFFF=0x1FFFF,这就是众所周知的“左移4位加偏移”。

    那么如果在保护模式下呢?假设上面的数据不变ES=0x1000,DI=0xFFFF,现在ES:DI等于什么呢?
    公式如下:(注:0x1000=1000000000000b= 10 0000 0000 0 00)

    ES:DI=全局描述符表中第0x200项描述符给出的段基址+0xFFFF

    现在比较一下,好象是不一样。再仔细看看,又好象没什么区别!
    为什么说没什么区别,因为我的想法是,既然ES中的内容都不是真正的段地址,凭什么实模式下称ES为“段寄存器”,而到了保护模式就说是“选择子”?

    其实它们都是一种映射,只是映射规则不同而已:在实模式下这个“地址转换方式”是直接“左移4位”;在保护模式下是“查全局/局部描述表”得到段值。

    前者是系统定义的映射方式,后者是用户自定义的转换方式。而它影响的都是“shadow register”

    从函数的观点来看,前者是表达式函数,后者是列举式函数:
    实模式: F(es–>segment)={segment |segment=es*0x10}
    保护模式:F(es–>segment)={segment |(es,segment)∈GDT/LDT}
    其中GDT、LDT分别表示全局描述符表和局部描述符表。

    更多相关内容
  • 建立计算机信息的系统安全机制分析论文 摘要硬件软件和数据等这些组成计算机信息系统的部分受到相应的保护不会因为恶意的破坏泄露重要的隐私...关键词计算机信息系统安全机制计算机系统的基本论述 一定义 以计算机系
  • 区块链交易数据隐私保护机制

    千次阅读 2018-05-02 11:09:27
    区块链交易数据隐私保护机制祝烈煌,董慧,沈蒙北京理工大学计算机学院,北京 100081摘要:区块链技术是一种去中心化、去信任化、公开透明的分布式数据存储技术,能够降低信任...

    区块链交易数据隐私保护机制

    祝烈煌,董慧,沈蒙

    北京理工大学计算机学院,北京 100081

    摘要:区块链技术是一种去中心化、去信任化、公开透明的分布式数据存储技术,能够降低信任成本,实现安全可靠的数据交互。然而,攻击者可以轻易地从公开的全局账本中获得所有数据,并通过大数据分析技术挖掘用户交易规律等隐私信息。分析区块链交易数据面临的隐私泄露威胁,描述基于数据分析的攻击方法;介绍以混币机制为代表的交易数据隐私保护机制,简要描述各种混币方法的基本原理,并针对混币过程是否需要中心节点参与的问题分析不同混币机制的优势与缺陷;最后,分析了现有区块链数据隐私保护技术中存在的不足,并展望未来的发展方向。

    关键词:区块链;混币机制;数据隐私保护

    doi:10.11959/j.issn.2096-0271.2018005

    640?wx_fmt=jpeg

    论文引用格式:祝烈煌, 董慧, 沈蒙. 区块链交易数据隐私保护机制[J]. 大数据, 2018, 4(1): 46-56.

    ZHU L H, DONG H, SHEN M. Privacy protection mechanism for blockchain transaction data[J]. Big Data Research, 2018, 4(1): 46-56.

    640?wx_fmt=jpeg

    1  引言

    区块链技术是一种分布式的互联网数据库技术,它的去中心化、去信任化、公开透明等特点使陌生节点之间可以在不依赖于第三方可信机构的情况下建立起点对点的可信价值传递,主要优势在于能够显著降低信任成本、提升交互效率。区块链网络中没有中心服务器,系统中的每个参与节点都持有完整的数据副本,它们共同维护着数据的完整性,能够有效避免集中式服务器单点崩溃和数据泄露的风险。

    然而,区块链中记录交易数据的全局账本在网络中是公开的,任意攻击者都能够获取所有交易信息,使交易者的隐私有泄露的风险。例如,比特币系统目前的交易数据大约为155 GB,包含从2009年开始运行到当前时刻的所有交易记录。对账本中的数据进行分析整理,攻击者可以获得任意一个账户对应的所有交易,还可以分析不同账户之间的交易关系图谱,即使用户采用不同的账户进行交易,攻击者也可以利用地址聚类技术分析出隶属于同一个用户的不同账户[1-5]。而且由于用户进行的每一笔比特币交易都将永久记录在区块链中,一旦某一笔历史交易被实名化(例如比特币交易所受到黑客攻击,导致用户账户信息泄露),则相关的所有交易记录中的交易者身份信息都将泄露。此外,随着区块链交易逐渐被应用到日常支付领域,攻击者可以利用链外信息推测区块链中账户的身份。例如,将用户的购物记录和比特币账户支付记录进行对比,分析账户的身份信息。

    针对基于数据分析的隐私窃取方法,目前已出现一些隐私保护机制。主要思想是在不影响区块链系统正常工作的情况下,对公开数据中的部分信息进行隐藏,增加数据分析的难度。其中,混币是一种应用广泛的隐私保护方法。混币机制的核心思想是隐藏区块链交易双方的交易过程,使攻击者无法准确分析出不同地址之间的关联关系,从而将交易者的交易关系分散在相互无关联的地址中,增加分析交易者身份的难度。目前的混币机制主要分为中心化的混币机制和去中心化的混币机制,在执行效率、混币效果、混币费用等指标上还有提升空间,并存在拒绝服务攻击、混币过程泄密等安全问题。

    混币机制能够模糊区块链交易中付款人和收款人的关系,增加攻击者通过公开账本分析用户交易规律的难度,是一种提升区块链隐私保护能力的有效机制。通过研究混币机制的原理,分析不同混币机制存在的优势和缺陷,有利于设计出性能更优的混币机制,同时为不同场景下混币机制的选择提供评价依据。

    2  相关知识

    2.1  区块链技术概述

    区块链是诞生于比特币的底层技术,最早的定义来自于中本聪在2008年发表的文章,近年来在不断的延伸与扩展中发生了很多改变,逐渐形成了新型技术体系,且仍然在不断发展演变。通常认为区块链系统的基础架构可以按照数据层、网络层、共识层、激励层、合约层和应用层进行划分,但是随着区块链技术的发展,很多传统的模块被弱化,甚至不存在意义,例如在联盟链和私有链技术中已经不需要激励层。通过分析区块链的核心技术与发展趋势,可以将区块链技术的基础架构简化为3个层次,即网络层、交易层和应用层。网络层负责区块链网络的建立和各个节点之间的信息转发。交易层负责交易数据的创建、验证和存储,应用层负责提供多样化的应用服务。

    其中,区块链的核心业务是在交易层中实现的,即两个“地址”之间以交易的形式进行 可靠、具有公信力的数据传递。交易层的主要内容包括地址格式、交易格式、全局账本和共识机制。

    区块链中的“地址”是用户为了隐藏真实身份而使用的假名,可以使用公钥并经过加密算法(例如ECC)得到。在加密算法中,公钥用于生成交易的输入地址与输出地址,私钥信息由用户自己保存,用于生成支付比特币时所必需的证明资金所有权的签名。

    区块链中的“交易”对用户之间数据交互的过程进行记录,并发布于区块链网络。交易中包含输入地址、输出地址和交易内容等信息。交易内容在数字货币中代表交易的金额,在其他应用中,可能代表一个字符串或者一个证书ID。在区块链数字货币应用中,为了保证交易的可靠性,支付方必须有足够的资金进行支付,区块链交易中将采用特殊设计确保输入资金大于输出资金。例如,比特币中输入地址不仅包含付款方的账户信息,还包含此项输入资金的来源信息和签名信息,验证方可以根据输入地址信息找到资金源头,并利用签名验证发送方是否有指定资金的所有权。

    全局账本是区块链的数据存储结构,用于存储所有的交易记录、合约以及相关的参数信息。全局账本通常由“区块”构成,交易信息按照一定顺序存储在区块中,同时保存这些交易的散列值、时间戳等参数,每个区块中可以存储的交易信息是有限的。区块之间按照时间关系通过区块散列连接。全局账本在系统中不是集中存储的,所有参与节点都各自维护一个本地的全局账本,邻居节点之间通过定期的信息交换使全局账本保持同步。

    区块链技术的共识机制可以保证区块链网络中事务的顺序在所有节点上保持一致。常见的共识机制包括工作证明(proof of work,POW)机制[6]、股权证明(proof of stake,POS)机制、拜占庭容错(PBFT)机制[7]等。共识机制的目的是使分布式的节点能够按照统一的规则验证交易合法性,并选出相同的一组交易作为下一个区块的数据。例如,POW机制的基本工作原理是众多竞争节点通过解决一个数学难题竞争记账权,只有被证明付出了最大工作量的节点才可以当选为记账节点,该节点有权在区块链上记录新的交易,生成新的区块。其他节点会以很小的计算代价验证此区块上的所有交易,合法的区块将被所有节点同步。通过这种机制,能够保证分布式节点中的全局账本是相同的,而且全局账本中的每一笔交易都要经过大多数节点的认可,具有较高的公信力。

    2.2  区块链交易面临的隐私泄露威胁

    根据区块链技术的特点,可以分析出区块链交易具有以下特征。

    ● 区块链交易中包含输入地址和输出地址信息,而且每一个输入地址都指向前一笔交易,即所有输入资金都能够追溯到源头。

    ● 区块链交易存储在公开的全局账本中,任意参与用户都可以获得完整的全局账本。而且由于在共识过程验证节点需要检索历史交易,因此所有的交易信息不能直接采用加密等手段保护数据。

    这些特征导致区块链交易数据面临隐私泄露威胁。以比特币为例,比特币交易中的地址都是由用户自行创建且与身份信息无关的,任何人无法直接通过观察交易记录推测出交易中用户的身份信息。但是全局账本公开的交易之间存在关联关系,潜在攻击者有可能通过分析全局账本中的交易记录推测出比特币地址的交易规律,包括地址的交易频率、交易特征、地址之间的关联关系等。基于这些规律,攻击者有可能将匿名比特币地址和特定用户相关联。

    目前已经有许多研究通过分析区块链交易推测区块链用户的隐私信息。根据分析目的的不同,可以将这些研究分为以下两类。

    第一类研究主要通过分析地址相关的交易记录,获得该地址交易的规律特征,据此推测对应用户的身份信息。由于在某一特定类型的区块链交易中会存在它特有的交易特征,攻击者可以根据地址的交易特征,对其交易发生的真实场景进行还原,从而做出用户真实身份的推测。Androulaki E等人[8]设计了一个匹配区块链地址与学生身份的模拟实验,学生以比特币作为日常交易的支付手段,并使用比特币推荐的一次性地址方法加强隐私保护,分析人员通过基于行为的聚类技术,能够以42%的准确率将学生身份和区块链地址成功匹配。Monaco J V[9]将比特币用户的交易行为进行量化,以交易时间间隔、资金流向等12项参数为依据分析用户的交易规律,经过6个月实验得到的大量数据表明,利用这种分析模型成功识别用户真实身份的精度高达62%,错误率低于10.1%。

    第二类研究主要利用区块链交易设计中存在的一些潜在知识,实现对不同地址的聚类,得到同一个用户的多个地址。针对地址聚类目前主要有以下3条聚类规则。

    ● 对于一个具有多输入地址的交易,通常认为所有的输入地址都来自同一个用户个体或用户的集合。当用户发起一次交易时,资金可能来自于用户的多个地址,而多输入交易中用户需要对每个输入地址单独进行签名,因此大多数多输入交易的输入地址来自同一个用户。这项规则已经应用于很多研究中[1-3],取得了很好的聚类效果。

    ● 同一个Coinbase交易中的多个输出地址属于同一个用户集合。随着“挖矿”难度的增加,个体“矿工”已经无法在竞争中获胜,需要成百上千的“矿工”加入“矿池”共同完成一次“挖矿”,得到的奖励会分配给参与集体“挖矿”的“矿工”。Coinbase交易表示将奖励发送给“矿工”的过程。

    ● 交易中找零地址和输入地址隶属于同一个用户。在一次交易中,输入地址中的总金额可能会大于用户发出的金额,因此比特币系统会为发送方自动产生一个找零地址,用于接收交易中的找零资金。找零地址与其他地址一样都有可能被系统选择成为新的交易中的输入地址,但作为输出地址的情况一般只会出现一次。由于找零地址在交易发生时是由系统重新生成的,因此一个地址不可能同时作为一次交易的输入地址和输出地址,交易的输出中也必然存在找零地址以外的输出地址。利用找零地址的这些特征,可以发现更多地址之间的关联关系。

    目前已经有很多研究利用上述聚类规则,发现了比特币系统中很多地址之间的关联性。Meiklejohn S等人[4]通过使用启发式聚类方法实现了对比特币盗窃案件中相关比特币地址的识别。Zhao C[5]完成了一个全面的聚类过程,根据比特币全局账本中的全部交易数据,将35 587 286个比特币地址划分为13 062 822个用户的地址集合。

    3  混币机制

    完全公开的交易存储机制使区块链交易存在隐私泄露风险,因此有必要在区块链系统中采用相应的隐私保护机制,在满足区块链共识机制的条件下,尽可能隐藏数据信息和数据背后的知识。在现有的研究中,一种广泛应用的方法是在不改变交易结果的前提下改变交易过程,使攻击者无法直接获得交易的完整信息,这种方法被称为“混币”。Chaum D[10]的文章提出了一种匿名通信技术,在通信过程中隐藏了真实的通信内容,基本思想可以通过式(1)表达:

    CM(Z1,CA(Z0,m),A)→CA(Z0,m),A (1)

    式(1)左侧为发送方发给中间人的信息,右侧为中间人将信息处理后发送给接收方的消息。发送方想要将消息Z0和m发送给接收方的地址A,首先使用接收方的密钥CA对消息进行加密得到CA(Z0,m),然后将中间人的验证消息Z1、加密后的消息CA(Z0,m)和接收方地址A进行打包,并使用中间人的公钥CM进行加密,防止信息在发送过程中被攻击者截获或篡改。中间人收到信息后使用自己的私钥进行解密,得到Z1,CA(Z0,m),A,但无法解密CA(Z0,m)的内容。中间人在验证Z1无误后,将CA(Z0,m)发送给地址A。接收方使用自己的私钥解密消息,完成此次通信。

    利用这种方法,消息没有在发送者和接收者之间直接传递,而是通过中间人间接传递,使攻击者无法观察到真实发送者和接收者之间的通信行为,提高了通信的匿名性。若将消息通过多个中间人进行传递,攻击者发现双方通信关系的难度将大大增加。

    数字货币中的混币机制借鉴了上述思想,通过中间人对资金进行中转,使攻击者无法直接发现交易中真实的发送方和接收方。数字货币的混币机制原理如图1所示。假设A和A1是一个用户的两个数字货币地址,C是潜在攻击者,能观察到发生的所有交易。用户希望使用地址A向地址A1转账,但是不希望潜在攻击者发现这次交易。通过采用混币机制,攻击者C无法直接观察到从A到A1的交易过程,从而不会发现A和A1的关联。

    640?wx_fmt=jpeg

    图1 混币机制原理

    混币过程的执行可以由可信的第三方或某种协议实现。根据混币过程中有无第三方节点参与,将现有的混币机制分为两类:基于中心节点的混币机制和去中心化的混币机制。这两种机制在混币可靠性、混币效率和混币成本等方面各有优势和缺陷,本文将分别介绍两类混币机制的原理和特点。

    4  基于中心节点的混币机制

    基于中心节点的混币机制中,混币过程由第三方节点集中执行,因此也可以称为中心化混币方案。参与混币的用户首先将资金发送给第三方节点,第三方节点收到多个混币用户发来的资金后进行一系列资金分配,最终将指定金额的资金分别转移给指定的收款地址。由于资金没有直接在发送方和接收方之间传递,而是经过第三方节点的处理,对资金流向进行了干扰,因此攻击者很难发现参与用户的资金流向。

    基于中心节点的混币方法原理如图2所示。用户希望使用地址A向地址A1转账,但为了防止潜在攻击者C直接发现A和A1的关系,可以首先使用地址A向第三方地址D转账,D在一段时间后向用户指定的地址A1转账,最终实现资金在A和A1之间的转移。在一定时间内,第三方节点可能完成了多个用户的混币过程,这在一定程度上隐藏了A和A1的关系,使得攻击者无法在A1、E1、F1中找到与A具有关联关系的地址。但是通过综合分析A、D、A1三者在一段时间内的交易过程,攻击者有一定概率猜测出A和A1是一次真实交易的发送方与接收方。例如,在一定时间内D有n个输出,则攻击者找到正确交易链路的概率是1/n。

    640?wx_fmt=jpeg

    图2 基于中心节点的混币机制原理

    为了防止潜在攻击者推测出混币过程隐藏的交易关系,第三方节点在执行混币机制时需要遵循一定的限制条件,具体如下。

    ● A向D转账和D向A1转账这两笔交易之间需要存在一定时间间隔t。否则,攻击者可以根据时间关系推测出真实的交易关系。

    ● 在时间间隔t以内,D发出的交易数量n越多,混币的效果越好,因为这将减小推测成功的概率 1/n。

    ● 在一次混币过程中,各项真实交易的金额不能有明显区别。当第三方节点发出的交易中仅有一笔发送给A1的交易金额与A发出的金额相近,那么攻击者可以由此猜测出A-D-A1的交易链路。

    ● 第三方节点可以使用不同的地址作为转账的接收方和发送方,从而提升混币效果。如图3所示,第三方的地址D收到来自A的转账,然后通过地址E将资金转出。这种情况下,攻击者C在不知道D和D1关系的情况下,很难推测出A和A1的交易关系。

    640?wx_fmt=jpeg

    图3 第三方使用多地址的混币过程

    此类方法简单易行,不需要额外的技术改进,适用于比特币等各种数字货币。这种机制中,用户根据经验选择混币服务提供商,首先向混币服务商转移资金,并支付一定的服务费用,混币服务商收到后将资金转移给用户指定的地址。目前提供这种混币服务的网站有BitLaundry、Bitcoin Fog、Blockchain.info等。

    但是,使用这种方法完成混币的过程完全依赖于第三方节点,因此存在以下几点严重的缺陷。

    ● 额外收费和交易延迟。混币服务提供商通常会收取一定的混币费用,并且随着混币次数的增加,费用直线上升,混币时间也会增加。通常混币的时延为48 h,交易费用为1%~3%。

    ● 第三方可能偷窃资金。若在混币服务中不设置高效的监督机制,第三方节点有可能在收到用户资金后不执行约定的转账操作,偷窃用户资金,而用户无法追责。

    ● 第三方可能泄露混币过程。由于第三方节点掌握全部的混币过程,了解真实的交易内容,从而无法保证混币信息不被泄露。

    为了保证第三方节点的可信度, Bonneau J等人[11]提出一种改进的中心化混币方案——Mixcoin。通过设置审计功能,使用户有权公布签名数据,揭露第三方节点的违规行为,混币服务商将付出失去信誉的代价。但是该方案没有从根源上解除第三方对信息泄露的威胁。Valenta L等人 [12]在Mixcoin的基础上使用盲签名技术进一步优化,设计了Blindcoin方案,使第三方节点在正常提供混币服务的同时,无法得到所有交易中交易双方的真实信息,从而避免信息泄露的风险。但使用盲签名技术必然会增加混币过程中的计算量。ShenTu Q C等人[13]提出一种更加高效的盲签名混币方案,使用椭圆曲线加密算法提升计算效率。2015年上线运营的匿名数字货币达世币(Dash)是一款基于比特币技术,并以保护用户隐私为目的的数字货币。达世币中所有执行混币过程的中心节点都必须支付高额押金作为担保,否则无法获得提供混币服务的权利。这种方案通过加设第三方节点违规操作应付出的代价,保护混币用户的隐私及财产安全。

    中心化混币方案的本质是单纯地将一笔资金在多个地址中进行多次转移,实现简单,易于操作,混币过程不需要其他的技术支持,在区块链技术下的各类数字货币系统中具有极高的适用性。但是,现有的中心化混币方案普遍存在时延问题。大多数改进方案通过增加第三方违规的代价来防止盗窃和信息泄露的发生,不能从根本上杜绝违规行为的发生,采用盲签名等密码学技术的混币方案会增加计算代价,并且由第三方执行混币过程必然会带来额外的服务开 销。笔者从是否需要混币费用、是否存在盗窃风险等方面对现有的中心化混币机制特征作出对比分析,见表1。

    表1 基于中心节点混币机制特征对比640?wx_fmt=png

    5  去中心化的混币机制

    去中心化混币方案的混币过程通过混币协议实现,不需要第三方节点参与。最早的去中心化混币方案是由 Gregory Maxwell在比特币论坛上提出的CoinJoin机制。CoinJoin机制核心思想是通过将多个交易合并成一个交易的方法,隐藏交易双方输入输出的对应关系。如图4所示,当一笔交易中只有一个输入地址与一个输出地址时,攻击者可以直接观察到交易双方的关联关系,而在CoinJoin机制下,若干笔单输入—单输出交易被合并为一笔多输入—多输出交易,交易的双方由两个单独的地址变为两个地址的集合。对于一个多输入—多输出交易,潜在攻击者无法通过观察交易信息确认输入和输出之间的对应关系。一般情况下,CoinJoin机制需要第三方服务器撮合所有混币申请方进行签名。CoinJoin交易中,每个用户独立分散地完成签名,只有提供了所有签名并进行合并,交易才能被判定合法,并被网络接收。这种去中心化的混币机制免除了第三方服务提供者的参与,混币过程是在所有混币用户的共同参与下完成的,从而有效避免了第三方盗窃与泄露混币信息的风险。CoinJoin是去中心化混币机制的基础,其思想被运用在多种匿名比特币协议中,例如Dark Wallet、CoinShuffle和 Join Market。

    640?wx_fmt=jpeg

    图4 CoinJoin机制示意

    CoinJoin机制对所有用户交易的匿名性提供了强大的保障。即使只有部分用户使用这种协议,攻击者也会因无法准确识别全局账本中使用该协议的交易,而无法使用第2.2节中介绍的分析方法。这种不依赖第三方节点的混币机制能够从根源解决中心化混币方案中存在的资金偷窃、混币费用等问题。但是,由于没有第三方参与混币的组织与执行,混币用户往往需要自行组织协商,并完成混币过程,从而暴露出以下问题:

    ● 依然需要第三方节点协助完成寻找混币用户的过程,因此仍不可避免中心化混币中的一些威胁;

    ● 参与混币的用户在协商的过程中可能暴露自己的混币信息,无法保证所有混币参与方守信;

    ● 在执行混币过程中,如果由于部分节点违规操作导致混币失败,攻击者有可能趁机发起拒绝服务攻击;

    ● CoinJoin方案形成的多输入多输出交易将记录在全局账本中,用户无法抵赖其曾经参与过混币。

    针对CoinJoin机制的缺陷,出现了很多改进方法。Ruffing T等人[14]提出一种完全去中 心化的比特币混币协议——CoinShuffle,在CoinJoin的基础上增加了将输出地址洗牌的机制,使混币参与者无法得到自己以外的交易地址关联关系。但是该方案在执行混币过程时要求所有参与者同时在线,容易遭受拒绝服务攻击。Bissias G等人[15]提出一种基于区块链广告匿名寻找混币参与者的去中心化混币协议——Xim,随着混币参与用户数量的增加,攻击者发动攻击的代价也会线性增加,从而有效避免拒绝服务攻击。CoinParty[16]中由安全多方计算模拟可信第三方,即使在部分混币参与节点恶意操作或失效的情况下,混币过程依然有效。门罗币(Monero)的混币机制中采用了环型加密匿名技术,使混币参与用户无需与其他参与节点进行交流,可自行参与混币,为去中心化混币机制中常见的拒绝服务攻击、混币用户泄露信息等问题提供了有效的防御措施。

    去中心化混币机制取消了第三方混币提供者的参与,通过混币协议使混币过程在多个用户的共同参与下完成。因此混币过程的安全不依赖于第三方节点的可信度,用户也无需为混币服务花费额外的费用。但是,很多去中心化混币方案具有很高的遭受攻击的风险,该问题通常需要以改进算法的方式解决,因此也增加了混币机制的计算成本,影响混币服务的效率。针对混币机制中是否需要混币费用、是否存在盗窃风险等特征,笔者对现有的几种典型去中心化混币机制进行了对比分析,见表2。

    表2 去中心化混币机制特征对比640?wx_fmt=png

    6  未来研究方向

    由于传统的基于混币机制的隐私保护方案实现简单,不会对区块链原有的共识机制产生影响,在现有的区块链应用中得到了推广。但区块链的混币机制中依然存在一些缺陷。在区块链技术持续发展的同时,还需要对混币机制做进一步的研究。

    如果不借助其他隐私保护技术,混币机制的隐私保护效果十分有限,分析人员仍然可以使用特定的分析方法发现交易中隐藏的信息。因此,有必要通过采用密码学算法保证混币的安全性,例如零知识证明机制和同态加密机制。但引入加密机制需要对底层协议进行大幅改动,并需要消耗更多的计算资源,影响区块链应用的效率。虽然已经出现一些扩展方法对原本效率不高的安全混币机制进行了改良,使计算量大大减小,例如Pinocchio Coin[17]和ZeroCash[18]有望显著降低Zerocoin的证明规模和计算成本,但这些方案及扩展的改良方案都需要对区块链系统做出重大修改,从而无法落实到实际应用中。因此希望隐私保护机制在保护系统安全的同时尽量避免对系统做出改动。然而,现有的一些能够直接部署在区块链上的机制(如CoinShuffle)往往不具有足够的安全性,存在着遭受攻击的风险。

    在未来的研究中,需要使用一种更加安全高效的加密方案为混币机制的执行提供保障。密码学算法保护下的混币机制需要充分考虑区块链服务器在计算性能和存储性能上的缺陷,同时还需要重点考虑如何避免或者减少对区块链底层协议的修改,使安全高效的混币机制更容易得到落实与推广。

    7  结束语

    本文介绍了区块链技术中用于保护交易数据隐私的混币机制。首先,从隐私保护中面临的威胁出发,说明了混币机制的核心思想和应用场景;其次,对混币机制的基本原理进行了详细的阐述;最后,分别从基于第三方节点的混币方法和去中心化的混币方法的角度,详细地分析了两类混币方法的优势与缺陷,总结了现有混币方案作出的改进,并展望了混币机制未来可能的研究方向。

    点击下方 阅读原文 即可获取全文

    作 者 简 介

    640?wx_fmt=jpeg

    祝烈煌(1976-),男,博士,北京理工大学计算机学院教授、副院长、博士生导师,网络与信息安全研究所所长,主要研究方向为密码算法与安全协议、区块链技术、大数据隐私保护等。

     

    640?wx_fmt=png

    董慧(1993-),女,北京理工大学计算机学院硕士生,主要研究方向为区块链应用与隐私保护。

     

    640?wx_fmt=png

    沈蒙(1988-),男,博士,北京理工大学计算机学院讲师、硕士生导师,主要研究方向为数据安全共享与隐私保护。

     

    640?wx_fmt=jpeg

    《大数据》期刊

    《大数据(Big Data Research,BDR)》双月刊是由中华人民共和国工业和信息化部主管,人民邮电出版社主办,中国计算机学会大数据专家委员会学术指导,北京信通传媒有限责任公司出版的科技期刊。

    640?wx_fmt=jpeg

    关注《大数据》期刊微信公众号,获取更多内容

    展开全文
  • 文章目录Windows安全机制数据执行保护:...微软关于内存保护机制 GS编译技术 SEH的安全校验机制 Heap Cookie,Safe Unlinking等一系列堆安全机制 DEP数据执行保护 ASLR加载地址随机 SEHOP SEH的覆盖保护 ...

    Windows安全机制

    微软关于内存保护机制

    1. GS编译技术
    2. SEH的安全校验机制
    3. Heap Cookie,Safe Unlinking等一系列堆安全机制
    4. DEP数据执行保护
    5. ASLR加载地址随机
    6. SEHOP SEH的覆盖保护

    数据执行保护:DEP机制

    原理

    DEP的主要作用是阻止数据页(默认的堆,栈以及内存池页)执行代码。分为软件DEP和硬件DEP,其中软件DEP就是SafeSEH。而硬件DEP操作系统会通过设置内存页的NX/XD属性标记是否运行在本页执行指令。

    计算机中设置
    在这里插入图片描述
    DEP分为4种工作态

    1. Optin:默认仅保护Windows系统组件
    2. Optout:为排除列表程序外的所有程序和服务启用DEP
    3. AlwaysOn:对所有进程启用DEP保护
    4. AlwaysOff:对所有进程都禁用DEP

    调试器中设置
    在这里插入图片描述
    Visual Studio 2008之后默认开启DEP保护,编译的程序会在PE头中设置 IMAGE_DLLCHARACTERISTICS_NX_COMPAT标识,这个标识就在结构体IMAGE_OPTIONAL_HEADER 中DllCharacteristics,如果这个值被设为了0x0100表示采用了DEP保护编译。
    局限性

    1. 并不是所有的CPU都支持DEP
    2. 由于兼容性,不可能对所有的进程开辟DEP保护,这样会出现异常。对一些第三方插件DLL和ATL7.1或以前的程序版本,不会开启。
    3. 编译器中的/NXCOMPAT选项生成的程序,只会在Windows Vista以上的系统有效,在之前的系统会被忽略。
    4. 系统提供了某些API函数可以来控制DEP状态,早期的一些系统可以调用这些函数。

    绕过

    攻击未启用的DEP程序

    并不是只要CPU和操作系统支持DEP,所有程序就安全,对于一些进程来说,只要有某一个模块不支持DEP,就不能开启DEP。
    在这里插入图片描述
    在win7下也有许多的程序没有启用DEP

    利用Re2Libc挑战DEP
    跳转到ZwSetInformationProcess函数将DEP关闭再转入shellcode执行

    原理
    一个进程的DEP设置标识保存在KPROCESS结构中的_KEXECUTE_OPTIONS 上,这个标识可以通过API函数ZwQueryInformationProcess 和 ZwSetInformationProcess 进行查询和修改。
    在系统中找出一处关闭进程DEP的调用,微软有一个LdrpCheckNXCompatibility函数,当出现DLL收到SafeDisc保护的时候(函数中体现为al=1的时候),就会调用ZwSetInformationProcess函数进行关闭dep,所以我们可以在调用这个函数前把al的值改掉,就能够关闭dep
    在这里插入图片描述
    只有CMP AL,1成立程序才能继续执行,找到一个指令把AL修改为1,然后转到0x7C93CD6F执行。就会关闭DEP,然后retn跳到shellcode上。

    实验
    环境

    1. XP sp3 关闭DEP
    2. VS 2008 关闭GS和SafeSEH,release版本,关闭优化

    步骤

    1. 查找类似于MOV AL,1 RETN指令
      在这里插入图片描述
      将7C92E252覆盖为函数的返回地址

    2. 利用OllyFindAddr查找关闭DEP的代码位置
      在这里插入图片描述

    3. 修补ebp 在这里插入图片描述
      进入关闭DEP的代码位置处会跳转,跳到如图位置,会给ebp-4处赋值,而ebp在溢出的时候被破坏了,是90909090,就会出现错误。因此在进入关闭DEP的代码位置的时候要使得ebp指向的值是一个可写的位置。借助OllyFindAddr。 在这里插入图片描述
      但是当下寄存器只有esp的值是可写的地址,所以用push esp pop ebp ret 4

    4. 整理ebp和esp
      在这里插入图片描述
      在执行完push esp pop ebp ret 4后,ebp变成了B0,esp变成了B8。当再压入参数的时候。esp会加4,当压入两个参数的时候,ebp就会被破坏掉。所以esp应该在低地址,ebp应该在高地址
      在这里插入图片描述
      在调用ZwSetInformationProcess的时候,有三个参数的压栈操作,其中push 0x22会影响到原来的参数2,但是22和2的效果一致都能关闭DEP
      在这里插入图片描述
      但是在关闭DEP往回跳转的时候,这个位置也出现了错误00000004是之前push的4,这里的原来返回地址也被冲刷了。所以要减小esp或者增大ebp。

    5. 夺回程序的控制权 在这里插入图片描述
      通过retn 0x28指令,来使esp增加0x28个字节。在关闭DEP前加入增加esp的指令地址
      在这里插入图片描述
      在DEP关闭后,retn的地址在12FE04处是我们可以控制的地址,在这里填充一个jmp esp指令的地址。跳到栈的位置,然后再在的位置布置一个短跳转往前跳到shellcode的位置
      shellcode
      “\x90\x90\x90\x90”
      “\x52\xE2\x92\x7C”//MOV EAX,1 RETN地址
      “\x85\x8B\x1D\x5D”//修正EBP retn 0x4
      “\x19\x4A\x97\x7C”//增大ESP
      “\xB4\xC1\xC5\x7D”//jmp esp
      “\x24\xCD\x93\x7C”//关闭DEP代码的起始位置 retn 0x4
      “\xE9\x33\xFF\xFF”
      “\xFF\x90\x90\x90”
      结果
      在这里插入图片描述

    跳转到VirtualProtect函数来将shellcode 所在内存页设置为可执行状态,然后转入shellcode执行

    原理
    在kernel32.dll中,提供了VirtualProtect函数来修改内存属性。

    BOOL VirtualProtect(
    LPVOID lpAddress        shellcode 所在内存空间起始地址
    DWORD dwSize            shellcode大小
    DWORD flNewProtect      0x40
    PDWORD lpflOldProtect   某个可写地址
    )
    

    但是参数中包含0x00,strcpy在复制字符串时候会截断。所以只能攻击memcpy函数。

    实验
    环境
    步骤
    shellcode
    结果

    跳转到VIrtualAlloc函数开辟一段具有执行权限的内存空间,然后将shellcode复制到这段内存执

    原理
    在kernel32.dll中使用VirtualAlloc函数来申请一段具有可执行属性的内存,把第一跳设为Virtual函数地址,然后将shellcode复制到申请的内存空间中。

    LPVOID WINAPI VirtualAlloc{
    	_in_opt	LPVOID	lpAddress,	申请内存区域的地址
    	_in			SIZE_T	dwSize,		申请的大小
    	_in			DWORD	flAllocationType,	申请内存区域的类型
    	_in			DWORD	flProtect		访问控制类型如读,写,执行的权限
    };
    

    实验
    环境
    步骤
    shellcode
    结果

    利用可执行内存

    原理
    有的时候在进程空间会有一段可读可写可执行的内存。将shellcode复制到这段内存中,并劫持流程。
    实验
    环境

    1. XP sp3 关闭DEP
    2. VS 2008 关闭GS和SafeSEH,release版本,关闭优化
      步骤
      shellcode
      结果
    利用.NET攻击
    利用Java applet

    原理
    Java applet控件与.NET控件类似,都可以被IE加载到客户端,而且这些控件的内存空间都具有可执行属性。所以可以将shellcode放在控件的内存中
    条件
    具有溢出漏洞的ActiveX控件
    包含有shellcode的Java applet
    可以触发ActiveX控件的POC界面
    步骤
    1.把含有shellcode的Java applet编译成class文件
    2.用POC页面加载这个.class文件和具有溢出漏洞的ActiveX控件。

    <html>
    <body>
    <applet code=Shellcode.class width=300 height=50></applet> //包含.class文件
    <script>alert("开ྟ溢出!");</script>
    <object classid="clsid:39F64D5B-74E8-482F-95F4-918E54B1B2C8" id="test"> </object>//包含ActiveX控件
    <script>
    var s = "\u9090";
    while (s.length < 54) {
    s += "\u9090";
    }
    s+="\u04EC\u1001";
    test.test(s);
    </script>
    </body>
    </html>
    

    3.找到shellcode起始地址,覆盖为函数的返回地址

    展开全文
  • Windows安全机制第二弹——DEP保护,上一篇《Windows安全机制——ASLR(地址随机化)及如何关闭ASLR》,地址如下:https://blog.csdn.net/weixin_43742894/article/details/105702886 ...

    介绍

    DEP的主要作用是阻止数据页(默认的堆,栈以及内存池页)执行代码。分为软件DEP和硬件DEP,其中软件DEP就是SafeSEH。而硬件DEP操作系统会通过设置内存页的NX/XD属性标记是否运行在本页执行指令。

    DEP 机制的保护原理

    DEP(数据执行保护,Data Execution Prevention)就是用来弥补计算机对数据和代码混淆
    这一天然缺陷的。
    DEP 的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入 shellcode 时,
    程序会尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。

    核心原理:

    DEP 的主要作用是阻止数据页(如默认的堆页、各种堆栈页以及内存池页)执行代码。

    在这里插入图片描述

    DEP的类型

    根据实现的机制不同可分为:软件 DEP(Software DEP)和硬件 DEP(Hardware-enforced DEP)。
    软件 DEP
    其实就是 SafeSEH机制(另外的文章中提到过),它的目的是阻止利用 S.E.H 的攻击,这种机制与 CPU 硬件无关,Windows 利用软件模拟实现 DEP,对操作系统提供一定的保护。这也正是为什么在SafeSEH 的校验过程中会检查异常处理函数是否位于非可执行页上。
    硬件 DEP
    才是真正意义的 DEP,硬件 DEP 需要 CPU 的支持,AMD 和 Intel 都为此做了设计。
    俩者功能及工作原理在本质上是相同的。

    操作系统通过设置内存页的 NX/XD 属性标记,来指明不能从该内存执行代码。为了实现 这个功能,需要在内存的页面表(Page T able)中加入一个特殊的标识位(NX/XD)来标识是否允许在该页上执行指令。当该标识位设置为 0 里表示这个页面允许执行指令,设置为 1 时表示该页面不允许执行指令。

    检测电脑是否开启DEP

    可以通过如下方法检查 CPU 是否支持硬件 DEP,右键单击桌面上的“我的电脑”图
    标,选择“属性”,在打开的“系统属性”窗口中点击“高级”选项卡。在“高级”选项卡页
    面中的“性能”下单击“设置”打开“性能选项”页。单击“数据执行保护”选项卡,在该页
    面中我们可确认自己计算机的 CPU 是否支持 DEP。
    (图为Windows10示例)
    在这里插入图片描述

    DEP的四种状态

    (1)Optin:默认仅将 DEP 保护应用于 Windows 系统组件和服务,对于其他程序不予保护,但用户可以通过应用程序兼容性工具(ACT,Application Compatibility Toolkit)为选定的程序启用DEP,在 Vista 下边经过/NXcompat 选项编译过的程序将自动应用 DEP。这种模式可以被应用程序动态关闭,它多用于普通用户版的操作系统,如 Windows XP、Windows Vista、Windows7。
    (2)Optout:为排除列表程序外的所有程序和服务启用 DEP,用户可以手动在排除列表中
    指定不启用 DEP 保护的程序和服务。这种模式可以被应用程序动态关闭,它多用于服务器版
    的操作系统,如 W indows 2003、Windows 2008。
    (3)AlwaysOn:对所有进程启用 DEP 的保护,不存在排序列表,在这种模式下,DEP 不
    可以被关闭,目前只有在 64 位的操作系统上才工作在 AlwaysOn 模式。
    (4)AlwaysOff:对所有进程都禁用 DEP,这种模式下,DEP 也不能被动态开启,这种模
    式一般只有在某种特定场合才使用,如 DEP 干扰到程序的正常运行。

    Vs设置DEP

    在使用VS编译的时候也有DEP选项。(VS2015示例)默认情况下是开启的。
    通过右键单击项目属性–>链接器–>高级–>DEP保护。
    在这里插入图片描述

    采用/NXCOMPAT编译的程序会在文件的PE头中设置IMAGE_DLLCHARACTERISTICS_
    NX_COMPAT 标识,该标识通过结构体 IMAGE_OPTIONAL_HEADER 中的 DllCharacteristics
    变量进行体现,当 DllCharacteristics 设置为 0x0100 表示该程序采用了/NXCOMPAT 编译。
    经过/NXCOMPAT编译的程序有什么好处呢?
    通过前面的介绍我们知道用户版的操作系统中 DEP 一般工作在 Optin 状态,此时 DEP 只保护系统核心进程,而对于普通的程序是没有保护的。虽然用户可以通过工具自行添加,但这无形中增高了安全的门槛,所以微软推出了/NXCOMPAT 编译选项。经过/NXCOMPAT 编译的程序在 Windows vista 及后续版本的操作系统上会自动启用 DEP 保护。

    突破DEP

    1.攻击未启用 DEP 的程序
    2.利用 Ret2Libc 挑战 DEP
    3.利用可执行内存挑战 DEP
    4.利用.NET 挑战 DEP
    5.利用 Java applet 挑战 DEP
    参考资料:
    《0day》

    展开全文
  • 点击上方蓝字关注我们基于区块链技术的数据资产管理机制研究赵明1,董大治21海军装备部,北京 1008412中国人民解放军91001部队,北京 100841摘要:使用区块链技术可以...
  • 《深入理解计算机系统》----总结

    千次阅读 2017-11-03 22:44:04
    第一章 计算机系统漫游 主要内容:主要是全面精炼的概括了本书的内容,也就是“计算机系统概述”,包括: a) 解释计算机系统中“信息”的概念:就是二进制位; b) 解释源程序(以C源程序为例)到可执行程序的...
  • 计算机操作系统-1-总览

    千次阅读 2022-03-08 09:09:07
    计算机操作系统-1-总览
  • 操作系统安全机制

    千次阅读 2018-09-16 23:38:37
    版权声明:本文为博主原创文章,未经博主允许不得转载。...操作系统的安全性表现 物理上分离:要求进程使用不同的物理实体 时间上分离:具有不同安全要求进程在不同时间运行 逻辑上分离:要求进程...
  • 中断机制是操作系统中极为重要的一个部分。操作系统在管理输入输出设备时,在处理外部的各种事件时,都需要通过中断机制进行处理。所以也有人把操作系统称为是由“中断驱动”或者“(中断)事件驱动”的。 由于中断机制...
  • 任何计算机都必须在加载相应的操作系统之后,才能构成一个可以运转的、完整的计算机系统。操作系统的功能是否强大,决定了计算机系统的综合能力;操作系统的性能高低,决定了整个计算机系统的性能;操作系统本身的...
  • 文章目录第一章 计算机系统概述1.1 操作系统的基本概念1.1 练习题1.2 操作系统的发展与分类1.2 练习题1.3 操作系统的运行环境1.3 练习题1.4 操作系统的体系结构1.4 练习题 第一章 计算机系统概述 1.1 操作系统的基本...
  • 数据机密性是指系统仅允许被授权的用户访问计算机系统中的信息。 (2)数据完整性。数据完整性是指系统中所保存的信息既不会丢失,也不会被非授权用户修改,且能保持数据的一致性。 (3)系统可用性。系统可用性是指系统...
  • (7)操作系统安全机制

    万次阅读 2017-12-30 10:22:19
    操作系统安全机制:自主访问控制、强制访问控制机制、客体重用机制、标识与鉴别机制、可信路径机制、安全审计
  • 有一种方案既能满足用户数据安全的需求,又能比较迅速灵活地完成部署……
  • 医疗供应链通信网络产生关键信息和数据。特别是在新冠肺炎时代,医疗服务提供者之间正在共享有关医疗供应链的内部个人和私人信息。近年来,由于医疗供应链通信网络缺乏安全措施,多次发生网络攻击事件。由于计算能力...
  • 计算机系统(嵌入式类)术语概念

    千次阅读 2017-06-16 12:05:16
    6月忙于期末的复习和课业项目,很久没更博客,今天来分享一部分有关计算机系统(含嵌入式类系统)的概念知识。 既是考点,又是需要掌握的概念,发在这里做个记录和分享。嵌入式系统: 是一种嵌入机械或电气系统...
  • 计算机操作系统知识点总结

    千次阅读 多人点赞 2019-01-26 13:25:15
    在大三学习操作系统时所做的总结,上传到论坛以备日后复习使用。 第一章操作系统概述 1)计算机软件是指程序和与程序相关的文档的集合 2)按功能可把软件分为“系统软件”和“应用软件”两部分 系统软件:操作系统...
  • 而实模式下的寻址方式限制了寻址的空间,同样不能提供完善的保护机制,随着计算机的发展,用户的需求越来越多,大型的程序和多任务的出来要求有更大的寻址空间,这就要求在操作系统运行的过程中,要处理更多的段,...
  • 计算机系统常见面试题总结

    千次阅读 2017-03-16 11:23:35
    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程...
  • ​ 表示可以查询该目录下的文件名数据,可以利用ls命令将目录的内容列表显示出来 w:具有更改目录结构列表的权限: 新建新的文件与目录 删除已经存在的文件与目录(不论该文件的权限如何) 将已...
  • 计算机系统与网络安全-简答题复习

    千次阅读 2020-12-04 20:35:01
    计算机系统与网络安全-简答题复习 参考文献 [1] 周世杰,陈伟,罗绪成,《计算机系统与网络安全技术》,高等教育出版社 第一章 信息安全概述 (1.1信息及信息安全+1.2 信息安全体系) 1. 信息安全基本属性 ...
  • 计算机操作系统-4-设备管理

    千次阅读 2022-03-08 09:12:58
    计算机操作系统-4-设备管理
  • 操作系统 1. 中断和陷入有什么异同? 外中断时指来自处理机和内存外部的中断,如I/O中断、定时器中断、外部信号中断等。狭义上也叫中断; 内中断主要指在处理机和内存内部产生的中断,也称陷入,如校验错、页面失效...
  • PostgreSQL 数据安全之数据加密

    千次阅读 2021-09-01 10:23:17
    PostgreSQL 支持多个不同级别的灵活加密技术,包括密码加密、字段加密、存储加密、传输加密、认证加密以及应用加密,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。
  • 计算机操作系统》(第四版)大全总结

    千次阅读 多人点赞 2019-11-20 08:46:01
    计算机系统是由硬件和软件两部分组成。 操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。 操作系统的目标: 1、目标:方便性、有效性、可扩充性、开放性 2、作用: 1、作为用户与计算机...
  • 计算机系统知识

    千次阅读 2022-03-25 13:57:27
    计算机系统由硬件和软件组成,两者协同来运行程序。 计算机基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。 存储器是计算机系统中的记忆设备,分类如下1.1.2中央处理单元(CPU) CPU负责...
  • 1以下有关计算机程序和进程的描述中,错误的是( B)。 A.用高级语言编写的程序必须转换为机器代码才能在计算机中运行 B.机器代码及其数据被映射到统一的虚拟地址空间即形成一个进程 C.机器代码通常以可执行目标...
  • 孟庆祥 魏家琪 黄宇杭 (华云汇交数字科技有限公司 广东深圳 518053) 摘要:作为一种新兴的分布式账本技术,区块链存储着...区块链本身具备的匿名性和隐私性已经无法满足用户对隐私保护的需求,这严重影响区块链的应用
  • 4. 数据链路层 第 二章TCP/IP协议族及其面临的安全威胁 计算机网络的性质 网络设备简介 网络拓扑结构 OSI参考模型 TCP/IP协议栈常见安全风险 网络接口层作用 网卡工作模式 交换机表 网络接口层安全威胁-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,751
精华内容 42,300
关键字:

计算机系统的数据保护机制

友情链接: github-selfies.zip