本文最后更新于6 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
古剑山第三届全国大学生网络攻防大赛省赛
Crypto
1.common rsa
N = 162178605357818616394571566923155907889899677780239882906511996614607940884142045197452389471499799373787832649318837814454679970724845203557871078001956378966434166323827984964942729898095347038272003371167123553368531662277059263517900162297903110415768403265100411543878859321181606008503516896600638590699
e1 = 35422
c1 = 153249315480380808558746807096025628082875635601515291525075274335055878390662930254941118045696231628008256877302589689883059616503108946971165183674522403835250738176157466145855833767128209866527507862726083268576304163200171600023472544755768741118904892489037291247455823396160705615280802805803254323033
e2 = 1033
c2 = 5823189490163315770684717059899864988806118565674660089157163486577056500243194221873916232616081138765317598078910078375360361118674333149663483360677725162911935082290640547407140413703664960164356579153623498735889314476063673352676918268911309402784919521792079943937126634436658784515914270266106683548
构建代码
import sys
# 如果你没有安装 pycryptodome,可以使用这个简单的函数将数字转为字符串
def long_to_bytes(n):
return n.to_bytes((n.bit_length() + 7) // 8, 'big')
# 扩展欧几里得算法
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
# 求模逆元
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('Modular inverse does not exist')
else:
return x % m
# 题目数据
N = 162178605357818616394571566923155907889899677780239882906511996614607940884142045197452389471499799373787832649318837814454679970724845203557871078001956378966434166323827984964942729898095347038272003371167123553368531662277059263517900162297903110415768403265100411543878859321181606008503516896600638590699
e1 = 35422
c1 = 153249315480380808558746807096025628082875635601515291525075274335055878390662930254941118045696231628008256877302589689883059616503108946971165183674522403835250738176157466145855833767128209866527507862726083268576304163200171600023472544755768741118904892489037291247455823396160705615280802805803254323033
e2 = 1033
c2 = 5823189490163315770684717059899864988806118565674660089157163486577056500243194221873916232616081138765317598078910078375360361118674333149663483360677725162911935082290640547407140413703664960164356579153623498735889314476063673352676918268911309402784919521792079943937126634436658784515914270266106683548
# 1. 计算 s1, s2 使得 s1*e1 + s2*e2 = 1
g, s1, s2 = egcd(e1, e2)
if g != 1:
print("错误:e1 和 e2 不互质,无法直接使用共模攻击。")
else:
# 2. 计算明文 m
# 如果指数为负数,需要先计算模逆元,再进行幂运算
if s1 < 0:
s1 = -s1
c1 = modinv(c1, N)
if s2 < 0:
s2 = -s2
c2 = modinv(c2, N)
m = (pow(c1, s1, N) * pow(c2, s2, N)) % N
# 3. 输出结果
try:
flag = long_to_bytes(m)
print(f"Decrypted integer: {m}")
print(f"Flag: {flag.decode('utf-8', errors='ignore')}")
except Exception as e:
print(f"Error decoding: {e}")
得到flag{A_RSA_c0mm0n_m0dulu5_4tt4ck}
2.sol
from Crypto.Util.number import *
import hashlib
p,x,a,b,c=getPrime(2025), getPrime(1024),getPrime(512),getPrime(1024),getPrime(1500)
y=x**4+a*x**2+b*x+c
print(f"y={y}")
print(f"b={b}")
print(f"c={c}")
print(f"p={p}")
flag=b'flag{'+hashlib.md5((str(a)).encode()).hexdigest().encode()+b'}'
flag
'''
y=198522960435841482189432265177909868426431703074708363449219028697324701510160286719731988116839697036160581630187160949885168801231636762705713983033164840216512010109089390010468198557792366011939222563881564708155342114969230636341034212421633874868858789397938243061335664034978831542864101231007091988193863118052712382091154270467198016237288512835005671248249864343182623298497353279333896185090300689372993251851698985725825619040354352099701531339567909888327001736937441117830890673409609636796619930226667955511073115983145641056494143455805357766933615911269415380543240132925744315363193308341329870002528062545716167903459438493154302274735882612908825416096548207130441684370171413794313131775960498691561791175984389699661776179746486882233034632979256741127422204726199986374102650551713456275685579171314911783130052174900534533297618292233601037654694611306838303066884626125878765611689352475739052132349596965687310082111652949904102268706219733830038063864703811394198182986558883397487207721093367621647038297033723455527107418011037322197091733780060565430632034276705456268207898108856563488519654411483838153783153351440293627133844440601677480833571012370843618968387929873540183054860492446381685034534436
b=174037789483961573123221843591212086149338262121485604600830887974881925500571571986993457692950300053374733237615433793104052491813933671943903946487842930332507742237430616633825365722075237337670353892075697891908329460336348924680104502864021820883975695834115061923434753902679746280494899854826747016131
c=33472511251772997775575923606329341691183359500908766818057589728522254242596438955590397842265158831677351198820346034459567637818737702918129437591421137895764213815168420429024803177742927091662422333575499875132388315943460516679655107714170719351306979285358080183600281172752401859701765071852769889627868633217209348758684870450300228084878260106253395883903968044935866937201968348531962567937222914516096107266208665856669507873113157476771707
p=3634071908867506965069315261429753443464716245738410040251875581513557838289276325218462157875991826224641777953866288921260305341272244121296068932207702190214606897491230548638292125061653257219859677992258434311277440482616823776560279337140379719082621412099620617217597998553091192312010588644683350990634085010622936842730027266359749795759745712453727285078472696717945991398633345949433118817923844577431455021644322229917758424788807006347476518982567210018019855197933776595555771047454297485885425728424948978147686731066201483794340469411549870237470492555193178687911573753715584786785924202386461
'''
构建代码
import hashlib
import math
# 题目给出的数据
y = 198522960435841482189432265177909868426431703074708363449219028697324701510160286719731988116839697036160581630187160949885168801231636762705713983033164840216512010109089390010468198557792366011939222563881564708155342114969230636341034212421633874868858789397938243061335664034978831542864101231007091988193863118052712382091154270467198016237288512835005671248249864343182623298497353279333896185090300689372993251851698985725825619040354352099701531339567909888327001736937441117830890673409609636796619930226667955511073115983145641056494143455805357766933615911269415380543240132925744315363193308341329870002528062545716167903459438493154302274735882612908825416096548207130441684370171413794313131775960498691561791175984389699661776179746486882233034632979256741127422204726199986374102650551713456275685579171314911783130052174900534533297618292233601037654694611306838303066884626125878765611689352475739052132349596965687310082111652949904102268706219733830038063864703811394198182986558883397487207721093367621647038297033723455527107418011037322197091733780060565430632034276705456268207898108856563488519654411483838153783153351440293627133844440601677480833571012370843618968387929873540183054860492446381685034534436
b = 174037789483961573123221843591212086149338262121485604600830887974881925500571571986993457692950300053374733237615433793104052491813933671943903946487842930332507742237430616633825365722075237337670353892075697891908329460336348924680104502864021820883975695834115061923434753902679746280494899854826747016131
c = 33472511251772997775575923606329341691183359500908766818057589728522254242596438955590397842265158831677351198820346034459567637818737702918129437591421137895764213815168420429024803177742927091662422333575499875132388315943460516679655107714170719351306979285358080183600281172752401859701765071852769889627868633217209348758684870450300228084878260106253395883903968044935866937201968348531962567937222914516096107266208665856669507873113157476771707
# 1. 求解 x
# 因为 y 的大小远大于 p,且 x^4 远大于方程中其他项,可以直接开四次方取整
# math.isqrt(n) 返回 n 的整数平方根
x = math.isqrt(math.isqrt(y))
# 2. 求解 a
# 原始方程: y = x^4 + a*x^2 + b*x + c
# 移项: a*x^2 = y - x^4 - b*x - c
# 求解: a = (y - x^4 - b*x - c) // x^2
numerator = y - x**4 - b*x - c
denominator = x**2
# 验证是否整除(如果整除说明我们的假设是正确的)
if numerator % denominator == 0:
a = numerator // denominator
print(f"Found a: {a}")
# 3. 生成 Flag
# 题目逻辑: flag=b'flag{'+hashlib.md5((str(a)).encode()).hexdigest().encode()+b'}'
md5_hash = hashlib.md5((str(a)).encode()).hexdigest()
flag = f"flag{{{md5_hash}}}"
print(f"Flag: {flag}")
else:
print("Error: x solution is incorrect, residuals do not match.")
得到flag{01a6eb898468abbd352300a7a072495c}
3.aesstudy
直接访问网址,无响应,使用nc连接,访问 Nmap 官方下载页面 (https://nmap.org/download.html)
下载完后,在powershell打开
ncat -v 47.107.168.16 45971
连接成功,构造脚本
在这里实现脚本连接,尝试多步获取flag
import socket
import hashlib
import time
import re
import base64
import sys
# 配置连接信息
HOST = '47.107.168.16'
PORT = 45971
def solve_pow(target_prefix):
print(f"[-] 正在计算 PoW,目标: {target_prefix}")
for a in range(256):
for b in range(256):
for c in range(32):
x = bytes([a, b, c])
if hashlib.sha256(x).hexdigest().startswith(target_prefix):
print(f"[+] 找到 PoW 碰撞: {x.hex()}")
return x.hex()
return None
def bit_flip_attack(c1_b64, m1_b64, requirements):
try:
# 解码 base64 (去掉所有空白字符)
c1 = bytearray(base64.b64decode(c1_b64.replace('\n', '').replace('\r', '').strip()))
m1 = bytearray(base64.b64decode(m1_b64.replace('\n', '').replace('\r', '').strip()))
c2 = bytearray(c1)
# 遍历要求修改密文
for index, target_char in requirements:
prev_index = index - 16
if prev_index < 0: continue
original_c = c1[prev_index]
original_m = m1[index]
target_val = ord(target_char)
# 翻转攻击
new_c = original_c ^ original_m ^ target_val
c2[prev_index] = new_c
return base64.b64encode(c2).decode()
except Exception as e:
print(f"[!] 攻击计算出错: {e}")
return None
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((HOST, PORT))
print(f"[+] 已连接到 {HOST}:{PORT}")
# --- 阶段 1:PoW ---
buffer = ""
while "=='" not in buffer:
chunk = s.recv(4096).decode(errors='ignore')
if not chunk: return
buffer += chunk
match = re.search(r"=='([0-9a-f]{8})'", buffer)
if match:
ans = solve_pow(match.group(1))
s.sendall((ans + "\n").encode())
# --- 阶段 2:多轮循环闯关 ---
round_count = 1
while True:
print(f"\n>>> 正在进行第 {round_count} 轮挑战...")
# 接收数据,直到出现输入提示 OR 出现 Flag
full_response = ""
while "@c2.encode('base64')=" not in full_response:
chunk = s.recv(4096).decode(errors='ignore')
if not chunk:
print("[!] 连接断开")
return
full_response += chunk
# *** 实时检测 FLAG ***
if "flag{" in full_response.lower() or "dasctf{" in full_response.lower() or "ctf{" in full_response.lower():
print("\n" + "★"*50)
print("恭喜!找到 Flag 了!!!")
print("★"*50)
print(full_response)
return
# 解析题目参数
# 提取 c1
c1_match = re.search(r"c1\.encode\('base64'\)=(.*?)(?=# m1)", full_response, re.DOTALL)
# 提取 m1
m1_match = re.search(r"m1\.encode\('base64'\)=(.*?)(?=# m2)", full_response, re.DOTALL)
# 提取修改要求
reqs = re.findall(r"m2\[(\d+)\]=(.)", full_response)
if c1_match and m1_match and reqs:
c1_b64 = c1_match.group(1)
m1_b64 = m1_match.group(1)
requirements = [(int(idx), char) for idx, char in reqs]
# 计算并发送
payload = bit_flip_attack(c1_b64, m1_b64, requirements)
if payload:
s.sendall((payload + "\n").encode())
print(f"[-] 第 {round_count} 轮 Payload 已发送")
round_count += 1
else:
print("[!] 解析题目失败,服务器可能返回了异常数据:")
print(full_response)
break
except Exception as e:
print(f"[!] 发生错误: {e}")
finally:
s.close()
if __name__ == '__main__':
main()
flag{2b6f73f87a8350b130577ced2c58c454} 这篇写很简陋,期待我下一篇web的ssti吧!