古剑山第三届全国大学生网络攻防大赛省赛密码三解
本文最后更新于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吧!

文末附加内容
No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous