缓冲区溢出攻击

6
缓冲区溢出攻击要素
在进程的地址空间安排适当的代码 通过适当的初始化寄存器和内存,跳转到 以上代码段执行

7
安排代码的方法

利用进程中存在的代码
– 传递一个适当的参数 – 如程序中有exec(arg),只要把arg指向
“/bin/sh”就可以了

植入法
– 把指令序列放到缓冲区中 – 堆、栈、数据段都可以存放攻击代码,最常

4
缓冲区溢出攻击原理
类似函数有strcat、sprintf、vsprintf、gets、 scanf等 一般溢出会造成程序读/写或执行非法内 存的数据,引发segmentation fault异常退 出. 如果在一个suid程序中特意构造内容,可 以有目的的执行程序,如/bin/sh,得到 root权限。
见的是利用栈
8
内存
Stack Heap High

段属性
– Text: E – Data:R/W – Stack:R/W/E

栈需要E属性
– Signal Handling
– Trampoline code
Data
Text
Low
9
控制程序转移到攻击代码的方 法

利用活动记录
– 溢出栈中的局部变量,使返回地址指向攻击
最早的攻击1988年UNIX下的Morris woIS漏洞 SQL Server Worm 利用SQL Server漏洞 Blaster 利用RPC漏洞 Sasser利用LSASS漏洞
3
缓冲区溢出攻击原理
向缓冲区写入超过缓冲区长度的内容,造成缓 冲区溢出,破坏程序的堆栈,使程序转而执行 其他的指令,达到攻击的目的。 原因:程序中缺少错误检测: void func(char *str) { char buf[16]; strcpy(buf,str); } 如果str的内容多于16个非0字符,就会造成buf的 溢出,使程序出错。

5
缓冲区溢出攻击原理
对于使用C语言开发的软件,缓冲区溢出 大部分是数组越界或指针非法引用造成的。 有时并不引发溢出也能进行攻击。 现存的软件中可能存在缓冲区溢出攻击, 因此缓冲区溢出攻击短期内不可能杜绝。 缓冲区溢出的危害很大:

– 可以植入并运行攻击代码 – 比大部分DoS攻击危害严重

– 不使用root身份来运行apache,named等服务程

16
实验内容

实验一提示:
– ./width1 65536 adfad – 65536 复制给 s后变成 0
17
信息安全综合实验
1
第四章 缓冲区溢出

课程目的
– 学习缓冲区溢出攻击的基本概念和原理 – 掌握预防和防御缓冲区溢出攻击的方法
2
缓冲区溢出攻击

Buffer overflow attack 缓冲区溢出攻击
– 缓冲区溢出漏洞大量存在于各种软件中 – 利用缓冲区溢出的攻击,会导致系统当机,获得系
统特权等严重后果。
代码 栈溢出攻击 Stack Smashing Attack
10
控制程序转移到攻击代码的方 法

函数指针
– 如果定义有函数指针,溢出函数指针前面的
缓冲区,修改函数指针的内容
11
控制程序转移到攻击代码的方 法

长跳转缓冲区 longjmp buffers
– Setjmp/longjmp语句 – 覆盖setjmp/longjmp的缓冲区内容
Linux/Solaris都可以设置
– 202.38.64.10/11都设置了
能杜绝绝大部分,但不是所有缓冲区溢出 攻击 Linux在以下情况下栈必须可执行:
– Signal – gcc在线重用
15
防范缓冲区攻击的普遍方法
关闭不需要端口和服务 安装最新的补丁 检查关键程序 以最小的权限运行软件
12
常见的攻击技术

一个字符串中完成代码植入和跳转
– 一般修改活动记录
13
缓冲区溢出攻击的避免

缓冲区不可执行
– 植入的攻击代码无法执行,不能产生大的危

编写正确的代码 编译器进行类型、边界检查,实现缓冲区 的保护

– java

运行时(Runtime)指针、边界检查
14
缓冲区不可执行

合集下载

C语言中的恶意攻击与防御技术解析

C语言中的恶意攻击与防御技术解析

C语言中的恶意攻击与防御技术解析C语言作为一种强大而广泛应用的编程语言,不仅在软件开发领域发挥着重要作用,同时也成为黑客们实施恶意攻击的目标。

