2024山东省赛wp

Misc

签到

直接交flag

ezpic

010打开文件尾有一半flag

image-20241028201619697

另一半在blue plane 0

image-20241028201707194

flag{cf74bc8a2233179ea73b2de7499d614c}

简单编码

1
DJ?ELCaecBfBa?eeCAAB`BD?A`fgBghDChab_N

题目描述是60=?+?

想到base,但是加起来没有60的哇,然后就想到了rot47+13

image-20241028202045349

异常的流量

这题意难平了,我的二维码搞得太糊了,ps补得都识别不到。。唉

流量包打开01一看大概率跟二维码有关系

1
tshark -r 异常的流量.pcap  -T fields -e dns.qry.name

将数据提取出来,但是后面得删除重复的,后面看星爷博客才反应过来加个条件就行,当时比赛还是手提的

1
tshark -r 异常的流量.pcap -Y "ip.dst == 172.16.178.145" -T fields -e dns.qry.name

后面手动删除.localhost.dnslog.cn

ctrl+h替换就可

我拼出来的图

image-20241028202642549

看着挺清晰,可是ps识别像素的时候就有问题了,(后面明白了,是识图软件的问题。微软如是看到这样,换一个软件

image-20241028203102758

用星爷的脚本吧

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
# 导入PIL图像库和math库。
from PIL import Image
import math
# 打开文件01.txt并将其读入变量string_01。
string_01 = open('1.txt').read().replace('\n','')
# math.sqrt是开平方根的函数,输出的是float浮点数类型的数值
# int函数把接收的数值转化为int整数类型
# 这句话就是把计算string_01的长度的平方根并将其转换为整数,存入变量sqrt_len。
sqrt_len = int(math.sqrt(len(string_01)))
# 设置图像宽度和高度为sqrt_len。
width, height = sqrt_len,sqrt_len
# 创建一个新的RGB图像,长度和宽度分别为height和width。
im = Image.new('RGB',(height,width))
# 遍历图像的每一行和每一列。
for x in range(height):
for y in range(width):
# 获取string_01中对应坐标的字符并存入变量value。
value = string_01[width * x + y]
# 如果value为"0",将该坐标的像素设置为白色。
if value == "0":
im.putpixel((x,y),(255,255,255))
# 否则,将该坐标的像素设置为黑色。
else:
im.putpixel((x,y),(0,0,0))
# 显示im图像
im.show()
# 把im保存为QRcode.png
im.save('QRcode.png')

之后ps上3个定位符

QQ20241028-210611

1
flag{a04cc2c1b77c070823aa38aaf8e7e761}

Web

fly_car

js文件找到一个提示php文件,访问改cookie即可

ezmaze

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
## 去除收尾空白字符以\n分隔
# data=[[int(i) for i in v.split(" ")] for v in data.split('\n')]
# print(data)
lines = data.strip().split('\n')
# 每行进行分割
split = [line.split(" ") for line in lines]
# 将字符串列表转换为整数列表
data = [[int(i) for i in line] for line in split]
# print(data)
maze = [data[0][0]]


# 初始化数据

# 对数据进行处理,确定l1,l2,l3
def find_matching_value(n1, n2, list1):
return next((d3 for d3 in list1 if n1 + n2 == d3 or n1 - n2 == d3), None)


# 进行后续数据进行批量处理,并将符合条件的添加到数组中
for da2 in data[1]:
for da3 in data[2]:
if find_matching_value(data[0][0], da2, [da3]):
maze.append(da2)
maze.append(da3)

for i in range(3, 100):
newvalue = find_matching_value(maze[i - 2], maze[i - 1], data[i])
print(maze)
if newvalue is None:
print("nonono!")
else:
maze.append(newvalue)

print(maze)

交互版的

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
import requests
s = requests.Session()
chal_url = 'http://172.22.128.4:5000/'
datas = s.get(chal_url).text
data = [list(map(int, v.split(" "))) for v in datas.split("<br><br>")[0].split("<br>")]

lines = data.strip().split('\n')
# 每行进行分割
split = [line.split(" ") for line in lines]
# 将字符串列表转换为整数列表
data = [[int(i) for i in line] for line in split]
# print(data)
maze = [data[0][0]]


# 初始化数据

# 对数据进行处理,确定l1,l2,l3
def find_matching_value(n1, n2, list1):
return next((d3 for d3 in list1 if n1 + n2 == d3 or n1 - n2 == d3), None)


# 进行后续数据进行批量处理,并将符合条件的添加到数组中
for da2 in data[1]:
for da3 in data[2]:
if find_matching_value(data[0][0], da2, [da3]):
maze.append(da2)
maze.append(da3)

for i in range(3, 100):
newvalue = find_matching_value(maze[i - 2], maze[i - 1], data[i])
print(maze)
if newvalue is None:
print("nonono!")
else:
maze.append(newvalue)

print(maze)
maze=list(map(str,maze))
json_data={"calc":maze}
requests=s.post(chal_url, json=json_data)
print(requests.text)

数据安全

数据脱敏

花了好久写了个脚本,应该没事大问题了

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
import hashlib


def name_check(name):
if len(name) <= 2:
return name[0] + '*'
elif len(name) > 2:
return name[0] + '*' + name[2] # 姓+*+名
return name
# print(name)

def sfz_check(sfz):
if len(sfz)>= 18:
return sfz[:6] + '*' * 8 + sfz[-4:] # 前6位+8个*+后4位
return sfz

def tel_check(tel):
number = tel[:3] + '*' * 4 + tel[-4:] # 前3位+****+后4位
# print(number)
return number


# out = open('out1.txt', 'w', encoding='utf8', newline='\n')
with open('out1.txt', 'w', encoding='utf8', newline='') as out:
with open('person.txt', 'r', encoding='utf-8') as infile:
lines = infile.readlines()
for i, line in enumerate(lines):
line = line.strip()
if line:
parts = line.split(',')
if len(parts) == 3:
name = name_check(parts[0].strip())
sfz = sfz_check(parts[1].strip())
tel = tel_check(parts[2].strip())
masked_line = f"{name},{sfz},{tel}"
if i < len(lines) - 1: # 如果不是最后一行,添加换行符
masked_line += '\n'
out.write(masked_line)

with open('out1.txt', 'rb') as f:
md5_value = hashlib.md5(f.read()).hexdigest()
print(md5_value)

data_analy

某公司在统计内部员工个人信息,由于某些员工没认真填写,导致有 1% 的数据是不符合数据规范的,因此需要进行数据清洗。数据规范文档参考附件中 “个人信息数据规范文档.pdf”。最终将清洗出的不符合规范的数据保存为文本文件,处理后文件的编码为 UTF-8,换行标志为 LF (\n),无空行,flag 为 flag {文件的 32 位小写 md5 值}。

当时我手里有羊城杯的脚本,看到星爷拿了一血之后,自己对着改了好多遍,奈何最后也没成功

拿到附件,不知是不是我电脑的问题,打开csv全是乱码,编码问题,

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
import csv
import hashlib
import re

input_file = 'data.csv'
output_file = 'out.txt'
def check_id_number(num_str: str):
str_to_int = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5,
'6': 6, '7': 7, '8': 8, '9': 9, 'X': 10}
check_dict = {0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7',
6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}
if len(num_str) != 18:
return False
check_num = 0
for index, num in enumerate(num_str):
if index == 17:
right_code = check_dict.get(check_num % 11)
return num == right_code
check_num += str_to_int.get(num) * (2 ** (17 - index) % 11)


