2024年“羊城杯”粤港澳大湾区网络安全大赛 AI部分
Author:Ns100kUp
From:极安云科-服务中心
Data:2024/08/27
Copyright:本内容版权归属极安云科,未经授权不得以任何形式复制、转载、摘编和使用。
培训、环境、资料、考证
公众号:Geek极安云科
网络安全群:624032112
网络系统管理群:223627079
网络建设与运维群:870959784
极安云科专注于技能提升,赋能
2024年广东省高校的技能提升,受赋能的客户院校均获奖!
2024年江苏省赛一二等奖前13名中,我们赋能客户占五支队伍!
2024年湖南省赛赋能三所院校均获奖!
2024年山东省赛赋能两所院校均获奖!
2024年湖北省赛赋能参赛院校九支队伍,共计斩获一等奖2项、三等奖7项!
1.NLP_Model_Attack
根据题目要求:要求进行 NLP 对抗,第一反应是操作 unicode 坏字符以及相似字符,让 GPT 写了如下代码,但仅达到 %38
import pandas as pd
import random
import textattack
from textattack.augmentation import WordNetAugmenter
# Unicode 坏字符(零宽度字符)
unicode_bad_chars = ['\u200B', '\u200C', '\u200D', '\uFEFF'] # 常见的零宽度字符
def add_unicode_bad_chars(text, num_chars=1):
"""在文本中随机位置插入 Unicode 坏字符"""
text_list = list(text)
for _ in range(num_chars):
position = random.randint(0, len(text_list) - 1)
bad_char = random.choice(unicode_bad_chars)
text_list.insert(position, bad_char)
return ''.join(text_list)
# 读取 CSV 文件
csv_file_path = '/Users/leadlife/Downloads/tempdir/AI附件/附件/original_text.csv' # 替换为你的 CSV 文件路径
df = pd.read_csv(csv_file_path)
# 使用 TextAttack 的扰动方法创建攻击
attack = WordNetAugmenter()
# 定义列表来存储攻击文本
attacked_texts = []
# 对每一行应用攻击
for index, row in df.iterrows():
text = row['text'] # 替换为 CSV 文件中包含文本的列名
augmented_texts = attack.augment(text)
# 添加 Unicode 坏字符并保存所有变体
all_attacked_texts = [add_unicode_bad_chars(t, num_chars=2) for t in augmented_texts] # 可以调整 num_chars 以增加坏字符的数量
attacked_texts.append('\n'.join(all_attacked_texts))
# 创建一个新的 DataFrame 存储攻击文本
attacked_df = pd.DataFrame({
'original_text': df['text'], # 保留原始文本
'attacked_text': attacked_texts # 攻击文本
})
# 输出到新的 CSV 文件
output_csv_file_path = 'attacked_texts_with_unicode.csv' # 替换为输出的 CSV 文件路径
attacked_df.to_csv(output_csv_file_path, index=False)
print(f"攻击文本已保存到 {output_csv_file_path}")
参考 nlp 攻击文章:
1.https://www.cnblogs.com/zzk0/p/16993693.html
2.https://medium.com/besedo-engineering/nlp-attacks-part-1-why-you-shouldnt-trust-your-text-classification-models-37947853b1a5
3.https://rexarski.com/posts/2023/01/adversarial-attacks-with-textattack/
其中使用 textattack 这个操作,但环境一直报错,根据对抗思路,可替换相似干扰字符,以及添加干扰词汇从而达到目的,进而使用 GPT 辅助编写出如下代码:
import pandas as pd
import random
# Load the original data
df = pd.read_csv('/Users/leadlife/Downloads/tempdir/AI附件/附件/original_text.csv')
# Define the perturbation function
def perturb_text(text):
# Define a similar character mapping
char_map = {
'a': ['@', '4'],
'e': ['3', 'ë'],
'i': ['1', 'î'],
'o': ['0', 'ο'],
's': ['$'],
'l': ['1', '|'],
't': ['7'],
'g': ['9'],
'b': ['8'],
'c': ['(', '<'],
'u': ['µ'],
'd': ['|)'],
'p': ['ρ']
}
# Define perturbation methods
perturbations = [
lambda x: x.replace(' ', ''), # Remove all spaces
lambda x: x + random.choice(['!', '.', '!!', '...']), # Add random punctuation
lambda x: x[::-1], # Reverse the text
lambda x: x.upper(), # Convert to uppercase
lambda x: x.lower(), # Convert to lowercase
lambda x: ''.join(random.choice([c.upper(), c.lower()]) for c in x), # Random capitalization
lambda x: ''.join(random.choice(char_map.get(c.lower(), [c])) for c in x), # Replace with similar chars
lambda x: x.replace(' ', '·'), # Replace spaces with middle dot
lambda x: x.replace(' ', '_'), # Replace spaces with underscore
lambda x: x.title(), # Capitalize each word
lambda x: ''.join(random.choice([c, random.choice(char_map.get(c.lower(), [c]))]) for c in x), # Randomly replace some chars
lambda x: ' '.join(random.sample(x.split(), len(x.split()))) # Shuffle words in the sentence
]
# Generate a unique set of perturbations
applied_perturbations = set()
while len(applied_perturbations) < 20:
perturbation = random.choice(perturbations)
perturbed_text = perturbation(text)
if perturbed_text != text: # Avoid adding unchanged text
applied_perturbations.add(perturbed_text)
return list(applied_perturbations)
# Generate adversarial text examples
attacked_texts = []
for _, row in df.iterrows():
original_text = row['text']
perturbed_texts = perturb_text(original_text)
for perturbed_text in perturbed_texts:
attacked_texts.append({
'id': row['id'],
'text': original_text,
'original_class': row.get('original_class'),
'original_label': row.get('original_label'),
'attacked_text': perturbed_text
})
# Save the perturbed texts to a CSV file
attacked_df = pd.DataFrame(attacked_texts)
attacked_df.to_csv('attacked_texts_use.csv', index=False)
print("Perturbation completed and saved to 'attacked_texts.csv'.")
得到数据集:
提交,成功获得 flag