中文字符形近字的研究
文章描述了一个数据安全CTF题目中的问题:用户对象在处理CSV文件时遇到“银行卡”列名无法通过Python代码筛选的问题。经过分析发现,“银行卡”中的“行”实际上是康熙部首中的特殊字符(U+280B),而非普通汉字(U+884D)。由于这些部首没有拼音且难以通过常规输入法输入,推测出题人可能使用了包含康熙部首的特殊字库或特定输入方式。 2025-1-23 13:57:54 Author: www.tr0y.wang(查看原文) 阅读量:16 收藏

前几天对象和我抱怨,有一道数据安全 CTF 题,本意是给一个 csv,然后需要对其中的数据进行脱敏,里面有一列数据的列名就是 “银行卡”。她用 excel 打开这个表格,可以看到“银行卡”这个列。但是她在写 Python 代码提取数据的时候,通过类似 if col == "银行卡" 或者 col["银行卡"] 来进行筛选这个行却拿不到数据,但是打印所有列名的时候却又能看到“银行卡”这个列。

那么问题来了,我们知道即使是多音字,这个字也是一模一样的 Unicode 值,不会出现不一样的情况,如果 34892 是真正的 “行”,那 12175 又是什么字呢?

经过一番搜索,答案是康熙部首。“康熙部首”是指《康熙字典》中所采用的汉字部首分类系统,是清朝康熙年间编纂的一部权威汉字字典,它将汉字按照部首进行分类,共分为 214 个部首。这种分类方法主要依据汉字的字形和字义,具有较强的系统性,方便人们检索和排版汉字。按照大模型的说法,这些部首都是没有读音的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
import argparse

from colorama import Fore, Style

def put_color(string, color, bold=True):
if color == "gray":
COLOR = Style.DIM + Fore.WHITE
else:
COLOR = getattr(Fore, color.upper(), "WHITE")

return f'{Style.BRIGHT if bold else ""}{COLOR}{str(string)}{Style.RESET_ALL}'

trans_map = {
"一": "⼀",
"|": "⼁",
None: [
"⼃",
"⼅",
"⼇",
"⼌",
"⼍",
"⼎",
"⼐",
"⼓",
"⼕",
"⼖",
"⼙",
"⼛",
"⼞",
"⼡",
"⼢",
"⼣",
"⼧",
"⼪",
"⼬",
"⼮",
"⼵",
"⼶",
"⼹",
"⼺",
"⼻",
"⼾",
"⽁",
"⽎",
"⽏",
"⽙",
"⽦",
"⽧",
"⽨",
"⽰",
"⽱",
"⽷",
"⽾",
"⾇",
"⾋",
"⾌",
"⾑",
"⾒",
"⾓",
"⾘",
"⾙",
"⾞",
"⾡",
"⾤",
"⾧",
"⾨",
"⾫",
"⾭",
"⾱",
"⾴",
"⾵",
"⾶",
"⾺",
"⾻",
"⾽",
"⾾",
"⾿",
"⿂",
"⿃",
"⿄",
"⿆",
"⿇",
"⿈",
"⿋",
"⿌",
"⿍",
"⿑",
"⿒",
"⿓",
"⿔",
"⿕",
],
"乙": "⼄",
"二": "⼆",
"人": "⼈",
"儿": "⼉",
"入": "⼊",
"八": "⼋",
"几": "⼏",
"刀": "⼑",
"力": "⼒",
"匕": "⼔",
" 十": "⼗",
"卜": "⼘",
"厂": "⼚",
"又": "⼜",
"口": "⼝",
"土": "⼟",
"士": "⼠",
"大": "⼤",
"女": "⼥",
"子": "⼦",
"寸": "⼨",
"小": "⼩",
"尸": "⼫",
"山": "⼭",
"工": "⼯",
"己": "⼰",
"巾": "⼱",
"干": "⼲",
"幺": "⼳",
"广": "⼴",
"弋": "⼷",
"弓": "⼸",
"心": "⼼",
"戈": "⼽",
"手": "⼿",
"支": "⽀",
"文": "⽂",
"斗": "⽃",
"斤": "⽄",
"方": "⽅",
"无": "⽆",
"日": "⽇",
"曰": "⽈",
"月": "⽉",
"木": "⽊",
"欠": "⽋",
"止": "⽌",
"歹": "⽍",
"比": "⽐",
"毛": "⽑",
"氏": "⽒",
"气": "⽓",
"水": "⽔",
"火": "⽕",
"爪": "⽖",
"父": "⽗",
"爻": "⽘",
"片": "⽚",
"牙": "⽛",
"牛": "⽜",
"犬": "⽝",
"玄": "⽞",
"玉": "⽟",
"瓜": "⽠",
"瓦": "⽡",
"甘": "⽢",
"生": "⽣",
"用": "⽤",
"田": "⽥",
"白": "⽩",
"皮": "⽪",
"皿": "⽫",
"目": "⽬",
"矛": "⽭",
"矢": "⽮",
"石": "⽯",
"禾": "⽲",
"穴": "⽳",
"立": "⽴",
"竹": "⽵",
"米": "⽶",
"缶": "⽸",
"网": "⽹",
"羊": "⽺",
"羽": "⽻",
"老": "⽼",
"而": "⽽",
"耳": "⽿",
"聿": "⾀",
"肉": "⾁",
"臣": "⾂",
"自": "⾃",
"至": "⾄",
"臼": "⾅",
"舌": "⾆",
"舟": "⾈",
"艮": "⾉",
"色": "⾊",
"虫": "⾍",
"血": "⾎",
"行": "⾏",
"衣": "⾐",
"言": "⾔",
"谷": "⾕",
"豆": "⾖",
"豕": "⾗",
"赤": "⾚",
"走": "⾛",
"足": "⾜",
"身": "⾝",
"辛": "⾟",
"辰": "⾠",
"邑": "⾢",
"酉": "⾣",
"里": "⾥",
"金": "⾦",
"阜": "⾩",
"隶": "⾪",
"雨": "⾬",
"非": "⾮",
"面": "⾯",
"革": "⾰",
"韭": "⾲",
"音": "⾳",
"食": "⾷",
"首": "⾸",
"香": "⾹",
"高": "⾼",
"鬲": "⿀",
"鬼": "⿁",
"鹿": "⿅",
"黍": "⿉",
"黑": "⿊",
"鼓": "⿎",
"鼠": "⿏",
"鼻": "⿐",
}

parser = argparse.ArgumentParser()
parser.add_argument("-c", "--content", type=str, help="输入要转换的文字", required=True)

args = parser.parse_args()

raw_content = args.content
print(
f"-> {raw_content}",
)
count = 0
print("<- ", end="")
for c in raw_content:
tc = trans_map.get(c, c)
if tc != c:
tc = put_color(tc, "red")
count += 1

print(tc, end="")

print(f"\n\n[*] 修改了 {count} 个字")

由于这种部首并没有拼音,因此我推测出题人是五笔打字打出来的,不过我稍微研究了下五笔打字,tfh 打印出来的就是普通的 “行”,也不是康熙部首,不过其他部首的确有些可以打出来。有点奇怪,不知道这是咋打出来的,可能是有康熙部首的字库吧。


文章来源: https://www.tr0y.wang/2025/01/23/%E4%B8%AD%E6%96%87%E5%90%8C%E5%9E%8B%E5%BC%82%E4%B9%89%E8%AF%8D/
如有侵权请联系:admin#unsafe.sh