第十届“楚慧杯”wp

admin 2026-03-13 00:17:29 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档分享第十届楚慧杯CTF比赛解题思路,涵盖对抗样本、车联网安全标准ISO/SAE21434等基础知识题,以及Web和Crypto方向实战技巧。Web题展示了HTTP请求走私结合SSTI漏洞利用、SQL注入与MD5长度扩展攻击组合利用等技术,Crypto题涉及ECDSA签名私钥恢复,整体呈现了从漏洞发现到获取flag的完整攻击链。 综合评分: 84 文章分类: CTF,漏洞分析,渗透测试,实战经验,WEB安全


  • 复现环境
  • | | | — | | Python 3 Pillow numpy 原始压缩包可正常读取 |

    1. 关键代码实现
    from __future__ import annotationsfrom pathlib import Pathimport zipfileimport numpy as npfrom PIL import Image, ImageOpsBASE_DIR = Path(__file__).resolve().parentROOT_DIR = BASE_DIR.parentZIP_PATH = ROOT_DIR / "tempdir" / "MISC附件" /"Time_and_chaos.zip"UNPACK_DIR = BASE_DIR / "unpacked"ART_DIR = BASE_DIR / "artifacts"# 图像链路提取的前半段FLAG_PREFIX = "DASCTF{Logistic_and"def ensure_unpacked() -> None:    """解压附件到工作目录"""    UNPACK_DIR.mkdir(parents=True,exist_ok=True)    required = [UNPACK_DIR / f"{i}.png"for i in range(1, 9)]    required += [UNPACK_DIR /"flag.png", UNPACK_DIR / "flag.txt"]    if all(p.exists() for p in required):        return    if not ZIP_PATH.exists():        raiseFileNotFoundError(f"zip not found: {ZIP_PATH}")    with zipfile.ZipFile(ZIP_PATH,"r") as zf:        zf.extractall(UNPACK_DIR)def build_mean_inverse() -> None:    """计算8图均值并反相,保存中间结果用于验证"""    ART_DIR.mkdir(parents=True,exist_ok=True)    arr = []    for i in range(1, 9):        img = Image.open(UNPACK_DIR /f"{i}.png").convert("RGB")        arr.append(np.array(img,dtype=np.uint8))    # 计算逐像素均值    mean_img = np.mean(np.stack(arr,axis=0), axis=0).astype(np.uint8)    mean_pil = Image.fromarray(mean_img,mode="RGB")    mean_pil.save(ART_DIR /"mean.png")        # 反相处理增强可读性    inv = ImageOps.invert(mean_pil)    inv.save(ART_DIR /"mean_inv.png")        # 裁剪右上角文字区域    w, h = inv.size    crop = inv.crop((w - 900, 0, w, int(h* 0.22)))    crop.save(ART_DIR /"text_line.png")def decode_tail_from_zwc() -> str:    """从零宽字符解码flag后半段"""    s = (UNPACK_DIR /"flag.txt").read_text(encoding="utf-8")    # 提取零宽字符    zw = "".join(ch for ch in sif ord(ch) in (0x200C, 0x200D, 0xFEFF, 0x202C))    # 建立映射关系    mapping = {        0x200C: "00",  # ZWNJ        0x200D: "01",  # ZWJ        0xFEFF: "11",  # BOM        0x202C: "10",  # POP DIR    }    bits ="".join(mapping[ord(ch)] for ch in zw)    # 比特流转字节,UTF-16BE解码    data = bytes(int(bits[i:i+8], 2) fori in range(0, len(bits), 8))    return data.decode("utf-16-be")def main() -> None:    ensure_unpacked()    build_mean_inverse()    tail = decode_tail_from_zwc()    flag = FLAG_PREFIX + tail    print(flag)if __name__ == "__main__":    main()
    
    1. 分析 Weapons.rvdata2

    使用Ruby解析武器数据:

    module&nbsp;RPG&nbsp; classBaseItem;&nbsp;end&nbsp; classWeapon <&nbsp;BaseItem;&nbsp;end&nbsp; classBaseItem&nbsp; &nbsp; classFeature;&nbsp;end&nbsp;&nbsp;endendobj =&nbsp;Marshal.load(File.binread('Data/Weapons.rvdata2'))w = obj[49]puts w.instance_variable_get(:@name)puts w.instance_variable_get(:@description)
    

    运行结果为DASCTF{Logistic_and_time_fly}


    OnePandaSec团队交流群,欢迎网络安全爱好者加入


    免责声明:

    本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

    任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

    本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

    本文转载自:OnePanda-Sec OnePanda-Sec OnePanda-Sec《第十届“楚慧杯” wp》

      评论:0   参与:  0