本文将对C语言中的恶意攻击进行解析,并探讨相应的防御技术。

1. 缓冲区溢出攻击缓冲区溢出攻击是最常见的C语言恶意攻击方式之一。

攻击者通过向程序输入超出缓冲区大小的数据,将恶意代码注入到原有代码中,进而控制程序的行为。

为了防止缓冲区溢出攻击,开发人员可以采取以下防御措施:- 使用安全的C标准库函数来替代不安全的函数,如使用“strncpy”替代“strcpy”。

- 对用户输入进行严格的输入验证和边界检查,确保输入的大小不会超过缓冲区的容量。

- 使用堆栈保护技术,如栈溢出保护(StackGuard)或堆溢出保护(HeapGuard)来防止攻击者篡改程序的返回地址。

2. 格式化字符串攻击格式化字符串攻击是另一种常见的C语言恶意攻击方式。

攻击者通过向格式化输出函数(如printf或sprintf)提供恶意格式字符串,可以读取程序内存的敏感数据、修改变量值甚至执行任意代码。

为了防止格式化字符串攻击,开发人员可以采取以下防御措施:- 检查和限制格式化字符串的输入,避免用户输入的变量被认为是格式化字符串。

- 使用类型安全版本的格式化输出函数,如“snprintf”来取代不安全的函数。

- 将敏感数据从栈上移除,使用局部变量等方式来隐藏敏感数据的地址。

3. 整数溢出攻击整数溢出攻击是指对程序中的整型变量进行恶意操作,使其值超出正常范围,从而影响程序的行为。

这种攻击方式常常发生在C语言中,因为C语言中的整数类型没有提供溢出检查机制。

为了防止整数溢出攻击,开发人员可以采取以下防御措施:- 对整型变量进行边界检查,确保其值不会超出预期范围。

- 使用无符号整数类型,因为无符号类型在溢出时会自动进行环绕,而不会导致未定义行为。

- 使用安全的整数操作函数,如“safe_add”、“safe_subtract”等,这些函数会在发生溢出时进行检查和处理。

缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种常见的安全漏洞,指的是攻击者利用输入数据的长度或格式错误,超出程序设计者预留的存储空间范围,从而写入到相邻内存空间中,进而控制程序的执行或修改程序的行为。

缓冲区溢出攻击的基本原理如下:
1.内存分配:程序在运行时会根据变量类型和长度来分配内存空间。

2.缓冲区溢出:攻击者通过向程序输入异常数据,超出了程序预留的内存空
间。

3.覆盖关键数据:溢出的数据覆盖了原本存储的数据,可能是程序的返回地
址、函数指针等关键信息。

4.控制程序行为:攻击者利用溢出的数据修改程序的执行路径,跳转到自己
准备好的恶意代码。

5.执行恶意代码:程序执行了攻击者注入的恶意代码,可能导致系统崩溃、
拒绝服务或远程执行任意命令。

为了避免缓冲区溢出攻击,开发人员可以采取以下措施:
•使用安全的编程语言和工具,如内存安全的语言(如Rust)或经过良好测试的C/C++库。

•限制输入数据的长度,确保不会超过缓冲区可容纳的大小。

•进行输入验证和过滤,确保输入数据符合预期的格式和范围。

•定期更新软件和操作系统,及时修补已知的漏洞。

•实施数据执行保护(DEP)和地址空间布局随机化(ASLR)等安全机制。

综上所述,缓冲区溢出攻击是一种常见的安全漏洞,它利用错误处理输入数据的程序中的缺陷,从而控制程序行为。

开发人员和系统管理员应该密切关注安全问题,采取相应的防护措施,以保护系统和用户的信息安全。

「网络安全」常见攻击篇(10)缓冲区溢出攻击

「网络安全」常见攻击篇(10)缓冲区溢出攻击

「网络安全」常见攻击篇(10)——缓冲区溢出攻击什么是缓冲区溢出攻击?▪缓冲区程序用来保存用户输入数据、程序临时数据的内存空间,本质为数组。

