基于ARMv8架构gadget自动搜索框架

2016-06-08 06:08赵利军王震宇王奕森
计算机应用与软件 2016年5期
关键词:图灵搜索算法寄存器

赵利军 王震宇 王奕森 庄 宽

(信息工程大学数学工程与先进计算国家重点实验室 河南 郑州 450001)



基于ARMv8架构gadget自动搜索框架

赵利军王震宇王奕森庄宽

(信息工程大学数学工程与先进计算国家重点实验室河南 郑州 450001)

摘要为了在ARM公司最新发布的首款支持64位处理器的ARMv8架构上实现ROP(Return_Oriented Programmig)技术,设计了ARMv8架构上的ROP gadget的自动搜索工具。通过结合ARMv8架构指令系统的特点,首先在库文件搜索出所有的以RET指令结尾的短指令序列,并把这些指令序列存储在gadget库中,然后采用一些优化策略对该库进行优化,最后根据用户的输入在库中搜索到与用户输入功能相同的gadget链。通过对搜索工具搜索到的gadget的统计,结果表明gadget集具有图灵完整性,可以执行任意的操作。最后通过一个实例证明了ROP在ARMv8架构上的可行性。

关键词ROP指令序列自动搜索ARMv8图灵完整性

0引言

数据执行保护和签名等技术有效地阻止了代码注入式攻击。2005年Sebastian Krahmer等人提出了一种借用代码攻击方法,该方法不再需要向内存中注入恶意代码,而是利用代码段中的代码实现攻击。return-into-libc[1]技术是一种典型的借用代码攻击,通过劫持控制流,跳转到C语言函数库libc,复用libc中已有的函数。但是return-into-libc攻击只能顺序调用函数,不能实现图灵完备的行为,如分支操作、循环操作等。

为了弥补return-into-libc攻击的局限性, 2007年Hova Shacham[2]第一次提出了X86平台上的返回导向编程技术ROP。返回导向编程攻击的方式不再局限于将漏洞程序的控制流跳转到库函数中,而是利用库函数或可执行文件的指令代码片段实现攻击,将复用的代码粒度从return-to-libc的函数级别缩小到指令序列。 自2007年ROP概念被提出后,关于ROP攻击的研究引起了研究人员的广泛关注,他们先后在各个平台上对ROP攻击进行实验。例如ARM平台,SPARC平台和AVR平台。Tim Kornau[3]首次在ARM架构上实现了ROP攻击并验证了图灵完整性,而且提出了一套基于REIL语言的自动构建ROP链的算法。2008年,Erik Buchanan[4]等人在SPARC平台上验证了ROP图灵完整性。卢森堡大学的Ralf-Philipp Weinmann利用ROP技术实现了iOS系统的入侵[5]。

ROP技术至关重要的一环就是可用指令序列的自动搜索,本文中将这些指令序列定义为gadget。由于库文件中的代码的数量非常巨大,所以手工搜索gadget将会非常的耗时,这将严重降低ROP技术的效率。2011年,Edward J. Schwartz[6]等人提出了一种 X86 平台上gadget 自动搜索算法,其定义了内部语言 QooL 来实现漏洞程序到 ROP payload 之间的转换,但是其缺陷是定义的语义只有内存操作和逻辑操作,没有涉及到条件执行和循环。然而这些技术只适用于X86架构,并不适用于其它架构,特别是RISC架构。2010年,Kornau 等人在ARM架构上实现一种基于中间语言 REIL 的 ARM gadget 自动搜索算法,首先该算法定位到分支指令,然后根据语法树算法把一条指令翻译成 REIL 语言,最后组合信息成为有用的gadgets。Edward J. Schwartz等人提出的自动构造ROP攻击的框架Q是基于短指令序列的,不能绕过Ping Chen[7]等人的提出的防御机制。2014年,Chao Yang[8]等人在Schwartz基础上提出了基于长指令序列的自动构造框架,成功地绕过了Ping Chen等人的防御机制。

