一.Can报文解析
基础知识
问1:什么是CAN通讯?
CAN(Controller Area Network)是一种多主机串行通信协议,最初由德国Bosch公司在1980年代为汽车工业开发。其主要目的是在不使用中央计算机的情况下,提供车载电子控制单元(ECUs)之间的高效、实时通信。由于其高可靠性和实时性。
问2:一个标准的CAN报文数据帧包含哪些主要字段?
起始帧(Start of Frame, SOF)
标识符(Identifier)
远程传输请求位(Remote Transmission Request, RTR)
控制字段(Control Field)
数据字段(Data Field)
CRC字段(CRC Field)
ACK字段(ACK Field)
帧结束(End of Frame, EOF)
问3:给如下一段 “0000110101010000100001001000101101101100110100011111101010110010111011111111” CAN数据帧报文数据,请你用16进制列出该报文的标识符、DLC以及数据域的数据。
标识符:0xD5
DLC:4
数据域的数据:0x24,0x5B,0x66,0x8F
问4:在汽车诊断通讯中常常会用到 ISO 15765 -2 传输协议。多帧数据传输分为哪几种类型的帧。
初始帧 (First Frame, FF)
连续帧 (Consecutive Frame, CF)
流控制帧 (Flow Control Frame, FC)
单帧 (Single Frame, SF) - 用于传输不超过 7 个字节的数据
问5:在汽车诊断通讯中常常会用到 ISO 14229-1 诊断协议。请你描述一下车辆对于诊断仪的诊断请求(服务标识符(Service Identifier, SID)),如何做出正响应与负响应。
正响应:SID+0x40
负响应:0x7F SID NRC
问6:CAN通讯中DBC文件是什么?
DBC文件(Database CAN)是一种用于描述CAN网络通讯的文件格式。
DBC文件的主要功能是定义和描述CAN网络中的数据结构,包括以下内容:
消息(Message):DBC文件定义了CAN总线上传输的每条消息。这包括消息的标识符(ID)、消息的长度(DLC,数据长度码)、以及消息的发送周期等。
信号(Signal):每条CAN消息包含一个或多个信号,DBC文件详细定义了这些信号的信息。例如,信号的名称、信号在消息数据帧中的位置(位数)、信号的长度(位)、数据类型、物理单位以及信号的编码方式(如标定、偏移、缩放因子等)。
节点(Node):DBC文件还定义了参与CAN通讯的节点(例如ECU,Electronic Control Unit),包括每个节点发送或接收的消息。
属性(Attribute):DBC文件可以包含一些属性,这些属性用于描述更详细的内容,如信号的物理含义、单位、取值范围等。
问7:CAN通讯中DBC文件中信号有两种编码方式?
大端编码,也称为“Motorola格式”,是将数据的高位字节存储在内存的低地址处,而低位字节存储在高地址处。换句话说,数据的最高有效位(Most Significant Bit, MSB)存储在最前面的位置。
小端编码,也称为“Intel格式”,是将数据的低位字节存储在内存的低地址处,而高位字节存储在高地址处。换句话说,数据的最低有效位(Least Significant Bit, LSB)存储在最前面的位置。
训练赛题
在CAN诊断通讯中,通常是诊断仪发送诊断请求,被测件发送诊断回复。诊断回复的CAN ID往往是诊断请求CAN ID+0x8,已知诊断请求ID为0x720。目前有一段诊断报文数据储存在asc文件中,请回答以下问题(正式比赛要求详细解题过程作为附件进行上传)。
问1:在汽车诊断通讯中,如果发送0x27诊断服务,被测件正响应如何回复?(填写诊断SID即可,直接填写16进制数)
67
问2:已知通过0x27 0x05请求seed,在获取seed后通过哪个子服务发送key?(直接填写16进制数)
06
问3:UDS诊断0x27 服务 诊断负响应表示key尝试错误次数超过限制的NRC是哪个?(直接填写16进制数)
36
问4:Key通过Seed异或操作获得,请找出异或数。(直接填写16进制数,每个byte之间不需要空格)
5f2a7e19
'''
Copyright: Shanghai Trusted Industrial Control Platform Co., Ltd.
Description: 主要用途与功能
Date: 2024-09-30 15:15:36
Author: xxx
'''
keywords = ['67 0', '27 0'] # 你要查找的两个关键字
# 打开并读取ASC文件
with open('0x27.asc', 'r', encoding='utf-8') as infile:
lines = infile.readlines()
# 打开一个新文件用于保存符合条件的行
with open('0x27_copy.asc', 'w', encoding='utf-8') as outfile:
for line in lines:
# 检查每一行是否包含任意一个关键字
if any(keyword in line for keyword in keywords):
outfile.write(line)
# 计算异或数
a = 0xA15693C4
b = 0xFE7CEDDD
result = a ^ b
print(f"{hex(a)} 异或 {hex(b)} 的结果是 {hex(result)}")
预选赛题
已有一段报文数据储存在asc文件中,报文均为CAN标准数据帧。请回答以下问题(将解题过程的代码文件及当前Excel打包上传,代码要求输入参数为附件提供的asc文件,输出结果为问题答案,每题需分别提供代码)。
问1:请写出错误CAN报文的数量。(错误类型:ID错误、DLC错误、数据域数据错误)(5分)
7
问2:请写出错误报文的编号。注:asc文件中第一帧CAN报文编号为0。(编号之间采用“|”分隔)(20分)
753|1303|2082|3281|4197|6972|7892
class ASCData:
def __init__(self, index, timestamp, channel, id, direction, type, dlc, data):
self.index = index # 编号
self.timestamp = timestamp # 时间戳
self.channel = channel # 通道
self.id = id # ID
self.direction = direction # 方向 (Rx/Tx)
self.type = type # 类型
self.dlc = dlc # 数据长度码 (DLC)
self.data = data # 数据域
def __repr__(self):
return (f"ASCData(index={self.index}, timestamp={self.timestamp}, channel={self.channel}, "
f"id={self.id}, direction={self.direction}, type={self.type}, "
f"dlc={self.dlc}, data={self.data})")
def is_valid(self):
""" 检查规则 """
# 规则1: 检查 ID 是否在 0x000 - 0x7FF 范围内
try:
id_int = int(self.id, 16) # 将 ID 转换为十六进制整数
if id_int > 0x7FF:
print("ID")
return False # ID 在范围内,返回 False
except ValueError:
print("ID")
return False # 无法解析 ID 为十六进制
# 规则2: 检查数据域中每个值是否在 0x00 - 0xFF 范围内
data_values = self.data.split()
for value in data_values:
try:
value_int = int(value, 16) # 将数据值转换为十六进制整数
if not (0x00 <= value_int <= 0xFF):
print("value error")
return False # 如果有超出范围的值
except ValueError:
print("value error")
return False # 数据值不是有效的十六进制
# 规则3: 检查数据域的长度是否与 DLC 匹配
if len(data_values) != self.dlc:
print("dlc:",len(data_values))
return False # 如果数据域的字节数不等于 DLC
return True # 如果所有规则都符合,则返回 True
data_list = []
# 打开并读取 .asc 文件
with open('error.asc', 'r', encoding='utf-8') as file:
index = 0
for line in file:
# 删除开头和结尾的空格字符
line = line.strip()
# 使用空格分隔每一行,前 6 个部分固定,最后一个作为数据域
parts = line.split(maxsplit=6)
try:
# 将最后一部分作为数据域
timestamp = float(parts[0])
channel = int(parts[1])
id = parts[2]
direction = parts[3]
type = parts[4]
dlc = int(parts[5])
# 确保有足够的字段
if len(parts) < 7:
data = ""
else:
data = parts[6] # 数据域可以包含多个空格分隔的值
# 创建 ASCData 类的实例
asc_data = ASCData(index, timestamp, channel, id, direction, type, dlc, data)
# 将实例添加到数组中
data_list.append(asc_data)
index = index + 1
except ValueError as e:
print(f"Error processing line: {line} - {e}")
# 打印保存的数组中的每个对象
# for data in data_list:
# print(data)
print("-------------------------------------------------------------------")
for data in data_list:
if not data.is_valid():
print(f"Invalid ASCData found: {data}")
在CAN诊断通讯中,通常由诊断仪发送诊断请求,被测件发送诊断回复。诊断回复的CAN ID往往是诊断请求的CAN ID+0x8。已知诊断请求的CAN ID为0x720,已有一段诊断报文数据储存在asc文件中,请回答以下问题。(将解题过程的代码文件及当前Excel打包上传,代码要求输入参数为附件提供的asc文件,输出结果为问题答案,仅第三题需提供代码)
问1:在汽车诊断通讯中,如果发送0x22诊断服务,被测件正响应如何回复?(填写16进制数的诊断SID)(5分)
62
问2:UDS诊断0x22 服务请求通常用来读取数据,请写出读取VIN码的DID。(填写16进制数)(5分)
F190
问3:请找出asc文件中的VIN码。(直接填写ASCII码)(10分)
CCFSoftwareTICPsh
'''
Copyright: Shanghai Trusted Industrial Control Platform Co., Ltd.
Description: 主要用途与功能
Date: 2024-10-08 17:34:50
Author: xxx
'''
keywords = [' 720 ', ' 728 '] # 你要查找的两个关键字
# 打开并读取ASC文件
with open('0x22.asc', 'r', encoding='utf-8') as infile:
lines = infile.readlines()
# 打开一个新文件用于保存符合条件的行
with open('0x22_copy.asc', 'w', encoding='utf-8') as outfile:
for line in lines:
# 检查每一行是否包含任意一个关键字
if any(keyword in line for keyword in keywords):
outfile.write(line)
# 找到关键报文后,开始进行数据域解析
# 243.349582 1 728 Rx d 8 10 14 62 F1 90 43 43 46
# 243.441302 1 728 Rx d 8 21 53 6F 66 74 77 61 72
# 243.441542 1 728 Rx d 8 22 65 54 49 43 50 73 68
二.应用安全
基础知识
问1:在Android应用开发中,APK文件是应用的最终打包格式。请详细说明以下几点:
1、APK文件的结构组成部分有哪些?分别有什么作用?
2、AndroidManifest.xml文件的作用是什么?它包含哪些主要信息?
3、如何检查一个APK文件的证书、签名、算法等信息?请描述检查步骤和工具。
4、APK文件的签名过程:
5、列举APK文件中的四大组件,简要说明每个组件的作用,并阐述如何确定某组件的安全性。
6、APK文件的权限是如何声明的?请给出一个常见权限的声明示例。
1、APK文件的结构组成部分有哪些?分别有什么作用?
· META-INF目录:包含应用的签名信息和清单文件,用于验证APK的完整性和真实性。以下是该目录下包含的部分关键文件:
MANIFEST.MF:清单文件,列出了APK中所有文件的哈希值。
CERT.RSA:签名文件,包含应用开发者的签名。
CERT.SF:签名清单文件,列出了APK中所有文件的哈希值及其签名。
· res目录:存储应用使用的资源文件(如布局文件、图片、字符串等),在编译时不会被压缩。
· lib目录:包含针对不同处理器架构的本地库文件(如lib/armeabi、lib/armeabi-v7a等)。
· assets目录:存储原始的资源文件。
· AndroidManifest.xml文件:声明应用的基本信息、组件、权限等,详细作用见第2题。
· classes.dex文件:包含应用的字节码文件,由Java源文件编译而成,在Android设备上运行。
· resources.arsc文件:包含预编译的二进制资源文件,如字符串、颜色、尺寸等,供应用使用。
· res和raw目录:存储应用使用的各种资源文件和未编译的资源文件。
2、AndroidManifest.xml文件的作用是什么?它包含哪些主要信息?
· 声明应用的包名、应用组件(activity、service、receiver、provider)、应用所需的权限、应用的最低和目标SDK版本、硬件和软件特性等。
· 主要包含的标签:
<application>:定义应用的基本属性和组件。
<activity>:声明一个活动组件。
<service>:声明一个服务组件。
<receiver>:声明一个广播接收器组件。
<provider>:声明一个内容提供者组件。
<uses-permission>:声明应用所需的权限。
<uses-feature>:声明应用需要的硬件或软件特性。
3、如何检查一个APK文件的证书、签名、算法等信息?请描述检查步骤和工具。
使用keytool命令:keytool -printcert -jarfile your-app.apk,查看各项信息。
4、APK文件的签名过程:
生成密钥库:首先,需要生成一个密钥库(keystore)文件,其中包含一个私钥和证书。可以使用以下命令生成:
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias
该命令生成一个新的 RSA 密钥对(2048 位),并将其存储在名为 my-release-key.jks 的密钥库中。密钥的别名为 my-key-alias,有效期为 10000 天(大约 27 年)。
构建未签名的APK:通过构建工具(如Gradle)生成未签名的APK文件,也可对已签名的APK文件进行证书删除的操作。可以使用apktool工具将APK文件解压,在解压后的META-INF目录下删除MANIFEST.MF、CERT.RSA、CERT.SF文件,并使用apktool工具重新打包。
使用私钥进行签名:使用jarsigner工具对APK文件进行签名:
jarsigner -verbose -keystore my-release-key.jks -signedjar signed-app.apk unsigned-app.apk my-key-alias
验证签名:使用apksigner工具验证签名:
jarsigner -verify -verbose -certs signed-app.apk
5、列举APK文件中的四大组件,简要说明每个组件的作用,并阐述如何确定某组件的安全性。
Activity:用户界面的一个单一屏幕。负责与用户交互,通常代表一个页面。
Service:在后台运行的任务,不提供用户界面。用于执行长时间运行的操作。
BroadcastReceiver:用于接收和处理广播消息。允许应用监听和响应系统或其他应用发出的广播。
ContentProvider:用于管理应用间的数据共享。提供一个标准接口供其他应用访问和修改应用的数据。
检查权限导出属性android:exported 属性,如果设置为 true,则组件可以被其他应用访问,需要仔细评估其安全性。如果组件具有隐式意图过滤器(<intent-filter>),则默认可导出,确保对外暴露的组件已实现适当的安全控制。
对于可以被其他应用访问的可导出组件,应该为组件声明适当的权限,限制只有持有相应权限的应用才能访问。
6、APK文件的权限是如何声明的?请给出一个常见权限的声明示例。
权限声明通过在AndroidManifest.xml中添加<uses-permission>标签来实现。
示例:<uses-permission android:name="android.permission.INTERNET"/>,声明应用需要访问网络的权限。
问2:Android系统是一种常见的操作系统,广泛应用于手机、车机等设备。请详细说明以下几点:
1、Android系统的内核是基于何种系统开发的?在此基础上做了哪些调整和优化?
2、通过何种方式,可以便捷地对Android设备进行调试?
3、某汽车采用Android系统作为其操作系统,是否应向用户开放最高权限?应如何检测其是否向用户开放最高权限?
4、请设计一个检测应用程序运行时是否以明文的形式将敏感信息打印在系统日志中的方案(提示:可考虑正则表达式)
1 、Android系统的内核是基于何种系统开发的?在此基础上做了哪些调整和优化?
Android系统的内核是基于Linux系统开发的,在此基础上进行了多方面的调整和优化,以适应移动设备的特殊需求。以下是具体方面及其调整和优化:
(1).内存管理
基于Linux的部分:
使用Linux内核的虚拟内存管理机制,支持分页和交换等特性。
Android的调整和优化:
添加了专门的低内存杀手(Low Memory Killer)机制,优先杀掉后台进程以释放内存。
优化内存分配和回收策略,确保应用在低内存环境下仍能流畅运行。
(2).电源管理
基于Linux的部分:
采用Linux内核的基本电源管理机制,如ACPI和APM。
Android的调整和优化:
引入了WakeLock机制,允许应用程序控制设备的休眠状态,优化电池使用。
实现了更精细的电源管理策略,降低设备在待机状态下的能耗。
(3).安全机制
基于Linux的部分:
使用Linux的用户权限和文件系统权限管理机制。
支持Linux内核的安全模块(LSM),如SELinux。
Android的调整和优化:
引入了应用沙箱机制,每个应用运行在独立的用户空间,增强了应用隔离性。
采用基于权限的安全模型,应用安装时需请求用户授权。
整合SELinux以加强系统的整体安全性。
(4).进程间通信(IPC)
基于Linux的部分:
使用Linux内核提供的基本进程间通信机制,如管道、消息队列和共享内存。
Android的调整和优化:
引入了Binder IPC机制,提供高效的进程间通信,支持远程过程调用(RPC)。
(5).文件系统
基于Linux的部分:
支持Linux的多种文件系统,如ext4、vfat等。
Android的调整和优化:
使用YAFFS2或ext4文件系统,以适应闪存存储的需求。
添加了日志文件系统,确保文件系统的可靠性和稳定性。
(6).驱动支持
基于Linux的部分:
利用Linux内核的设备驱动模型,支持各种硬件设备。
Android的调整和优化:
定制和优化驱动,以支持特定的移动设备硬件,如摄像头、GPS、加速度计等。
集成特定厂商的驱动程序,确保设备的兼容性和性能。
(7).用户空间
基于Linux的部分:
使用标准的C库(glibc)和POSIX接口,支持常见的用户空间应用。
Android的调整和优化:
使用轻量级的Bionic C库,优化内存和性能。
集成Dalvik虚拟机(后来的ART虚拟机),支持Java应用的执行。
(8).网络管理
基于Linux的部分:
采用Linux的网络堆栈,支持TCP/IP协议。
Android的调整和优化:
优化Wi-Fi和移动数据连接的切换机制。
实现更精细的网络权限控制,提升应用的网络使用安全性。
(9).多媒体框架
基于Linux的部分:
利用Linux内核提供的基本音频和视频支持。
Android的调整和优化:
集成OpenMAX和Stagefright多媒体框架,支持多种多媒体格式和编解码器。
优化音视频处理性能,确保在移动设备上的流畅播放。
2、通过何种方式,可以便捷地对Android设备进行调试?
使用ADB(Android Debug Bridge)可以便捷地对Android设备进行调试,ADB是Android SDK中的一个多功能工具,允许你直接与Android设备进行通信:
· 启用USB调试:首先在Android设备上启用开发者选项,然后启用USB调试(在“设置”->“关于手机”->“软件信息”中点击版本号7次以启用开发者选项);其他设备启用开发者选项的方式与此类似,也可咨询设备厂商。
· 连接设备:通过USB连接设备,或者使用adb connect <设备IP>连接到无线网络上的设备。
· 常用ADB命令:
adb devices:列出所有连接的设备。
adb logcat:查看实时日志输出。
adb shell:访问设备的命令行界面,进入命令行界面后,操作系统的命令与Linux类似。
adb install/uninstall <apk>:安装或卸载应用程序。
adb push/pull <本地文件> <设备文件>:在本地计算机和设备之间传输文件。
3、某汽车采用Android作为其操作系统,是否应向用户开放最高权限?应如何检测是否向用户开放最高权限?
汽车上的操作系统不建议向用户开放最高权限,理由如下:
开放Root权限会增加恶意软件获取最高权限的风险,可能导致系统和用户数据被破坏或泄露;Root权限可能会让用户修改关键的车辆控制系统,从而影响车辆的安全性和正常操作,例如制动系统、导航系统等。
通过Adb命令尝试获取Root权限,如果成功获取,则表明该设备向用户开放了最高权限
adb shell;
su;
或
adb root;
等命令。
4、请设计一个检测应用程序运行时是否以明文的形式将敏感信息打印在系统日志中的方案(提示:可考虑正则表达式)
通过adb logcat | grep <应用程序包名>或adb logcat | grep <进程ID>获取待测应用程序的日志,应用程序包名可通过manifest文件查看,进程ID可通过adb shell ps | grep <应用程序包名>查看;
根据需要检测的敏感信息(如手机号码、ip地址、邮箱等),编写正则检测脚本;
对获取到的应用程序日志进行正则检测。
预选赛题
一、请下载提供的apk文件,并回答以下问题: 1、该apk文件的包名为(请填写包原名)(1分): |
com.byd.bydautolink |
2、该apk文件使用的哈希算法为(1分): |
sha-256(提到关键字即可,不区分大小写) |
3、该哈希算法当前是否安全(请回答是或否)(1分): |
是 |
4、该apk文件使用的公钥算法为(1分): |
RSA-2048bit(提到关键字即可,不区分大小写) |
5、该公钥算法当前是否安全(请回答是或否)(1分): |
是 |
6、该apk文件是否启用了调试模式(请回答是或否)(1分): |
否 |
7、该apk文件是否启用了可备份模式(请回答是或否)(1分): |
否 |
8、列出该apk文件包含的5个权限(请填写权限原名,用“、”隔开)(5分): |
android.permission.INTERNET、 android.permission.ACCESS_WIFI_STATE、android.permission.CHANGE_NETWORK_STATE、android.permission.ACCESS_NETWORK_STATE、 android.permission.SCHEDULE_EXACT_ALARM (答案不唯一) |
9、若该apk文件为某款热门单机游戏,其是否遵循了权限最小化原则( 请回答是或否),并在下一行内说明理由(3分): |
否 |
作为单机游戏,该apk文件申请了多项超出其业务范围的权限(答案意思相近即可) |
10、列出该apk文件包含的5个组件(要需要包含每种组件类型的至少一种,请填写组件原名,用“、”隔开)(5分): |
com.byd.bydautolink.splash.SplashActivity、com.bydautolink.module_message.domain.MessageService、 com.bydautolink.module_message.domain.MessageReceiver、com.byd.bydautolink.firebaseinitprovider、com.bydautolink.module_homepage.NotNetLinkActivity (答案不唯一) |
11、该apk文件包含的组件中,最可能具有安全隐患的是哪一个(请填写组件原名),并在下一行内说明理由(5分): |
com.byd.bydautolink.splash.SplashActivity、 com.google.firebase.iid.FirebaseInstanceIdReceiver、 androidx.profileinstaller.ProfileInstallReceiver、 cn.jiguang.privates.common.component.JCommonActivity 其中任选一个 |
提到exported="true"即可 |
三.Ai安全
基础知识
问1:在人工智能中,什么叫对抗性特征? |
对抗性特征(Adversarial Features)通常是指在机器学习模型,尤其是在深度学习中,对输入数据进行细微的、有计划的修改,这些修改能够欺骗模型做出错误的预测或分类。这类特征对人类观察者而言通常是不可察觉的,但可以使模型的输出发生显著变化。对抗性特征的主要应用包括测试和增强模型的鲁棒性。通过生成对抗性样本并用这些样本训练模型,可以提高模型对此类攻击的防御能力。这是一种安全领域的重要研究,特别是在自动驾驶汽车、面部识别系统等关键应用中具有重要意义。 |
问2:在人工智能领域里,对抗性攻击中的黑盒攻击方法和白盒攻击方法分别指什么? |
在人工智能安全领域,对抗性攻击通常分为黑盒攻击和白盒攻击,这两种攻击方式基于攻击者对目标模型的知识程度有所不同。白盒攻击是指攻击者拥有目标模型的详尽信息,包括模型的架构、权重、训练数据等所有内部细节。在这种情况下,攻击者可以精确地计算出如何修改输入数据来导致模型做出错误的预测。黑盒攻击是指攻击者没有关于目标模型内部结构或参数的直接知识。攻击者可能只能根据模型对外部输入的响应来推断信息。黑盒攻击更贴近现实世界的攻击场景,因为攻击者往往不能直接访问目标模型的所有内部信息 |
问3:按照训练的阶段划分,针对神经网络的攻击方法包括哪些? |
针对神经网络的攻击方法可以根据训练的阶段划分为几种类型,主要包括数据中毒攻击、模型中毒攻击、对抗样本攻击,以及模型提取攻击。这些攻击针对神经网络在不同阶段的脆弱性,包括训练时、后训练时和部署时。 数据中毒攻击发生在模型的训练阶段。攻击者通过篡改训练数据(例如插入错误的标签或插入恶意样本)来影响模型的训练过程。目标是让模型在特定输入上表现不正常或使整个模型性能下降。这种攻击方式要求攻击者能够以某种方式影响训练数据集。 模型中毒攻击同样发生在训练阶段。与数据中毒不同的是,模型中毒攻击直接在模型训练的过程中加入恶意代码或特定参数修改,使得模型在部署后的特定条件下执行预定行为(比如在遇到特定输入时故意做出错误判断)。这种攻击更难以实现,因为它通常需要对训练过程有更深入的控制或了解。 对抗样本攻击通常发生在模型部署后。攻击者通过精心设计输入数据的微小扰动,使得模型做出错误的预测。这种攻击可以在白盒环境(攻击者知道模型细节)或黑盒环境(攻击者不知道模型细节)下进行。 模型提取攻击目标是复制或近似模拟一个已部署的模型。这种攻击通常通过大量查询部署的模型并使用返回的预测来训练一个新的模型实现。虽然这种攻击不直接破坏原始模型的性能,但它侵犯了知识产权并可能使得其他攻击(如对抗样本攻击)更易实施。 |