def getGender(line): # 限定性别为男或者女,且中文字符的前面和后面至少有一个逗号(避免名字中含有男、女二字造成匹配出错)
match = re.search(r"(?<!\w)(男|女)(?!\w)(?=(?:[^,]*,){0,1}(?=,|$))", line)
return match[0]
def extract_gender(id_number: str):
return "男" if int(id_number[16]) % 2 == 1 else "女"
def getName(line): # 限定名字为两个中文字符以上的连续中文
match = re.search(r"[\u4e00-\u9fa5]{2,}", line)
return match[0]


def getIDNumber(line):
match = re.search(r"\b(?:\d{17}[0-9X]|\d{15})\b", line)
return match[0]


def getBirth(idNumber): # 从身份证中获取生日
data = re.compile(r"^\d{4}-(?:0\d|1[0-9]|2[0-3])-(?:0[1-9]|[12][0-9]|3[01])$")
return data


def read_csv(file_path):
result = []
with open(file_path, 'r', encoding='utf-8') as infile:
reader = csv.reader(infile)
next(reader) # 跳过表头
for row in reader:
if len(row) >= 4:
data = {
'姓名': row[0],
'性别': row[1],
'出生日期': row[2],
'身份证号': row[3]
}
result.append(data)
return result

input_data = read_csv(input_file)
processed_data = []
for row in input_data:
# Extract birth date from ID card
id_birth_date = row['身份证号'][6:14]
formatted_birth_date = f"{id_birth_date[:4]}-{id_birth_date[4:6]}-{id_birth_date[6:]}"

if (formatted_birth_date == row['出生日期']
and check_id_number(row['身份证号'])
and getGender(row['性别'])
and extract_gender(row['身份证号']) == row['性别']):
processed_data.append(row)

# 计算差异
difference = [row for row in input_data if row not in processed_data]

# 写入差异数据到文件
with open(output_file, 'w', encoding='utf-8', newline='') as outfile:
writer = csv.DictWriter(outfile, fieldnames=['姓名', '性别', '出生日期', '身份证号'])
writer.writeheader() # 写入表头
for row in difference:
writer.writerow(row)

print(f"Difference saved to {output_file}")
with open('out.txt', 'rb') as f:
md5_value = hashlib.md5(f.read()).hexdigest()
print(md5_value)

最后手动去除开头的姓名,性别,出生日期,身份证号末尾的换行符