ARMv8架构为了获得低功耗高效率的64位计算优势,引入了一个全新的指令字长为32位的64位指令集A64。上文论述的gadget搜索算法或是针对ARMv7架构,或是针对X86架构,并没有解决ARMv8架构gadget搜索关键问题:(1) ARMv8 gadget的搜索。ARMv7中用于实现函数返回的BX lr指令在A64指令集中已经不复存在。A64指令集中,用于实现函数返回的指令为RET {Xm}(当Xm省略时默认使用X30),ARMv7不存在该条指令。(2) ARMv8的图灵完整性。为了支持ARMv8新的指令系统和技术特性,其运行支撑环境也发生了显著的变化。新的动态链接库中的gadget集是否具有图灵完整性也需要重新考证。本文通过对X86架构下的gadget自动搜索算法的分析,结合ARMv8指令集的特征,设计了ARMv8架构下的gadget自动搜索工具,并利用搜索到的指令序列在ARMv8 linux中进行了实验。

1ARMv8架构的差异性分析

ARMv8架构在指令集设置、寄存器使用和函数调用等方面和我们熟知的架构(X86,ARM)截然不同。ARMv8架构有两种工作状态-AArch64和AArch32。在这两种工作状态下指令集仍然都是32位的,但是指令的寻址范围不同了:AArch64状态下支持64bit的地址空间,AArch32状态下支持32 bit的地址空间,且在每种工作状态下ARMv8都有31个通用寄存器[9]。本文将主要对AArch64状态下ARMV8架构的差异性。

1.1子函数调用规则

ARMv8架构摒弃了ARMv7架构下的7中工作模式-1个用户模式和6个特权模式,ARMV8架构下采用4种工作模式EL0-EL3,EL0相当于用户模式,下面我们将主要对非特权模式进行分析。

ARMv8架构下当发生子函数调用时,程序将PC中下一条指令的地址保存到寄存器X30中,然后跳转到PC中的地址去执行,当函数返回时程序将会跳转到X30寄存器中的地址处执行。当子函数的参数的个数不大于8个的时候,则参数由寄存器X0-X7进行参数传递,如果子函数的参数大于8个,则大于8个参数之外的参数通过栈进行传递。根据ARMv8架构的子函数的调用规则,在ARMv8架构中的寄存器分配规则如表1所示。

表1 函数调用时寄存器分配规则

从表1中可以看出ARMv7架构为15个通用寄存器,其中LR用来存放函数的返回地址,当函数重被调函数返回时从LR寄存器读取返回地址跳转到条用函数继续执行。ARMv8架构下为31个通用寄存器,栈指针寄存器SP独立于31个通用寄存器之外,其中X30相当于ARMv7架构下的LR寄存器,当函数返回时,程序将会跳转到X30寄存器中的地址执行。

ARMv8架构下函数调用时的内存布局相比于ARM以前的版本有了较大的改变,函数调用时的栈结构如图1所示。

图1 函数调用栈的分布情况对比图

左图为ARMv7的情形。caller调用callee之前,栈指针位于sp1位置;进入callee后,将栈基址寄存器R11和程序链接寄存器LR分别压栈,LR寄存器保存的是callee的返回地址。接着将栈指针减去一个常数(由编译器根据具体情况而定),假设其位于sp3位置。sp2-sp3之间的空间为callee的栈空间。

右图为ARMv8的情形。caller调用callee之前,栈指针位于sp1位置;紧挨着sp1位置的两个寄存器X29和X30分别存放的是caller栈基址和返回地址。进入callee函数后,首先会将栈指针减去一个常数(由编译器根据具体情况而定),假设位于sp2位置,然后将X29和X30寄存器分别压栈,此时栈指针位于sp3位置,X30寄存器保存的是callee的返回地址;sp1-sp3之间的空间为callee的栈空间。

此外,ROP 技术必须要有方法将栈中的数据加载到寄存器X0-X7中。研究发现,ARMv8中使用LDP和LDR指令完成数据的出栈操作[10]。

LDR指令实现单数据的读取,即从当前栈顶读取一个数据加载到目的寄存器,其汇编指令格式为:LDR Xn,[sp],#offset,其含义是从当前栈顶读取一个数据存储到寄存器Xn,然后栈指针sp加上offset。

LDP完成寄存器组的读取。其汇编指令格式为:LDP Xn,Xm,[sp],#offset,其含义是从当前栈顶连续读取两个数据依次存储到寄存器Xn和Xm,然后栈指针sp加上offset。

1.2ARMv8架构分支指令

通过对ARMv8架构指令系统的研究[9],总共有5类跳转指令可以影响程序的执行流。其功能如表2所示,当处理器在AArch64位的工作状态下时,表中的寄存器就写成Xm,当工作在AArch32状态下时寄存器就写成Wm。

