吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2032|回复: 3
上一主题 下一主题
收起左侧

[CTF] 2025 CISCN 初赛wp

[复制链接]
跳转到指定楼层
楼主
Ssscatch 发表于 2025-12-29 11:29 回帖奖励
还有个vvvmmm没出 如果有问题请各位大佬指正,互相学习

1.wasm-login

check.startsWith("ccaf33e3512e31f3")

爆破时间戳

// solve_sunday.mjs

import { authenticate } from "./release.js"; 

import { createHash } from "node:crypto";

const TARGET_PREFIX = "ccaf33e3512e31f3";

const username = "admin";

// 调整搜索范围:补全 "周日晚上" 的时间段

// 结束时间:2025-12-22 00:00:00 (我们刚才扫过的起点)

const endTs = 1766332800000; 

// 开始时间:往前推 5 小时 (周日 19:00 开始) -> 1766314800000

const startTs = 1766314800000; 

console.log([+] 开始扫描周日深夜时段...);

console.log([+] 范围: ${new Date(startTs).toLocaleString()} -> ${new Date(endTs).toLocaleString()});

console.log([+] 目标前缀: ${TARGET_PREFIX});

const startTime = Date.now();

let count = 0;

for (let ts = startTs; ts < endTs; ts += 1) {

count++;

if (count % 500000 === 0) {

const speed = (count / ((Date.now() - startTime)/1000) / 1000).toFixed(1);

console.log(
  • 进度: ${ts} | 速度: ${speed} k/s); } try { const password = ts.toString(); const resultString = authenticate(username, password); if (resultString) { // 务必: parse -> stringify -> MD5 const jsonStr = JSON.stringify(JSON.parse(resultString)); const hash = createHash('md5').update(jsonStr).digest('hex'); if (hash.startsWith(TARGET_PREFIX)) { console.log(\n\n[SUCCESS] 找到 Flag !!!); console.log([+] 时间戳: ${ts}); console.log([+] Flag: flag{${hash}}); process.exit(0); } } } catch (e) {} } console.log("[-] 周日时段扫描结束。");
  • 登录的时间戳应该是 1766334550699

    WASM 返回为:

    {"username":"admin","password":"L0In602=","signature":"LxZiwA05Y9h7wX1CI0gUitOE2LBy9y8McoBqWgKIdDo="}

    对其 JSON.parse -> JSON.stringify 后做 MD5,得到:

    ccaf33e3512e31f36228f0b97ccbc8f1

    包裹上即可

    2.babygame

    godat逆向 和羊城杯差不多 标准aes是乱码

    extends CenterContainer
    
    @onready var flagTextEdit: Node = $PanelContainer / VBoxContainer / FlagTextEdit
    
    @onready var label2: Node = $PanelContainer / VBoxContainer / Label2
    
    static var key = "FanAglFanAglOoO!"
    
    var data = ""
    
    func _on_ready() -> void :
    
    Flag.hide()
    
    func get_key() -> String:
    
    return key
    
    func submit() -> void :
    
    data = flagTextEdit.text
    
    var aes = AESContext.new()
    
    aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8_buffer())
    
    var encrypted = aes.update(data.to_utf8_buffer())
    
    aes.finish()
    
    if encrypted.hex_encode() == "d458af702a680ae4d089ce32fc39945d":
    
    label2.show()
    
    else:
    
    label2.hide()
    
    func back() -> void :
    
    get_tree().change_scene_to_file("res://scenes/menu.tscn")

    是key 会动态变化

    extends Node
    
    @onready var fan = $"../Fan"
    
    var score = 0
    
    func add_point():
    
    score += 1
    
    if score == 1:
    
    Flag.key = Flag.key.replace("A", "B")
    
    fan.visible = true
    

    每吃一个金币都会对调 A 和 B

    Exp

    from itertools import product
    
    try:
    
      from Crypto.Cipher import AES
    
    except ImportError:
    
      raise SystemExit("需要 pycryptodome:pip install pycryptodome")
    
    BASE_KEY = "FanAglFanAglOoO!"
    
    CT_HEX = "d458af702a680ae4d089ce32fc39945d"
    
    ct = bytes.fromhex(CT_HEX)
    
    \# 找出所有 'A' 的位置
    
    a_pos = [i for i, ch in enumerate(BASE_KEY) if ch == "A"]
    
    print("A positions:", a_pos, "count =", len(a_pos))
    
    def build_key(bits):
    
      \# bits: 每个 A 位置是否改成 B
    
      s = list(BASE_KEY)
    
      for pos, b in zip(a_pos, bits):
    
    ​    if b == 1:
    
    ​      s[pos] = "B"
    
      return "".join(s)
    
    def is_valid_utf8(b: bytes) -> bool:
    
      try:
    
    ​    b.decode("utf-8", errors="strict")
    
    ​    return True
    
      except UnicodeDecodeError:
    
    ​    return False
    
    for bits in product([0, 1], repeat=len(a_pos)):
    
      key = build_key(bits).encode("utf-8") # 16 bytes
    
      aes = AES.new(key, AES.MODE_ECB)
    
      pt = aes.decrypt(ct)
    
      ok_utf8 = is_valid_utf8(pt)
    
      print("\n=== bits:", bits, "key:", build_key(bits), "utf8:", ok_utf8)
    
      print("pt_hex:", pt.hex())
    
      if ok_utf8:
    
    ​    print("pt_utf8:", pt.decode("utf-8"))
    
      else:
    
    ​    
    
    ​    print("pt_latin1_preview:", pt.decode("latin-1"))

    <div><br class="Apple-interchange-newline">=== bits: (1, 1) key: FanBglFanBglOoO! utf8: True pt_hex: 774f577e796f75417265677245615421 pt_utf8: wOW~youAregrEaT</div>

    === bits: (1, 1) key: FanBglFanBglOoO! utf8: True

    pt_hex: 774f577e796f75417265677245615421

    pt_utf8: wOW~youAregrEaT

    flag{wOW~youAregrEaT}

    3.Eternum

    RAT/后门通信

    C2 是 192.168.8.160:13337

    流量包帧结构:

    [ "ET3RNUMX"(8) ][ len(4, big-endian) ][ body(len) ]

    1. pcap 里应用层帧格式
      每条 TCP payload 里是多帧拼接:
      b"ET3RNUMX" + u32_be(len) + body
    2. body 是     AES-GCM
      nonce = body[:12]
      tag = body[-16:]
      ct = body[12:-16]
    3. AES key 是可执行文件里硬编码的 32 字节字符串
      试试这个
      xfqGcVjrOWp5tUGCPFQq448nPDjILTe7
      AES-256 key。
    4. 解密后能看到服务端下发命令、客户端回传输出,其中有一条命令是:
      base32 /var/opt/s*/
      MZWGCZ33MI3WGNJYG4YDALJSMIYDCLJUMRSDILJYGUZDMLLBGRQTIN3BGY2WCMLBHF6Q====     base32解码就是 flag。

    flag

    flag{b7c58700-2b01-4dd4-8526-a4a47a65a1a9}


    免费评分

    参与人数 3威望 +1 吾爱币 +21 热心值 +3 收起 理由
    Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
    AG6 + 1 热心回复!
    sn954321 + 1 + 1 热心回复!

    查看全部评分

    发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

    沙发
     楼主| Ssscatch 发表于 2025-12-29 11:30 |楼主
    互相指正
    3#
    炫迈 发表于 2026-1-9 09:00
    关键就是要找准时间范围,周日晚上这个时间段选的很准,ccaf33e3512e31f3这个前缀匹配的思路也很实用,babygame那个动态key的变化机制确实容易踩坑,你用product爆破所有A和B的组合这个方法很稳,我当时做羊城杯的时候也遇到过类似的题,就是没注意到key会动态变化,卡了好久,Eternum这个流量分析题解的很到位,ET3RNUMX这个帧头标识抓的很准,AES-GCM的解密流程也很标准,那个base32的命令隐藏的挺深,老哥你眼力可以,这几个题都是典型的逆向加密码学组合,建议以后遇到类似题先抓网络流量,再看算法逻辑,最后爆破验证,这样效率高
    4#
     楼主| Ssscatch 发表于 2026-1-22 20:07 |楼主
    炫迈 发表于 2026-1-9 09:00
    关键就是要找准时间范围,周日晚上这个时间段选的很准,ccaf33e3512e31f3这个前缀匹配的思路也很实用,baby ...

    感谢感谢
    您需要登录后才可以回帖 登录 | 注册[Register]

    本版积分规则

    返回列表

    RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

    GMT+8, 2026-4-17 10:50

    Powered by Discuz!

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表