▪缓冲区溢出攻击攻击者利用程序漏洞,将自己的攻击代码植入有缓冲区溢出漏洞的程序执行体中,改变该程序的执行过程,来获取目标系统的控制权。

▪缓冲区溢出攻击原理程序员通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

缓冲区溢出的攻击方式▪栈溢出(stack smashing)未检查输入缓冲区长度,导致数组越界,覆盖栈中局部变量空间之上的栈桢指针%ebp以及函数返回地址retaddr, 当函数返回执行ret指令时,retaddr从栈中弹出,作为下一条指令的地址赋给%eip寄存器,继而改变原程序的执行流程指向我们的shellcode.▪堆溢出(malloc/free heapcorruption)一种是和传统的栈溢出一样, 当输入超出malloc()预先分配的空间大小,就会覆盖掉这段空间之后的一段存储区域,如果该存储区域有一个重要的变量比如euid,那么我就可以用它来攻击。

另一种是典型的double-free堆腐败,在内存回收操作中,合并相邻空闲块重新插入双向链表时会有一个写4字节内存的操作,如果弱点程序由于编程错误free()一个不存在的块,我们就可以精心伪造这个块,从而覆盖任何我们想要的值:函数的返回地址、库函数的.plt地址等▪格式化字符窜漏洞(format stringvulnerability)如果格式窜由用户定制,攻击者就可以任意伪造格式窜,利用*printf()系列函数的特性就可以窥探堆栈空间的内容,超常输入可以引发传统的缓冲区溢出,或是用”%n”覆盖指针、返回地址等。

▪整形变量溢出(integer variableoverflow)利用整数的范围、符号等问题触发安全漏洞,大多数整形溢出不能直接利用,但如果该整形变量决定内存分配等操作,我们就有可能间接利用该漏洞。

缓冲区溢出攻击原理与防范

缓冲区溢出攻击原理与防范

缓冲区溢出攻击原理与防范1.程序预留了一块内存区域作为缓冲区,用于执行其中一种特定的操作,如字符串拼接、输入输出处理等;2.当输入的数据长度超过了这个缓冲区的大小时,多余的数据会溢出到相邻的内存区域中;3.攻击者利用输入超出缓冲区的长度来对溢出的数据进行控制,修改程序的执行流程;4.修改后的程序执行流程可以导致程序崩溃、系统崩溃、拒绝服务等问题,也可以用于执行任意的恶意代码。

为了防范缓冲区溢出攻击,可以采取以下几种措施:1.对输入进行有效的长度检查:在程序中对输入数据进行有效的长度检查,确保不会超过预定的缓冲区大小。

这样就可以避免发生缓冲区溢出。

2. 使用安全编程语言和工具:选择使用安全编程语言,如Rust、Go 等,这些语言具有安全性的内存管理机制,能够自动检查和防范缓冲区溢出问题。

此外,使用安全编程工具如静态代码分析工具、Fuzzing工具等也可以帮助发现和修复潜在的缓冲区溢出漏洞。

3.使用内存安全检查工具:使用内存安全检查工具,如利用内存隔离技术的地址空间布局随机化(ASLR)、点火检查器、堆栈保护机制等。

这些工具可以帮助检测和防范缓冲区溢出攻击。

4.最小特权原则:在设计软件时,采用最小特权原则,即仅分配程序所需的最小权限。

这样做可以确保即使发生缓冲区溢出攻击,攻击者也只能访问到最小特权内的信息,减少损失。

5.及时修复漏洞和更新软件:及时修复已知的缓冲区溢出漏洞,更新软件以获取最新的安全补丁是非常重要的。

由于缓冲区溢出攻击是一种常见的攻击方式,软件开发商通常会不断更新修复这方面的漏洞。

综上所述,缓冲区溢出攻击是一种常见的安全漏洞利用技术,可以对各种软件和操作系统进行攻击。

为了防范这种攻击,需要采取有效的措施,如对输入进行有效的长度检查、使用安全编程语言和工具、使用内存安全检查工具、采用最小特权原则以及及时修复漏洞和更新软件等。

这样可以有效地减少缓冲区溢出攻击带来的风险。

缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理1. 引言缓冲区溢出(Buffer Overflow)攻击是指攻击者利用程序设计中的缺陷,向缓冲区写入超出其容量的数据,从而覆盖到其他内存区域或者执行恶意代码。

这种攻击方式在软件开发和网络安全领域中被广泛研究,属于一种常见的安全漏洞。

让我们通过以下几个步骤深入了解缓冲区溢出攻击的基本原理。

2. 缓冲区溢出2.1 缓冲区缓冲区(Buffer)是计算机内存中一段预留给程序使用的存储区域,用于临时保存数据。

在C和C++等低级编程语言中,缓冲区通常是以数组的形式存在。

2.2 缓冲区溢出当程序收到输入数据超过预分配的缓冲区容量时,数据会溢出到相邻的内存区域。

由于这些相邻的内存区域往往存放着重要的数据或者程序代码,攻击者可以借此修改程序的行为,造成安全漏洞。

3. 缓冲区溢出攻击的过程3.1 寻找目标程序攻击者首先需要找到目标程序中存在缓冲区溢出漏洞的函数,一般是在程序中存在对用户输入进行处理的函数。

这些函数通常是目标程序接收外部输入的入口。

3.2 构造恶意输入攻击者构造一段特定的输入数据,超过目标程序预分配的缓冲区大小。

这段输入数据中通常包含恶意代码,也可以包含用于修改程序行为的特定数据。

3.3 栈溢出攻击者向目标程序发送构造的恶意数据。

当目标程序将恶意数据输入到缓冲区时,超过缓冲区容量的数据将溢出到栈(Stack)中。

3.4 覆盖返回地址栈是一种用于存储函数调用的内存结构,其中包含函数的返回地址。

攻击者通过溢出栈的方式,将恶意数据覆盖到返回地址上。

3.5 执行恶意代码当目标程序执行函数返回的时候,会跳转到被覆盖的恶意代码的地址。

这样,攻击者就成功地执行了恶意代码,从而实现了攻击的目的。

4. 防御机制为了有效防范缓冲区溢出攻击,开发者和安全工程师可以采取一些常见的防御措施。

4.1 输入验证合理的输入验证是防范缓冲区溢出攻击的基础。

开发者应该对用户输入的数据进行有效的检查和过滤,确保其不会超过预分配的缓冲区大小。

缓冲区溢出攻击的原理分析与防范

缓冲区溢出攻击的原理分析与防范

缓冲区溢出攻击的原理分析与防范原理分析:1.缓冲区的分配:当程序运行时,会为其分配一定大小的缓冲区(数组)来存储数据。

攻击者通过输入超过缓冲区大小的数据,覆盖相邻的内存区域。

2. 缓冲区溢出:攻击者构造特定的输入,超过缓冲区的边界,将溢出的数据覆盖到程序的其他内存空间,包括调用栈(stack)等。

3.返回地址覆盖:返回地址是指程序执行的下一条指令的地址,攻击者通过溢出缓冲区,将恶意代码的地址覆盖到返回地址上,使程序执行恶意代码。

4.执行恶意代码:当程序执行到返回地址时,由于返回地址被替换为恶意代码的地址,程序控制权转移到了恶意代码上,攻击者可以控制程序执行一系列恶意操作。

防范措施:1. 输入验证:在程序中对用户输入进行验证和过滤,确保输入的大小不会超出缓冲区的边界。