表2 ARMv8架构分支指令描述表

从表2中可以看出,ARMv8架构分支指令可以分成三大类:条件跳转分支指令、非条件直接跳转分支指令和非条件间接跳转分支指令,其中条件跳转分支指令和非条件直接跳转分支指令的目标地址的偏移被编码到指令的编码中,不利于控制,所以本文不会使用以条件跳转分支指令和非条件直接跳转分支指令为结尾的指令序列。

ARMv8架构上的可用指令序列都是以支持寄存器间接跳转指令为结尾的。从表2中可以看出,这些指令主要包括三类:BLR Xm、BR Xm和RET {Xm}。其中,ARMv8中BLR Xm和BR Xm主要用于分支跳转或函数调用,BLR指令时需要将返回地址保存到寄存器X30中,而BR指令不需要将返回地址保存到寄存器X30中;RET {Xm}为函数返回指令,当Xm省略时默认使用X30。本文中主要搜索以RET {Xm}指令为结尾的指令序列。

2ARMv8 gadget自动搜索框架

本文中设计的搜索框架如图2所示。其主要包括两个部分;指令序列搜索模块和gadget组合模块。gadget搜索模块完成库文件中以RET指令为结尾的短指令序列的搜索。gadget组合模块根据用户的输入在指令序列集中搜索到相应的gadget链。

图2 ARMv8 gadget自动搜索框架

2.1gadget搜索模块

gadget链是ROP技术最重要的一部分,所谓 gadget,是指在一个程序中能搜索到的具有某一特定功能的可用指令序列。该指令序列必须满足一定的条件:

(1) gadget 中包含的指令条数通常很短,在个位数以内;

(2) gadget 的末尾都是一个跳转指令;

(3) 每个 gadget 完成某一功能,如 mov/add/sub/and/neg等。

本文中的gadget搜索框架将主要搜索以RET指令结尾的指令序列。ARMv8架构下的RET指令和X86架构下的RET指令在指令编码,指令语法等方面是完全不同的。ARMv8架构RET指令的编码如图3所示。

图3 ARMv8 RET指令编码格式

Xm为目的地址寄存器,理论上Xm可以为31个通用寄存器中的任意一个,但是通过统计本文发现ARMv8架构下Xm通常为X30寄存器。这样RET {Xm}指令的编码格式固定为“xc0x03x5fxd6”。所以本文的搜索算法将主要在目标二进制文件对特征码“xc0x03x5fxd6”进行搜索。

当定位到分支指令之后,开始以分支指令开始逆向遍历,其搜索算法如图4所示,图4给出的自动搜索算法遍历库文件或可执行文件的整个代码段。算法的第4行通过对ARMv8架构ELF文件格式的分析,定位到代码段。该算法的第一层循环用来搜索整个库文件来定位分支指令,当搜索到“xc0x03x5fxd6”特征码时用第二层循环开始逆向4字节遍历,并把相应的指令保存到G.gadget_binary[]中,当完成一个指令流的搜索后,把该指令流的首地址保存到G.address中。当发生以下情况时算法停止搜索:① 当遇到返回指令RET时;② 当G.gadget_binary[]中的指令的条数大于搜索深度maxdepth时。

图4 ARMv8 gadget自动搜索算法

算法中的maxdepth为用户预先设置好的一个阈值,这个值的设置是必要的,且其值一般设置为个位数,本文中将其值设置为4。如果不设置阈值或者该值过大会给指令序列带来巨大的边界影响。算法的G结构定义如下:

typedef struct gadget_logic_struct

{

int address;

int gadget_binary[4];

其中address用来存储每个指令序列的起始地址,gadget_binary[4]用来存储指令序列,当指令序列的指令条数小于4时,使用NOP指令填充。经过上述算法可以得到所有的以RET分支指令结尾的gadget序列。

2.2gadget组合模块

gadget组合模块通过解析用户的输入,在指令序列集中搜索到与用户输入具有相同功能的gadget链。该模块主要解决两个问题。gadget序列的优化和寄存器冲突的解决。

2.2.1gadget序列的优化

本文的优化主要是针对栈指针寄存器SP偏移的优化。2.1节中搜索到的gadget集中存在很多功能相同,但是其栈指针SP的偏移却是不同的短指令序列。例如gadget”add x3,x2,x5;ldr x30,[sp],#0x8;ret”和gadget”add x3,x2,x5;ldp x29,x30,[sp],#0x10; ret”,这两个gadget完成的功能都是将寄存器X2和寄存器X5中内容相加,结果保存到寄存器X3中,但是第一个gadget中SP调整了8个字节,而第二个gadget中SP调整了16个字节,本文中将会保留第一个gadget。本文采用线性扫描方法进行解决。即gadget组合模块从gadget集的开始位置遍历整个gadget集,当遇到与用户输入具有相同功能的gadget,就保存该gadget中SP调整的大小,当遍历结束时,选取那个SP调整最小的gadget作为gadget链中的一个。这样在进行ROP攻击时,会节省非常多的栈空间,提高了ROP攻击的效率。本文中的方法虽然效率非常低,但非常有效。

2.2.2寄存器冲突的解决

寄存器冲突指存在两个gadgets:G1和G2,G1存储临时数据到寄存器A,G2需要初始化寄存器A以完成相应的操作,G1和G2之间就存在寄存器冲突。本文的解决策略主要分成两种情况:一种情况是如果一个寄存器被某个gadget无意的设置,而且该寄存器又同时被后面的一个gadget使用,并且在这两个gadget之间没有设置该寄存器的gadget,那么我们就需要这两个gadget之间插入load gadget以消除寄存器冲突。例如“mov x1,[x2];mov x0,0xffff0983;ldr x30,[sp],#0x10;ret”和“mov x4,[x0];ldp x29,x30,[sp],#0x20;ret”这两个gadget,第一个gadget的功能是设置X1的值,然而X0却被该gadget无意的设置,而又同时在后一个gadget中被作为源寄存器使用,如果在他们之间没有一个gadget对进行设置,我们就立即在前一个gadget后插入load gadget对X0寄存器进行更新;另一种情况是一个gadget对寄存器进行了初始化用来完成后面的计算,而该寄存器却又被另一个gadget用于存储临时变量,这将影响该寄存器的正常使用,那么我们就在这两个gadget之间增加一个store gadget以消除寄存器冲突。例如“mov x0,0x7fb724a568;ldp x29,x30,[sp],#0x10;ret”、“add x0,x2,x5;ldp x29,x30,[sp],#0x10;ret”这两个gadget,第一个gadget将X0寄存器赋值为0x7fb724a568,该值被后面的gadget作为一个基址使用,但是第二个gadget却将X0寄存器用来存储寄存器X2和X5相加的临时结果,那么我们就在这两个gadget之间增加一个store gadget将一个gadget的结果首先存储起来,等到使用时再取出。

3ARMv8 ROP实例

实验环境: Linaro ARMv8 Linux,其版本号为Linux 3.6.0-1-Linaro-vexpress64。Linaro是ARM公司授权商,其为ARMv8开发的工具链和快速模型虚拟平台能从ARM官网下载[11]。

为了尽快使企业脱贫,林洋本着精准扶贫的理念,充分利用国家出台的各项农业扶持政策,大力推进农业项目建设。近3年来,先后建成年产300万标准食用菌菌袋扶贫开发项目,食用菌种植推广项目,小型农田水利补贴项目,大棚种植冬枣项目等。这些农业项目已收到了良好的社会效益和经济效益,本单位职工及周边农村上百人在项目推广中受益脱贫,群众纷纷点赞,称林洋是“带领群众脱贫的引路人”。2017年,云城乳业被市国资委评为“项目推进先进单位”。

本节将给出Linaro ARMv8 Linux上实现的ROP实例。该实例的ROP shellcode欲实现的功能是通过复用libc.so.6中的write函数在终端输出字符串”ARMv8 exploit”,然后复用libc.so.6中的exit函数使程序离开。

3.1gadget链

根据用户的目的,工具搜索到了以下三个gadget,这3个gadget来自ARMv8常用的libc.so.6或ld-linux-aarch64.so.1库文件。gadget(1)用于从内存加载数据到寄存器X0;gadget(2)从内存中连续读取4个数据依次放入寄存器X1、X2、X3和X4;gadget(3)完成write系统调用,指令”mov x8, #0x40”将write的系统调用号0x40加载到寄存器X8,指令”ldr x30,[sp],#10”将write系统调用后的程序执行的目的地址加载到寄存器X30。

0x7fb7f4c4e4 F84107E0 ldr x0,[sp],#0x10

0x7fb7f4c4e8 F84107FE ldr x30,[sp],#0x10

0x7fb7f4c4ec D65F03C0 ret

gadget(1)

0x7fb7fe835c A8C10BE1 ldp x1,x2,[sp],#0x10

0x7fb7fe8360 A8C113E3 ldp x3,x4,[sp],#0x10

0x7fb7fe8364 A8C27BFD ldp x29, x30, [sp], #0x20

0x7fb7fe8368 D65F03C0 ret

gadget(2)

0x7fb7f65c64 D2800808 mov x8, #0x40

0x7fb7f65c68 D4000001 svc #0

0x7fb7f65c6c F84027FE ldr x30,[sp],#0x10

0x7fb7f65c70 D65F03C0 ret

gadget(3)

通过对上面gadget链的分析,生成的ARMv8 ROP shellcode内容如下:

char shellcode[]=″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41xe4xc4xf4xb7x7fx00x00x00″″x00x00x00x00x00x00x00x00x41x41x41x41x41x41x41x41″″x5cx83xfexb7x7f x00x00x00x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41xd0xc4xf4xb7x7f x00x00x00″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x50xfcxffxffx7fx00x00x00x0dx00x00x00x00x00x00x00″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″ARMv8 exploit;

3.2ROP执行流

ROP shellcode对应的内存布局及工作原理如图5所示。图的左侧给出ROP的内存安排和内存地址的后12位,图的右侧的虚线代表指令序列的执行顺序。

通过一次漏洞利用,将返回地址用gadget(1)的返回地址改写,程序返回时将会跳转到本文设定的指令序列,程序依次执行gadget(1)和gadget(2),在gadget(1)和gadget(2)执行完毕之后X0、X1和X2三个寄存器已经被设置为write系统调用所需要的三个参数,gadget(3)将write系统调用号0x40传递给寄存器0x40,然后执行write系统调用在终端输出字符串”ARMV8 exploit”,通过控制write系统调用的返回地址,write系统调用执行完毕后程序将会跳转到gadget(1)执行,gadget(1)将exit系统调用的参数和入口地址分别传递给寄存器X0和X30,最后通过执行exit系统调用使程序离开。在内存中,本文没有用到的闲置内存全部用字符A填充。

图5 ROP攻击实例原理图

4实验结果评估

本文利用该工具在Linaro ARMv8 Linux 常用的库文件libc.so.6和ld-linux-aarch64.so.1中进行搜索,实验结果如下所示。

libc.so.6库文件中搜索深度为4的部分搜索结果。

ld-linux-aarch64.so.1库文件中搜索深度为4的部分搜索结果。

通过利用搜索到的结果统计出以RET指令结尾的gadget的数目如表3所示。

表3 gadget统计结果

Erik Buchanan[12]等人首次在X86架构上对gadget的图灵完整性进行了证明,如果一个gadget集可以满足基本的赋值操作、算术和逻辑运算、控制流和函数调用四个条件,那么该gadget集就是图灵完整的,可以执行任何操作。通过统计,本文中搜索工具搜索到的gadget同样可以满足上面四个条件,因此本文工具搜索到的gadget也是图灵完备的,可以执行任意的操作。

5结语

为了实现ARMv8架构上的ROP技术,本文首次提出了ARMv8上ROP gadget自动搜索的框架,它首先在库文件搜索出所有的以RET指令结尾的短指令序列,并把这些指令序列存储在gadget库中,然后对该库进行优化,最后根据用户的输入在库中搜索到与用户输入功能相同的gadget链。通过对搜索工具搜索到的gadget进行统计,结果表明gadget集具有图灵完整性,可以执行任意的操作。本文不仅提出了ARMv8架构下的gadget自动搜索工具,而且利用搜索到的gadget在ARMVv8 Linux中进行了ROP实验,实验结果表明可以利用gadget集在ARMv8架构上进行ROP攻击。但是本文的搜索工具是基于语法进行搜寻的,在搜索过程中会产生许多无用的gadget,而且无法反映gadget一些标志寄存器的影响,降低了gadget的搜索效率和准确性。下一步我们将提出一种基于语义的gadget自动搜索方法对这些问题进行解决。此外,本文使用的ROP shellcode是通过人工分析形成的, ARMv8 ROP shellcode自动生成方法的研究也将成为下一步工作的重点。

参考文献

[1] Krahmer S.x86-64 buffer overflow exploits and the borrowed code chunks exploitation technique[J].C1:Vulnerable Server application,2005.

[2] Shacham H.The geometry of innocent flesh on the bone:Return-into-libc without function calls (on the x86)[C]//Proceedings of the 14th ACM conference on Computer and communications security.ACM,2007:552-561.

[3] Kornau T.Return oriented programming for the ARM architecture[D].Master’s thesis,Ruhr-Universitat Bochum,2010.

[4] Roemer R,Buchanan E,Shacham H,et al.Return-oriented programming:Systems,languages,and applications[J].ACM Transactions on Information and System Security (TISSEC),2012,15(1):2.

[5] Vincenzo Iozzo,ROP and iPhone.http://blog.zynamics.com/2010/04/16/rop-and-iphone/, Apri,16,2010.

[6] Schwartz E J,Avgerinos T,Brumley D.Q:Exploit Hardening Made Easy[C]//USENIX Security Symposium,2011.

[7] Chen P,Xiao H,Shen X B,et al.DROP:Detecting return-oriented programming malicious code[M]//Information Systems Security.Springer Berlin Heidelberg,2009:163-177.

[8] Yang C,Zheng T,Lin Z.AR Exploit:An Automatic ROP Exploit Based on Long Sequence[C]//Software Security and Reliability-Companion (SERE-C),2014 IEEE Eighth International Conference on.IEEE,2014:50-56.

[9] https://silver.arm.com/download/ARM_and_AMBA_Architecture/AR100-DA-70501-r0p0-00eac5/ARMv8_ISA_PRD03-GENC-010197-30-0.pdf.

[10] https://silver.arm.com/download/ARM_and_AMBA_Architecture/AR10 0-DA-70501-r0p0-00eac5/DDI0487A_a_armv8_arm_errata.pdf.

[11] Linaro.Linaro ARMv8 Project.http://www.Linaro.org/projects/armv8/.

[12] Buchanan E,Roemer R,Shacham H.When good instructions go bad:generalizing return-oriented programming to RISC[C]//Proceedings of the 15th ACM conference on Computer and communications security.ACM,2008:27-38.

AN AUTOMATED GADGET SEARCH FRAMEWORK BASED ON ARMv8 ARCHITECTURE

Zhao LijunWang ZhenyuWang YisenZhuang Kuan

(StateKeyLaboratoryofMathematicalEngineeringandAdvancedComputing,PLAInformationEngineeringUniversity,Zhengzhou450001,Henan,China)

AbstractTo implement ROP (return-oriented programming) technology on the first ARMv8 architecture supporting 64 bits processor which is the latest release of ARM, we designed an automatic search tool for ROP gadget on ARMv8 architecture. By combining the features of instruction system of ARMv8 architecture, it first searches all the short instruction sequences ending with “RET” instruction in library files, and stores these instruction sequences to gadget library, and then uses some optimisation strategy to optimise the library, finally, according to users’ input it finds the gadget chains with same function of users’ input. Through the statistics of gadgets searched by search tool, result showed that the gadget set had the Turing completeness, and could execute any operation. In end of the paper, through an example we proved the feasibility of ROP on ARMv8 architecture.

KeywordsROPInstruction sequenceAutomatic searchARMv8Turing completeness

收稿日期:2014-12-02。国家高技术研究发展计划基金项目(200 9AA012200)。赵利军,硕士生,主研领域:嵌入式设备安全分析。王震宇,副教授。王奕森,硕士生。庄宽,硕士生。

中图分类号TP309.1

文献标识码A

DOI:10.3969/j.issn.1000-386x.2016.05.076

猜你喜欢
图灵搜索算法寄存器
哈啰电动车发布智能新品哈啰B70 PRO,推出智能平台图灵T30
STM32和51单片机寄存器映射原理异同分析
改进的和声搜索算法求解凸二次规划及线性规划
Lite寄存器模型的设计与实现
新英镑
人工智能简史
语言与图灵测试
基于汽车接力的潮流转移快速搜索算法
基于逐维改进的自适应步长布谷鸟搜索算法
基于跳点搜索算法的网格地图寻路