目录
Misc1 工业互联网模拟仿真数据分析
使用wireshark打开pcap文件
第一问
在某些网络会话中,数据包可能保持固定大小,请给出含有此确定性特征的会话IP地址和数据包字节大小值。
答案:IP地址:XX.XX.XX.XX,XX.XX.XX.XX,…,数值:XX
(补充说明:IP顺序从小到大排列,涉及的IP个数由选手自己判断)
观察发现,IP地址为192.168.1.2和192.168.1.4之间的数据包长度固定为24。
答案:192.168.1.2,192.168.1.4,24
第二问
题目二:通信包数据某些字段可能为确定的,请给出确定字节数值。
使用tshark命令行工具从pcap文件中提取并显示数据字段,可以看到前四位2024,则确定字节数值为2024
tshark -r 工业互联网模拟仿真数据.pcap -T fields -e data.data
答案:2024
第三问
一些网络通信业务在时间序列上有确定性规律,请提供涉及的IP地址及时间规律数值(小数点后两位)
答案:IP地址:XX.XX.XX.XX,XX.XX.XX.XX,…,数值:XX
经观察,IP地址为192.168.1.3和192.168.1.5之间的通信时间间隔固定为0.06
答案:192.168.1.3,192.168.1.5,0.06
第四问
一些网络通信业务存在逻辑关联性,请提供涉及的IP地址
答案:XX.XX.XX.XX,XX.XX.XX.XX,…
观察发现从第22个包到第77包,是按照192.168.1.3->192.168.1.2->192.168.1.6的方式传输数据包,可以推测出这三个ip存在逻辑关联性
答案:192.168.1.2,192.168.1.3,192.168.1.6
第五问
网络数据包往往会添加数据完整性校验值,请分析出数据校验算法名称及校验值在数据包的起始位和结束位(倒数位)
答案:XXXXX,X,X
依据补充说明,数据校验算法名称长度为5个字符,其中英文字母大写,可以猜测是CRC16,CRC32,CRC64之一。
CRC16,位数:16位,对应4位的十六进制
CRC32,位数:32位,对应8位的十六进制
CRC64,位数:64位,对应16位的十六进制
进行尝试,假设数据校验算法为CRC16
CRC校验值通常在数据包的尾部,起始位为4,则结束位为1(倒数位)
组成答案:CRC16,4,1
192.168.1.2,192.168.1.4,24
2024
192.168.1.3,192.168.1.5,0.06
192.168.1.2,192.168.1.3,192.168.1.6
CRC16,4,1
将数据带入flag.py中得到flag
Misc2 Number_is_the_key
The answers to the questions are hidden in the numbers.
1.打开附件中的excel表格,随便点击,发现有些单元格的字形为粗体
2.Ctrl+H进入替换页面,T进入选项
3.在查找内容后的格式下拉栏中选择设置格式,在字体中设置字形为粗体
在替换为后的格式下拉栏中选择设置格式,在图案中设置颜色为黑色
后Ctrl+A进行全选,最后点击全部替换,即可将字形为粗体的单元格填充为黑色,得到变形的二维码
4.修改行高和列高,经测试行高设为10mm,列宽设为1mm即可得到正常的二维码
5.使用CodeTwo QR Code Desktop Reader & Generator扫描二维码即可拿到flag
Misc3 FunZip
The flag is hidden in the Zip.
1.打开附件中的txt文件,可以看出是删除=的base64隐写
2.使用Puzzle Solver工具即可获取flag
Misc4 精装四合一
分离,我们是破碎的;团结,我们将成为神。我们终将在二进制的反复与隐藏之中破解自身的密码
1.对几张图片进行搜索,可以得知它们为经过颜色反转后的《游戏王》中的卡片,盲猜此处有什么暗示。
2.PNG文件头十六进制是89 50 4E 47,文件尾是AE 42 60 82
使用010 Editor打开图片,四张图片的文件头没有问题,文件尾都有一堆冗余数据
3.由于前面说到了图片是经过颜色反转的,考虑异或FF,观察AE 42 60 82后的四个字节和FF异或
AF EB F7 6E和FF异或后得到50 14 08 91
B4 FF FF A7和FF异或后得到4B 00 00 58
FC FE D6 56和FF异或后得到03 01 29 A9
FB FF B4 0D和FF异或后得到04 00 4B F2
自然可以联想到ZIP的文件头十六进制是50 4B 03 04
那么现在就可以推测出,四个图片分别按顺序存取了一个zip文件的字节序列,第一个图存取zip文件的第1+4n个字节,第二个图存取zip文件的第2+4n个字节,第三个图存取zip文件的第3+4n个字节,第四个图存取zip文件的第4n个字节
4.删除四幅图的png文件尾及其前面的内容,后面的内容异或ff,然后按照顺序保存为1.png,2.png,3.png ,4.png
5.编写脚本对四个文件进行拼接得到5.zip,由于1.png多一个字节,所以要在最后多加一次拼接
fp1 = open('1.png','rb')
fp2 = open('2.png','rb')
fp3 = open('3.png','rb')
fp4 = open('4.png','rb')
fp5 = open('5.zip','wb')
for i in range(3176):
fp5.write(fp1.read(1))
fp5.write(fp2.read(1))
fp5.write(fp3.read(1))
fp5.write(fp4.read(1))
fp5.write(fp1.read())
6.解压压缩包需要密码
7.使用Archpr暴力破解压缩包密码获取:65537,这个值在RSA中经常用到
8.解压获得一个word文档,打开获得以下内容
9.在word选项里面勾选“隐藏文字”,将白色图片挪开即可看到一串数字,将该数字放入factordb.com中发现能分解为两个质数,结合前面的65537,可以想到这道题涉及RSA,两个质数为p和q,e为65537
10.将docx文件用010Editor打开,看到该文件以50 4B 03 04开头,即为ZIP的文件头的十六进制
11.将docx文件后缀改为zip后解压,在media文件夹下获取一个文件 true_flag.jpg,应该是加密的内容,用010Editor打开该jpeg文件,获取一串数字,这大概率为密文
12.经典RSA加密,使用脚本解出明文m
from Crypto.Util.number import *
with open(r"true_flag.jpeg", 'rb') as f:
c = f.read()
c = bytes_to_long(c)
p = 167722355418488286110758738271573756671
q = 100882503720822822072470797230485840381
e = 65537
d = inverse(e, (p - 1) * (q - 1))
m = pow(c, d, p * q)
print(long_to_bytes(m))
Misc5 RSA_KU
1.浅看RSA
(1)选择两个大的质数,计算出模数 N = p * q
(2)计算欧拉函数φ(N) = (p-1) * (q-1),然后选择一个e(1<e<φ),并且e和φ互质
(3)求取e的模反数d,计算方法为:e * d ≡ 1 (mod φ)
(4)对明文m进行加密:c = m^e mod N,可以得到密文c。
(5)对密文c进行解密:m = c^d mod N,可以得到明文m。
2.进行数学运算
3.跑脚本获取flag
from Crypto.Util.number import *
n = 129699330328568350681562198986490514508637584957167129897472522138320202321246467459276731970410463464391857177528123417751603910462751346700627325019668100946205876629688057506460903842119543114630198205843883677412125928979399310306206497958051030594098963939139480261500434508726394139839879752553022623977
e = 65537
c = 83035638936364285159735560243951015476618929906011085251127005327997756734419280176613600681775628173599403213306869322022621736529699201305599432253254448323152744269999324245055533799837418376119885301839668977207523195546818431479433135393751416468948768673918659368535224367424584534834743191603848316722
n1= 129699330328568350681562198986490514508637584957167129897472522138320202321246467459276731970410463464391857177528123417751603910462751346700627325019668067056973833292274532016607871906443481233958300928276492550916101187841666991944275728863657788124666879987399045804435273107746626297122522298113586003834
n2= 129699330328568350681562198986490514508637584957167129897472522138320202321246467459276731970410463464391857177528123417751603910462751346700627325019668066482326285878341068180156082719320570801770055174426452966817548862938770659420487687194933539128855877517847711670959794869291907075654200433400668220458
phi=n-(n-n1+n-n2+4)//3+1 #向下取整
d=inverse(e,phi) #使用inverse函数计算e在模phi下的乘法逆元,即私钥d
m=pow(c,d,n)
print(long_to_bytes(m))
Misc6 时间刺客
2024年10月14日早8点,小明敲键盘时候解出了flag
1.使用wireshark打开附件中的.pcap文件,为usb流量包,数据长度为八个字节,则为键盘流量压缩包有密码无法解压
2.在kali linux中使用tshark的命令提取键盘数据
tshark -r 给你也用不了.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
3.打开usbdata.txt发现没有引号,编写脚本添加引号
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16: # 鼠标流量的话len改为8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()
4.最后用脚本提取输入获得FLAGPR3550NWARDSA2FEE6E0,移除FLAG,获取压缩密码:PR3550NWARDSA2FEE6E0
mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." }
nums = []
keys = open('out.txt')
for line in keys:
if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':
continue
nums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:
if n == 0 :
continue
if n in mappings:
output += mappings[n]
else:
output
print ('output :\n' + output)
5.对文件进行解压,打开文件夹,可以看到里面有18个文件,文件内容为空,由于题目是时间刺客,考虑时间戳隐写
6.读取txt文件的时间信息,可以看出分秒数是存在问题的
import rarfile
#根据压缩包改名
rarf = rarfile.RarFile('29.rar')
for i in range(18):
name = f'29/.{i}.txt'
datetime = rarf.getinfo(name).date_time
print(datetime)
7.编写脚本,把分和秒的秒数相加求总秒数,转换成ASCII码,可以得到flag
import rarfile
#根据压缩包改名
rarf = rarfile.RarFile('./29.rar')
flag = ''
dict = {}
for i in range(18):
name = f'29/.{i}.txt'
datetime = rarf.getinfo(name).date_time
out = datetime[-2] * 60 + datetime[-1]
dict[i] = chr(out)
print(dict)
for i in range(18):
flag += dict[i]
print(flag)
Misc7 Where_is_the_flag
The flag is hidden. Please find where it is.
1.pyc文件是py文件编译后生成的字节码文件
使用pyc在线编译工具对pyc文件进行反编译得到源码 在线Python pyc文件编译与反编译
得到一个用于解密的Python脚本,使用AES加密算法的ECB模式。提示用户输入一个密钥,然后将密钥与固定字符串组合以生成24字节长的密钥来解密给定的密文。
c 是给定的密文:27c55f4960ad314b8d3a08d9cd69cc45bc698dec61c3adf0eb35c194e21a9061,需要获取key。
2.pyc文件隐写,可以使用stegosaurus工具获得pyc文件中的隐藏信息,所用python环境需要是3.6版本及更低
stegosaurus工具:https://github.com/AngelKitty/stegosaurus
python stegosaurus.py Where_is_the_flag.pyc -x
拿到key:k5fgb2eur5styn0lve3t6r1s
3.使用Cyberchef进行AES解密获取flag
Misc8 成语学习
我把学习资料拷贝给你一份
1.解压压缩包需要密码
2.先进行pcap流量包的分析,流量包数量很多,过滤http协议,发现有个PNG,点开一段一段看查看,发现后面上传了一张图片,PNG文件头十六进制是89 50 4E 47
3.将该图片对应的十六进制码导出,改后缀名为png,即可得到一张图片
4.很明显图片的宽和高有问题,修改高度改成和宽度一样,即可拿到key:57pmYyWt
5.使用key解压压缩包得到一个文件,拖到010Editor 里发现了ZIP文件头即89 50 4E 47
6.将该文件的后缀名改为.zip,再次解压拿到许多文件夹,O7avZhikgKgbF下有个flag.txt
7.HMAC加密,加密内容是文件里面的成语“天大地大”,密钥就是“coconut”,就可以拿到flag了
Misc9 钢铁侠在解密
这天钢铁侠在自己的相册旁边发现了一张字条,他觉得两个message之间指定有点东西~
1.打开文件一张小字条.txt,由N和e可以想到RSA,此处信息不足,试图从图片中获取信息
2.把图片放进SilentEye工具进行提取得到row_13.txt,打开文件获取c1和c2,此处应是富兰克林攻击,即当同一个明文通过不同的公钥加密时,可以通过数学关系推导出原始明文
3.写脚本进行攻击,即可获取flag
脚本使用了SageMath特有的库和函数,用SageMath环境运行
def HGCD(a, b):
if 2 * b.degree() <= a.degree() or a.degree() == 1:
return 1, 0, 0, 1
m = a.degree() // 2
a_top, a_bot = a.quo_rem(x ^ m)
b_top, b_bot = b.quo_rem(x ^ m)
R00, R01, R10, R11 = HGCD(a_top, b_top)
c = R00 * a + R01 * b
d = R10 * a + R11 * b
q, e = c.quo_rem(d)
d_top, d_bot = d.quo_rem(x ^ (m // 2))
e_top, e_bot = e.quo_rem(x ^ (m // 2))
S00, S01, S10, S11 = HGCD(d_top, e_top)
RET00 = S01 * R00 + (S00 - q * S01) * R10
RET01 = S01 * R01 + (S00 - q * S01) * R11
RET10 = S11 * R00 + (S10 - q * S11) * R10
RET11 = S11 * R01 + (S10 - q * S11) * R11
return RET00, RET01, RET10, RET11
def GCD(a, b):
print(a.degree(), b.degree())
q, r = a.quo_rem(b)
if r == 0:
return b
R00, R01, R10, R11 = HGCD(a, b)
c = R00 * a + R01 * b
d = R10 * a + R11 * b
if d == 0:
return c.monic()
q, r = c.quo_rem(d)
if r == 0:
return d
return GCD(d, r)
c1 = 13217474654292004363856075278520757466824143185562644589435205983129217296274506201658607902925918463810669651187931438707463980200597796525145961812558335606869535046525751644349121014611471485924792317673676897544967186849999303553655143463193008931522781210213775176361461330152916182152490228805143130219034755661136770746695435131634943670061703208200420941567468263604725805527949530441187573304594551681505448906980134599499219639635847589159552643283664861716675062716189563778230253728243212166722217131804567968802590970289194184730312191566604685228498741244325884926394951559958882556872443838828595721795
c2 = 4559071621629696630241310414157787252398993303352406460679818712734654723245665629045386192935774834549763185716428421801030743241087362360993073598441942913763307040153845814566813785051966089462103398707772310931757078567966625614205062497688823235597495905039215557721084707167005869742940664599370255810642088226514218604008024415439530664582826587968095341428172708727212123503591896137401901299319575111780241997201491483884595840240548595924921122491370437743646304558446978889696269103532589815604885437567865743812522324914929067732496241588320254643044423985091522987958589450504390966824128520155427495706
N = 14333611673783142269533986072221892120042043537656734360856590164188122242725003914350459078347531255332508629469837960098772139271345723909824739672964835254762978904635416440402619070985645389389404927628520300563003721921925991789638218429597072053352316704656855913499811263742752562137683270151792361591681078161140269916896950693743947015425843446590958629225545563635366985228666863861856912727775048741305004192164068930881720463095045582233773945480224557678337152700769274051268380831948998464841302024749660091030851843867128275500525355379659601067910067304244120384025022313676471378733553918638120029697
e = 52595
pad1 = 1769169763
pad2 = 1735356260
PR.<x>=PolynomialRing(Zmod(N))
g1 = (x*2^32+pad1)^e - c1
g2 = (x*2^32+pad2)^e - c2
X=584734024210292804199275855856518183354184330877
print(g1(X),g2(X))
res = GCD(g1,g2)
m = -res.monic().coefficients()[0]
print(m)
print(bytes.fromhex(hex(m)[2:]).decode().replace("flag{",'ISCC{'))
Misc10 有人让我给你 带个话
有人让我给你带个话~
1.用010Editor打开图片,开头为PNG文件头:89 50 4E 47,不存在问题
搜索PNG文件尾AE 42 60 82,发现存在两个文件尾,第一个文件尾后的四个字节为52 61 72 21,即RAR的文件头
2.将RAR文件分离出来,后缀名改为rar,解压压缩包,得到一张图片,名为lyra.png
3.搜索lyra,其为语音压缩编解码器
按照github上的项目在本地部署项目
工具:https://github.com/google/lyra
安装教程:Lyra编码器基础环境搭建_lyra dajian-CSDN博客
4.将”有人和你说了一些东西“改为“input.lyra”部署成功后执行以下命令解码Lyra编码的文件
bazel-bin/lyra/cli_example/decoder_main --encoded_path=input.lyra --output_dir=temp/ --bitrate=3200
5.得到一个wav文件,里面播放社会主义核心价值观编码,可以使用以下工具将wav转成文本
语音转文字在线工具:在线语音转文字_语音怎么转换成文字_福昕在线PDF转换器
6.在线工具进行解码获取flag CTF在线工具-在线核心价值观编码|核心价值观编码算法|Core Values Encoder