可以使用编程语言中的字符串处理函数,如strncpy(、snprintf(等,确保只将有效数据拷贝到缓冲区。

2. 使用编程语言和框架提供的安全API:使用编程语言提供的安全API,如Java中的StringBuilder类,C#中的StringBuilder类等,这些API在处理字符串时会进行边界检查,避免缓冲区溢出。

3. 栈保护技术:栈保护技术包括Stack Smashing Protector (SSP)和Control Flow Integrity (CFI)等。

SSP通过在栈上插入一个特殊的栈保护变量,监控缓冲区的溢出情况。

CFI通过在程序中插入额外的代码和元数据,来防止控制流的恶意改变。

4. 内存随机化:通过内存随机化技术,如ASLR(Address Space Layout Randomization),将程序的内存布局随机化,使攻击者难以预测恶意代码的位置。

5.使用静态和动态代码分析工具:使用静态和动态代码分析工具来检测和修复程序中的缓冲区溢出漏洞。

静态代码分析工具可以在编译时检测潜在的缓冲区溢出漏洞,而动态代码分析工具可以模拟攻击,并检测运行时的缓冲区溢出情况。

简述缓冲区溢出攻击的原理以及防范方法

简述缓冲区溢出攻击的原理以及防范方法
一、缓冲区溢出攻击原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种非法异常的程序运行行为,它发生的目的是让受害者的程序运行出现崩溃,从而获得机器控制权限,可以获取机器中存有的敏感资料,并进行恶意操作,如发送垃圾邮件,拒绝服务攻击(DoS attack),远程控制等行为破坏网络安全。

缓冲区溢出攻击的基本原理,就是恶意程序使用某种方法,将程序缓冲区中存放的数据或者信息溢出,超出缓冲区的容量,而这种溢出的数据又存放了受害者程序控制机器的恶意命令,从而给受害者程序植入恶意代码,使恶意程序获得了机器的控制权限,进而达到攻击系统的目的。

二、防范方法
1、使用受检程序,受检程序是一种编译技术,通过对程序源代码进行类型检查、安全检查等操作,来把漏洞修复好,从而起到防止缓冲区溢出攻击的作用。

2、使用数据流分析技术,它是一种动态分析技术,可以识别出恶意代码并阻止其危害,对程序运行的漏洞进行检查,从而防止攻击者利用缓冲区溢出攻击系统。

3、实行严格的安全审计制度,对程序源码、程序诊断、数据加密技术等进行严格的审计,确保程序运行的安全性,以及防止攻击者利用缓冲区溢出攻击系统。

4、采用虚拟化技术,虚拟化技术可以在不同的安全层次上对程序进行控制,对程序运行的过程进行审查,从而防止攻击者使用缓冲区溢出攻击系统。

5、对网络环境进行安全审计,包括电脑中存在的安全漏洞,系统的安全配置,网络设备的稳定性以及系统的社会工程学攻击等,从而确保网络环境能够不被缓冲区溢出攻击所侵袭。

缓冲溢出攻击实验报告

一、实验目的及要求1. 了解缓冲区溢出攻击的原理和类型。

2. 掌握缓冲区溢出攻击的实验方法和步骤。

3. 理解缓冲区溢出攻击的危害性。

4. 学习防范和避免缓冲区溢出攻击的方法。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 漏洞利用工具:Metasploit4. 实验环境搭建:使用虚拟机软件(如VMware)搭建实验环境,靶机为Windows 7 SP1,攻击机为Kali Linux。

三、实验内容1. 漏洞分析:分析实验环境中存在的缓冲区溢出漏洞。

2. 攻击实现:利用Metasploit工具对靶机进行攻击,实现远程代码执行。

3. 防御措施:学习防范和避免缓冲区溢出攻击的方法。

四、实验步骤1. 漏洞分析- 使用Ghidra工具对实验环境中的漏洞程序进行反汇编,分析程序中的缓冲区溢出漏洞。

- 发现漏洞程序存在缓冲区溢出漏洞,攻击者可以通过输入超长字符串来覆盖返回地址,从而控制程序的执行流程。

2. 攻击实现- 使用Metasploit工具中的`exploit/multi/handler`模块,设置攻击目标为靶机的IP地址和端口。

- 使用`set payload`命令设置攻击载荷,选择`windows/x64/meterpreter/reverse_tcp`,该载荷可以在攻击成功后与攻击机建立反向连接。

- 使用`set LHOST`命令设置攻击机的IP地址,使用`set LPORT`命令设置端口号。

- 使用`set target`命令设置攻击目标,选择漏洞程序的模块和参数。

- 使用`exploit`命令启动攻击,等待攻击成功。

3. 防御措施- 代码审计:对程序进行代码审计,及时发现并修复缓冲区溢出漏洞。

- 输入验证:对用户输入进行严格的验证,限制输入长度,防止输入超长字符串。

- 边界检查:在代码中添加边界检查,防止缓冲区溢出。

- 安全编程:遵循安全编程规范,使用安全的编程语言和库,避免使用存在漏洞的函数。

缓冲区溢出攻击技术系统介绍

缓冲区溢出攻击技术系统介绍缓冲区溢出攻击通常发生在程序运行时,当数据输入到缓冲区时,如果数据长度超过了缓冲区的预留空间,多余的数据就会溢出到相邻的内存区域,攻击者可以利用这个溢出现象,修改内存中的关键数据、执行恶意代码,乃至完全控制目标系统。

1. 栈溢出攻击(Stack Overflow):栈是程序执行期间用于存放数据的一块内存区域,栈溢出攻击就是在函数调用过程中,将超出栈空间的数据写入栈区,覆盖返回地址,使程序执行返回到攻击者指定的地方,执行恶意代码。

2. 堆溢出攻击(Heap Overflow):堆是用于存储动态分配内存的一块区域,堆溢出攻击是指当动态分配的堆内存未被正确管理时,攻击者通过向堆写入超长数据,改变堆内存中的关键数据,导致程序发生错误或执行恶意代码。

3.缓冲区溢出攻击变体:除了栈和堆溢出攻击,还有其他变体的缓冲区溢出攻击技术,比如格式化字符串漏洞、整数溢出、覆盖函数指针等。

这些攻击技术都利用了程序在处理输入数据时的错误处理或检查不严谨之处。

1.输入验证:对于用户输入数据,进行严格的检查和验证,限制数据长度,避免超长数据导致的溢出攻击。

2.代码审查:开发人员应定期审查代码,寻找可能存在的缓冲区溢出漏洞,并进行修补。

3.内存隔离:将关键数据与缓冲区隔离,限制缓冲区溢出攻击的影响范围。

4. 使用安全编程技术:使用安全编程语言,如Rust,或使用安全编程技术,如安全原型系统(SAFECode)等。

5.更新补丁:及时安装系统和应用程序的安全补丁,修复已知的缓冲区溢出漏洞。

总之,缓冲区溢出攻击是一种严重的计算机安全漏洞,可以导致系统被攻击者完全控制。

开发人员和系统管理员需要采取一系列措施来防止和修复这种漏洞,确保系统的安全性。

网络安全技术原理与实践 第六章 缓冲区溢出攻击


6.2 缓冲区溢出攻击方式
目前的缓冲区溢出攻击,可以按照以下方法进行分类: (1)按照溢出位置分类:栈溢出、堆溢出和BSS段溢出。 (2)按照攻击者欲达到的目标分类:在程序的地址空间里植 入适当的代码以及通过适当地初始化寄存器和存储器从而控 制程序转移到攻击者安排的地址空间去执行。 (3)按照攻击目标分类:攻击栈中的返回地址、攻击栈中保 存的旧框架指针、攻击堆或BSS段中的局部变量或参数、攻 击堆或BSS段中的长跳转缓冲区。
缓冲区溢出攻击示意图
6.3 缓冲区溢出攻击步骤
6.3.1 获取漏洞信息
缓冲区溢出漏洞信息的 获取,主要有两种途径, 一是自己挖掘,二是从漏 洞公告中获得。当前,公 布漏洞信息的权威机构主 要有 公共漏洞公告 (Common Vulnerabilities and Exposures,CVE)和计 算机应急响应小组 (Computer Emergency Response Team,CERT)中 获取漏洞信息,如图所示。
6.2.3 流程跳转技术
缓冲区溢出的一个非常关键的步骤就是要实现进程执行流程 跳转,这也正是缓冲区溢出攻击的首要目的。只有实现了流程的 跳转,才能在被攻击的主机上执行所植入的代码,实现控制被攻 击主机的目的。要实现执行流程跳转,攻击者可以通过缓冲区溢 出漏洞修改有关执行流程的管理信息,如返回地址。
6.4 缓冲区溢出攻击的防范方法
目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影: 强制写正确的代码的方法 基于探测方法的防御 对缓冲区溢出漏洞检测研究主要分为如下的三类: 1)基于源代码的静态检测技术 2)基于目标代码的检浏技术 3)基于源代码的动态检测技术 基于操作系统底层的防御 1)库函数的保护 2)操作系统内核补丁保护 (a)NOEXEC技术 (b)ASLR(Address Space Layout Randomization,地址空间结构 随机化)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档