当前位置: 首页 > news >正文

铸网-2025”山东省工业互联网网络安全职业技能竞赛wp(职工组)

ICS

失窃的工艺

下载后test.PCZ文件,需要使用力控软件打开。

但电脑没有安装这个软件,尝试把后缀名改为.zip,解压后直接搜索flag文本:

image-20250909163733777

成功在文件中找到flag:flag{D076-4D7E-92AC-A05ACB788292}。

工控协议分析

WireShark打开分析,追踪TCP流,flag被逐字符藏在流量中:

image-20250909165641380

拼凑起来得到flag:flag{c93650241853da240f9760531a79cbcf}。

Misc

总线流量分析

一辆汽车在试验道路上行驶,测试人员监控了一段时间的车内通信报文,报文抓取时间间隔为36s,尝试找出与仪表显示车速相关的CAN通信报文,估算车辆在这段时间的行驶路程(m)得到flag。已知车速在80千米每小时左右,车速信息只占用1字节长度,且具备较高优先级。flag{行驶路程距离}

打开后按ID分组观察,根据题目提示找只有1字节变化的can报文:

image-20250909163749620

发现ID=0x0000280的can报文数据只有1字节在变化在0x50左右浮动,说明速度为80km/h左右。

编写脚本计算即可:

speeds_hex = ["46","48","50","50","55","58","52","5A","58","58",
              "56","54","55","4F","4F","4F","4D","4D","4D","4E",
              "4E","53","56","56","59","59","51","52","4F","46"]

speeds = [int(h,16for h in speeds_hex]
delta_t = 36

distance_km = 0
for v in speeds:
    distance_km += v * delta_t / 3600

distance_m = distance_km * 1000
print(distance_km, distance_m)

# 24.469999999999995 24469.999999999996
# flag{24470}

OTA流量分析

车机/IOT设备的OTA(Over-The-Air)流程:

  1. 设备发起请求到服务器,比如 /api/v1/vehicle/handshake,带上设备信息。
  2. 服务器生成一个 会话密钥 session_key,通过 HTTPS 或者加密通道下发给设备。
  3. 后续敏感数据(固件包、授权信息)会用这个 session_key 进行对称加密(常见 AES-CBC/CTR)。
  4. 设备用 session_key 解密得到明文,然后执行升级或拿到控制指令。

编写脚本:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
extract_ota_flag.py
Usage:
  pip install scapy pycryptodome
  python3 extract_ota_flag.py ota.pcapng

What it does:
  - 尝试用 scapy 读取 pcap 并抽取 TCP/UDP payload(若 scapy 不可用则直接读取原始 pcap 字节进行搜索)
  - 搜索 HTTP 区段、提取 session_key、查找长 base64 段并 decode
  - 假设 decoded blob 为 IV(16) + AES-CBC(ciphertext),使用每个 session_key (hex -> bytes) 作为 AES-256 key 遍历解密
  - 尝试移除 PKCS#7 填充并解析为文本,输出含 'flag{' 的解密文本
"""

import sys
import os
import re
import json
import base64
from pathlib import Path

pcap_path = Path(sys.argv[1]) if len(sys.argv) > 1else Path("ota.pcapng")
ifnot pcap_path.exists():
    print("pcap not found:", pcap_path)
    sys.exit(1)

# helpers
def find_session_keys(text):
    keys = set()
    # match "session_key": "hex..."
    for m in re.finditer(r'"session_key"\s*:\s*"([0-9a-fA-F]{32,128})"', text):
        keys.add(m.group(1))
    return keys

def find_long_base64(text, min_len=80):
    # return unique base64-like substrings (alnum+/ and optional padding)
    found = set()
    for m in re.finditer(r'([A-Za-z0-9+/]{%d,}={0,2})' % min_len, text):
        found.add(m.group(1))
    return list(found)

# Try scapy first (if installed)
payload_blobs = []  # list of bytes objects
http_texts = []     # list of decoded http-like text blocks
try:
    from scapy.all import rdpcap, TCP, UDP, Raw
    pkts = rdpcap(str(pcap_path))
    sessions = pkts.sessions()
    for s, pkts in sessions.items():
        data = bytearray()
        for p in pkts:
            if p.haslayer(Raw):
                data.extend(bytes(p[Raw].load))
        if data:
            # try decode for text
            try:
                txt = data.decode('utf-8', errors='replace')
                if"HTTP"in txt or"POST"in txt or"GET "in txt or"session_key"in txt:
                    http_texts.append(txt)
            except Exception:
                pass
            payload_blobs.append(bytes(data))
    print("scapy path used: extracted %d payload blobs, %d http text blocks" % (len(payload_blobs), len(http_texts)))
except Exception as e:
    # fallback: raw bytes search (robust when scapy not installed)
    print("scapy not available or failed (%s). Falling back to raw-byte scan." % e)
    raw = pcap_path.read_bytes()
    # extract long printable runs (likely HTTP payloads)
    runs = []
    cur = bytearray()
    for b in raw:
        if32 <= b < 127:
            cur.append(b)
        else:
            if len(cur) >= 40:
                runs.append(bytes(cur))
            cur = bytearray()
    if len(cur) >= 40:
        runs.append(bytes(cur))
    for r in runs:
        try:
            txt = r.decode('utf-8', errors='replace')
            http_texts.append(txt)
        except:
            pass
    # also keep raw as one blob for base64 search
    payload_blobs.append(raw)
    print("raw scan found %d printable runs, payload_blobs=%d" % (len(runs), len(payload_blobs)))

# gather session keys from http_texts
session_keys = set()
for t in http_texts:
    session_keys |= find_session_keys(t)

print("session_key candidates found:", session_keys)

# gather base64 candidates from http_texts and from raw payload blobs (text decode)
b64_candidates = set()
for t in http_texts:
    for b in find_long_base64(t):
        b64_candidates.add(b)
# also scan payload blobs as text for base64
for blob in payload_blobs:
    try:
        txt = blob.decode('utf-8', errors='replace')
        for b in find_long_base64(txt):
            b64_candidates.add(b)
    except:
        pass

print("base64 candidates found:", len(b64_candidates))

# decode base64 candidates to binary blobs
decoded_blobs = []
for b64 in b64_candidates:
    try:
        data = base64.b64decode(b64)
        if data:
            decoded_blobs.append(data)
    except Exception:
        continue

print("decoded binary blobs:", len(decoded_blobs))

# AES decryption attempts using session_keys
try:
    from Crypto.Cipher import AES
    have_crypto = True
except Exception:
    have_crypto = False
    print("PyCryptodome not found. Install with: pip install pycryptodome")

found = []
if have_crypto and decoded_blobs and session_keys:
    for blob in decoded_blobs:
        if len(blob) <= 16:
            continue
        iv = blob[:16]
        ct = blob[16:]
        for keyhex in session_keys:
            try:
                key = bytes.fromhex(keyhex)
                if len(key) notin (16,24,32):
                    # try require 32 bytes for AES-256
                    if len(key) < 32:
                        # pad? skip
                        continue
                cipher = AES.new(key, AES.MODE_CBC, iv)
                pt = cipher.decrypt(ct)
                # PKCS#7 removal
                pad = pt[-1]
                if isinstance(pad, int) and1 <= pad <= 16:
                    pt2 = pt[:-pad]
                else:
                    pt2 = pt
                try:
                    s = pt2.decode('utf-8', errors='replace')
                except:
                    s = repr(pt2)
                # check for JSON / 'flag{' / 'admin'
                if ('flag{'in s) or ('"flag"'in s) or ('admin'in s.lower()) or ('nonce'in s.lower()):
                    entry = {
                        "key": keyhex,
                        "plaintext": s
                    }
                    print("=== possible cleartext with key %s ===\n%s\n" % (keyhex, s))
                    found.append(entry)
            except Exception as e:
                # ignore key failures
                pass

ifnot found:
    print("No flags found with available session_keys + decoded blobs.")
else:
    print("Total found items:", len(found))
    # print flags explicitly
    for ent in found:
        m = re.search(r'flag\{[^}]+\}', ent["plaintext"], re.IGNORECASE)
        if m:
            print("FOUND FLAG:", m.group(0))

# As fallback: search raw for flag{...}
rawbytes = pcap_path.read_bytes()
m = re.search(rb'flag\{[^}\r\n]{1,200}\}', rawbytes, re.IGNORECASE)
if m:
    try:
        print("RAW-FOUND FLAG (from pcap bytes):", m.group(0).decode())
    except:
        print("RAW-FOUND FLAG (bytes):", m.group(0))

得到解密后的明文流量:

scapy not available or failed (No module named 'scapy'). Falling back to raw-byte scan.
raw scan found 26 printable runs, payload_blobs=1
session_key candidates found: {'9dbbe057c3b0c7e547701d5ccab3d676c0de24cdd49f2e4f34f5bc99e0e666a0''b908232bfa70d5c3060dd2f96b36a7fc8199e18ef1b3c509efe4a86bf9339d90''bc27b70ea1b27768c1ad58314005ee2ee0a09977b150e570465d6247675e1eab''0d53164fe1c89a4f09512492f2236d86d52c4fdd8b9018195b791b634bfe9e83'}
base64 candidates found: 4
decoded binary blobs: 4
=== possible cleartext with key bc27b70ea1b27768c1ad58314005ee2ee0a09977b150e570465d6247675e1eab ===
{"ok"true"nonce": 2, "admin"false}

=== possible cleartext with key 0d53164fe1c89a4f09512492f2236d86d52c4fdd8b9018195b791b634bfe9e83 ===
{"ok"true"nonce": 2, "admin"false}

=== possible cleartext with key 9dbbe057c3b0c7e547701d5ccab3d676c0de24cdd49f2e4f34f5bc99e0e666a0 ===
{"ok"true"nonce": 2, "admin"true"flag""flag{62173234ab6b0f3349ed89685fba5fff}""hint""admin vehicle received a confidential note."}

=== possible cleartext with key b908232bfa70d5c3060dd2f96b36a7fc8199e18ef1b3c509efe4a86bf9339d90 ===
{"ok"true"nonce": 2, "admin"false}

Total found items: 4
FOUND FLAG: flag{62173234ab6b0f3349ed89685fba5fff}

发现flag就在其中一次通信数据。

MISC-安全流量

导出http数据流,一眼jsp可以想到冰蟹流量

发现key:b9e008ae3315a9d4

图片
Net-A嗦哈解码成功,得到class数据需要反编译
图片
图片
反编译后把数据按顺序拼接得到PK文件头
图片
恢复压缩包打开一眼crc32 尝试爆破
图片
图片
图片
图片
得到密码:ICTF_so_Intrest1ng 解压得到图片
图片
在使用随波修改高度直接得到flag
图片
flag{08ca4a8d32bd08b13f260f224a834b75}



Easypicgame

010editor打开图片,直接搜索flag即可:

image-20250909155057692

flag{d1de0135cc715365ae9c5a4997874deb}

Reverse

简单的逆向分析

拖入IDA分析,逻辑非常简单,直接把密文异或0x5A即可:

image-20250909164236293
image-20250909164236293

提取出密文:

image-20250909155446380
image-20250909155446380

然后编写脚本异或0x5A得到flag:

enc = [0x3C0x360x3B0x3D0x210x1B0x1F0x090x770x320x3B0x2A0x2A0x230x27]
for x in enc:
    print(chr(x ^ 0x5A), end="")
    
# flag{AES-happy}

Re-寻找序列号:

寻找正确的序列号,flag格式为everflag{}。

以 key "abcdef9876543210"(LE u32)对密文做 XXTEA 解密

(sum 每轮减 0x61C88647 的实现)

解密结果是若干 u32 的字节拼接;

最后一个 u32 为原始长度 42。按该长度截取前 42 字节,

即明文 everflag{cd00b4953fe9a109148f350427ceddbd}


image.png


#!/usr/bin/python
# Write Python 3 code in this online editor and run it.

# B64 = "ZYXWVUTSRQPONMLKJIHGFEDCBAzxvtrpnljhfdbywusqomkigeca0123456789#$"
# def b64_decode_custom(s):
#     val = {c:i for i,c in enumerate(B64)}
#     n=0;bits=0;out=bytearray()
#     for ch in s:
#         n=(n<<6)|val[ch]; bits+=6
#         if bits>=8:
#             bits-=8
#             out.append((n>>bits)&0xFF)
#     return bytes(out)

# enc = "xGFH5z2#A4VdtPIvlBoX0hFBLXC6h9AdRSrpM8hiXr3RBiLALa9FyiQPtUQHSGhk"
# cipher = b64_decode_custom(enc)
# (
# print(cipher.hex()))

# import struct

# def to_u32_list_le(b):
#     n = len(b) // 4
#     return list(struct.unpack("<" + "I"*n, b))

# def from_u32_list_le(v):
#     return struct.pack("<" + "I"*len(v), *v)

# def xxtea_encrypt(v, k):
#     n = len(v)
#     if n < 2:
#         return v[:]
#     DELTA = 0x9E3779B9
#     z = v[n-1]
#     y = 0
#     s = 0

#     rounds = 6 + 52 // n
#     while rounds > 0:
#         s = (s + DELTA) & 0xFFFFFFFF
#         e = (s >> 2) & 3
#         for p in range(n-1):
#             y = v[p+1]
#             mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[(p & 3) ^ e] ^ z))
#             v[p] = (v[p] + mx) & 0xFFFFFFFF
#             z = v[p]
#         y = v[0]
#         mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[((n-1) & 3) ^ e] ^ z))
#         v[n-1] = (v[n-1] + mx) & 0xFFFFFFFF
#         z = v[n-1]
#         rounds -= 1
#     return v

# def xxtea_decrypt(v, k):
#     n = len(v)
#     if n < 2:
#         return v[:]
#     DELTA = 0x9E3779B9
#     rounds = 6 + 52 // n
#     s = (rounds * DELTA) & 0xFFFFFFFF
#     y = v[0]
#     while rounds > 0:
#         e = (s >> 2) & 3
#         for p in range(n-1, 0, -1):
#             z = v[p-1]
#             mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[(p & 3) ^ e] ^ z))
#             v[p] = (v[p] - mx) & 0xFFFFFFFF
#             y = v[p]
#         z = v[n-1]
#         mx = (((z>>5) ^ (y<<2)) + ((y>>3) ^ (z<<4))) ^ ((s ^ y) + (k[(0 & 3) ^ e] ^ z))
#         v[0] = (v[0] - mx) & 0xFFFFFFFF
#         y = v[0]
#         s = (s - DELTA) & 0xFFFFFFFF
#         rounds -= 1
#     return v


# key_bytes = b"abcdef9876543210"
# k = list(struct.unpack("<4I", key_bytes))

# cipher = b64_decode_custom(enc)
# v = to_u32_list_le(cipher)
# orig = xxtea_decrypt(v[:], k)
# orig_bytes = from_u32_list_le(orig)

# print(len(orig_bytes), orig_bytes[:16].hex(), orig[-1])

# print(orig_bytes.decode('latin1', errors='ignore')[:48])

# -*- coding: utf-8 -*-
# Solve for: everflag{cd00b4953fe9a109148f350427ceddbd}
# 同时复刻了题目里的加密管线(XXTEA + 自定义Base64)做校验

B64 = "ZYXWVUTSRQPONMLKJIHGFEDCBAzxvtrpnljhfdbywusqomkigeca0123456789#$"
KEY_ASCII = b"abcdef9876543210"
TARGET = "xGFH5z2#A4VdtPIvlBoX0hFBLXC6h9AdRSrpM8hiXr3RBiLALa9FyiQPtUQHSGhk"
FLAG = "everflag{cd00b4953fe9a109148f350427ceddbd}"

# ---- 下面是题目里 sub_4021F0 的自定义 Base64 编码(索引顺序 v18, v19, i, v21)----
def b64_encode_custom_from_function(b: bytes) -> str:
    out = []
    dst = B64
    aint = 0
    n3 = 0
    v22 = len(b)
    idx = 0
    while v22:
        byte = b[idx]; idx += 1; v22 -= 1
        aint = (aint & ~(0xFF << (8*n3))) | (byte << (8*n3))
        n3 += 1
        if n3 == 3:
            v18 = (aint & 0xFF) >> 2
            v19 = (((aint>>8) & 0xFF) >> 4) + 16*((aint & 0xFF) & 3)
            v21 = ((aint>>16) & 0xFF) & 0x3F
            i_idx = (((aint>>16) & 0xFF) >> 6) + 4*(((aint>>8) & 0xFF) & 0xF)
            for val in [v18, v19, i_idx, v21]:
                out.append(dst[val])
            n3 = 0
            aint = 0
    if n3:
        v18 = (aint & 0xFF) >> 2
        v19 = (((aint>>8)&0xFF) >> 4) + 16*((aint & 0xFF) & 3)
        v21 = ((aint>>16)&0xFF) & 0x3F
        i_idx = (((aint>>16)&0xFF) >> 6) + 4*(((aint>>8)&0xFF) & 0xF)
        order = [v18, v19, i_idx, v21]
        count = n3 + 1
        for j in range(count):
            out.append(dst[order[j]])
        for _ in range(4-count):
            out.append('=')
    return "".join(out)

# ---- 下面复刻 sub_402AA0 / sub_402980 / sub_402B50 的“正向”加密管线 ----
def pack_string_le_with_len(s: bytes):
    n = len(s)
    v4 = n//4 + (1 if n % 4 else 0)
    words = [0]*v4
    for i in range(n):
        idx = i//4; shift = 8*(i%4)
        words[idx] = (words[idx] | (s[i] << shift)) & 0xFFFFFFFF
    words.append(n)               # 末尾追加长度(42)
    return words

def pack_key_le(s: bytes):
    n = len(s)
    v4 = n//4 + (1 if n % 4 else 0)
    words = [0]*v4
    for i in range(n):
        idx = i//4; shift = 8*(i%4)
        words[idx] = (words[idx] | (s[i] << shift)) & 0xFFFFFFFF
    return words                   # 仅打包,不追加长度

def xxtea_encrypt_like_402980(v, key):
    n = len(v)
    if n <= 1:
        return v
    last = v[n-1]
    rounds = 52//n + 6
    sumv = 0
    for _ in range(rounds):
        sumv = (sumv - 0x9E3779B9) & 0xFFFFFFFF    # 注意:这题是 sum 递减版本
        e = (sumv >> 2) & 3
        # p: 0..n-2
        for p in range(n-1):
            y = v[p+1]
            mx = ((((last << 4) & 0xFFFFFFFF) ^ (y >> 3)) + ((last >> 5) ^ ((y << 2) & 0xFFFFFFFF)))
            mx ^= ((sumv ^ y) + (key[(e ^ (p & 3))] ^ last)) & 0xFFFFFFFF
            last = (v[p] + mx) & 0xFFFFFFFF
            v[p] = last
        # 最后一个
        y0 = v[0]
        mx = ((((last << 4) & 0xFFFFFFFF) ^ (y0 >> 3)) + ((last >> 5) ^ ((y0 << 2) & 0xFFFFFFFF)))
        mx ^= ((sumv ^ y0) + (key[(e ^ ((n-1) & 3))] ^ last)) & 0xFFFFFFFF
        last = (v[n-1] + mx) & 0xFFFFFFFF
        v[n-1] = last
    return v

def words_to_bytes_le(words):
    out = bytearray()
    for w in words:
        out += w.to_bytes(4, "little")
    return bytes(out)

def encode_pipeline(plain_ascii: str) -> str:
    v = pack_string_le_with_len(plain_ascii.encode("ascii"))
    k = pack_key_le(KEY_ASCII)
    v = xxtea_encrypt_like_402980(v, k)
    ct_bytes = words_to_bytes_le(v)[:-0]  # 跟题里一致,直接 4*n 字节
    return b64_encode_custom_from_function(ct_bytes)

if __name__ == "__main__":
    print(FLAG)
#flag(cd00b4953fe9a109148f350427ceddbd}


Crypto

EasyAES

题目给出的加密流程是:先用 3 字符的 k0 对 flag 进行 AES-CBC 加密得到 c0,然后连续用同样长度的 k1 对 c0 连续加密三次得到 c3。密钥是通过 sha256 从 3 字符明文生成的,因此可以通过穷举实现。

解题思路如下:

  1. 爆 k1 段:
    • 对 c3 做三次 AES-CBC 解密,并对每次解密结果进行 PKCS7 补位校验。
    • 当三次解密都成功且补位合法时,说明该 k1 值正确,对应的解密结果即为 c0。
  2. 爆 k0 段:
    • 对 c0 做一次 AES-CBC 解密并校验 PKCS7 补位,同时验证明文是否符合 flag 的 UUID 格式。
    • 找到匹配的 k0 后,即可得到最终 flag。
  3. 优化思路:
    • k1 的搜索空间和 k0 相比较大,可利用多进程或批量处理加速暴力搜索。
    • PKCS7 补位校验和 UUID 格式校验可以作为快速剪枝条件,大幅减少无效解尝试。

脚本:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 依赖:pip install pycryptodome
from hashlib import sha256
from Crypto.Cipher import AES
import re
import itertools
import multiprocessing as mp

# ========== 配置 ==========
c3_hex = "62343dfc3e978a1d580b54f345e1ed719c85ab15781acfe8ba3bcef1560c9cf54f187bc204c302a5ed4ebb5b5454151ba9b8b73841e17dc391c30a637ef8cfa14a25d01765231ef93a6faede2d66bad5d124201a2d278522bfd416de294677046d47f2827580cdcb9c0d3b18e4c0c68c8948aaefe4e684c7386b426db7898b5c2090047ff433bb6a75b38beaf81b7ad9404d2f09c642179697e9d3721eefc0eb12ba8c780a8d07672f70b00b9cadef74"
data = bytes.fromhex(c3_hex)
ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
UUID_RE = re.compile(rb"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$")

WORKERS = mp.cpu_count()  # 可调整为 4~8
BATCH_SIZE = 256# 每个任务分配的 k1 数量

# ========== AES 工具函数 ==========
def unpad32(b: bytes) -> bytes:
    pad = b[-1]
    if pad < 1or pad > 32or b[-pad:] != bytes([pad])*pad:
        raise ValueError("bad pad")
    return b[:-pad]

def dec32(key: bytes, blob: bytes) -> bytes:
    iv, ct = blob[:16], blob[16:]
    pt = AES.new(key, AES.MODE_CBC, iv).decrypt(ct)
    return unpad32(pt)

def triple_dec_check(k_bytes: bytes, c3_bytes: bytes):
    """三次解密并校验 PKCS7"""
    try:
        t1 = dec32(k_bytes, c3_bytes)
        t2 = dec32(k_bytes, t1)
        t3 = dec32(k_bytes, t2)
        return t3
    except Exception:
        returnNone

# ========== worker 初始化 ==========
def init_worker(keys0_list_param):
    global KEYS0_LIST
    KEYS0_LIST = keys0_list_param

# ========== worker 函数 ==========
def worker_k1_batch(batch):
    """尝试一个 k1 批次"""
    global KEYS0_LIST, data
    for seg in batch:
        k1_bytes = sha256(seg.encode()).digest()
        c0_candidate = triple_dec_check(k1_bytes, data)
        if c0_candidate isNone:
            continue
        # 找到 k1,尝试 k0
        for k0_seg, k0_bytes in KEYS0_LIST:
            try:
                pt = dec32(k0_bytes, c0_candidate)
            except Exception:
                continue
            if UUID_RE.match(pt):
                return (seg, k0_seg, pt.decode())
    returnNone

# ========== 主流程 ==========
def main():
    # 生成 k0 候选列表
    keys0_list = [(a+b+c, sha256((a+b+c).encode()).digest())
                  for a in ALPHABET for b in ALPHABET for c in ALPHABET]

    # 生成 k1 流式批次
    def k1_batch_gen(batch_size):
        it = (a+b+c for a in ALPHABET for b in ALPHABET for c in ALPHABET)
        whileTrue:
            batch = list(itertools.islice(it, batch_size))
            ifnot batch:
                break
            yield batch

    pool = mp.Pool(WORKERS, initializer=init_worker, initargs=(keys0_list,))
    try:
        for result in pool.imap_unordered(worker_k1_batch, k1_batch_gen(BATCH_SIZE), chunksize=1):
            if result:
                k1_seg, k0_seg, flag = result
                print("找到结果!")
                print("k1 segment =", k1_seg)
                print("k0 segment =", k0_seg)
                print("flag =", flag)
                pool.terminate()
                return
    finally:
        pool.close()
        pool.join()
    print("遍历完成,没有找到 flag")

if __name__ == "__main__":
    main()




参考文章连接地址:
https://mp.weixin.qq.com/s/gaTnc311A2BCWzoupHTTOw 
https://mp.weixin.qq.com/s/PEzZIABHePffOoAjqZvbrg

相关文章:

铸网-2025”山东省工业互联网网络安全职业技能竞赛wp(职工组)

ICS失窃的工艺下载后test.PCZ文件,需要使用力控软件打开。但电脑没有安装这个软件,尝试把后缀名改为.zip,解压后直接搜索flag文本:成功在文件中找到flag:flag{D076-4D7E-92AC-A05ACB788292}。工控协议分析WireShark打开分析,追踪TCP流,flag被逐字符藏在流量中:拼凑起来…...

视洞R33定制版改造自制IPC网络摄像头(可rtsp可web)

这期的主角是视洞R33智能摄像头,LT定制版。我们通过修改启动命令让它运行开放系统,并且搭建rkipc平台,通过WEB/VLC预览视频画面 硬件配置很高啊,主控使用RV1106G2(带0.5T NPU),传感器gc4023,宽视角分辨率2560x1440@30fps,实测4M分辨率能跑满。能连WiFi,支持双向对讲、红…...

二十一、流水线的冒险与处理

目录总览:冒险的类型1. 结构冒险 (Structural Hazard)2. 数据冒险 (Data Hazard)3. 控制冒险 (Control Hazard)总结表流水线的冒险(Hazard)是破坏流水线顺畅执行,导致流水线不得不停顿(Stall)或清空(Flush)的主要因素。处理这些冒险是流水线设计的核心挑战。我们将详细…...

java线程的一些思考

java线程AI问答join是怎么实现的 1.join() 方法被 synchronized 修饰,意味着当前线程调用 t.join() 时,必须先获取目标线程 t 的对象锁(即进入 t 的同步代码块)。 2.方法内部通过 while (isAlive()) 循环检查目标线程是否存活: -若存活,当前线程调用 wait(0)(在目标线程…...

2025智能数据分类分级产品选型指南:构建数据治理的智能基座

2025智能数据分类分级产品选型指南:构建数据治理的智能基座在《数据安全法》《个人信息保护法》以及《数据安全技术 数据分类分级规则》(GB/T 43697-2024)等法规标准的推动下,数据分类分级已从“可选项”变为企业数据安全治理的“必答题”。面对金融、运营商、政务等行业中…...

这是我的第一个博客

这是我的第一个博客...

3

12...

eqw

qwe...

第一个c语言项目

1.打开vs 2.创建项目 3.创建源文件 .c 源文件 .h 头文件 注意后缀: .cpp 编译器会按照C++语法来编译代码 .C 编译器会按照C语言来编译代码 4.写代码 C语言一定要有(主函数)main函数 C语言规定:main函数是程序的入口 一个工程中nain函数有且仅有一个 include.h s…...

GitHub Copilot 2025年8月最新更新!

GitHub Copilot 2025年8月最新更新!GitHub Copilot迎来2025年8月重大更新,新增自动模型选择功能,可根据可用性智能匹配最优AI模型,提升开发效率。安全方面增加敏感文件编辑确认机制,同时优化了代理工作流程和终端自动批准功能。更新还支持AGENTS.md文件指导团队协作,并改…...

NOIP 模拟赛十五

Ds+计数DP+计数DP/容斥+根号重构range 将所有值以及除以二所能得到的所有值插入一个数据结构里,如果变为 \(0\) 就停止。 那么答案即为第 \(m+1\) 大的值减去第 \(m\) 大的值和前缀最小值取 \(\min\) 的差。 维护这个使用权值树状数组做到小常数 \(O(n\log^2 n)\) 。 注意查排…...

面试必备进程调度:fg,bg,jobs,ctrl+z,

面试必备进程调度:fg,bg,jobs,ctrl+z,& linux提供的fg和bg命令,可以让我们轻松调度正在运行的任务 假如你发现前天运行的一个程序需要很长的时间,但是需要干前天的事情,你就可以用ctrl-z挂起这个程序,然后可以看到系统的提示: [1]+ Stopped /root/bin/rsync.sh然后我们…...

完整教程:计算机毕设 java 多媒体教室管理系统 基于 Java+SSM 的多媒体教室运维平台 Java+MySQL 的教室预约与设备管理系统

完整教程:计算机毕设 java 多媒体教室管理系统 基于 Java+SSM 的多媒体教室运维平台 Java+MySQL 的教室预约与设备管理系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…...

笔记一

大家好!我是一名计算机相关专业的学生,平常做的最多的事情就是坐在电脑前敲代码解决各种 “小难题”。但写代码让我养成了 “遇到问题不逃避” 的思维,毕竟调试 BUG 时,多试一次可能就会有新突破。 说到值得分享的记忆,那就是我对于一些体育项目的热衷,比如打排球比赛,你…...

二十、指令流水线的基本实现

目录一、设计原则 (Design Principles)二、逻辑结构 (Logical Structure)三、时空图表示 (Space-Time Diagram Representation)总结一、设计原则 (Design Principles) 流水线的设计遵循几个核心原则,以确保其正确性和高效性。任务分解 (Decomposition)原则: 将指令的完整执行…...

物料模板匹配成功后,自动跟随的逻辑

问题简介 在对物料进行模板匹配时,往往是去匹配物料最突出的部分。然后在根据匹配到的位置。再去找我们需要测量或者检测部分。那么,这里就涉及到一个问题。该如何根据我们模板匹配到的特定位置,计算偏差值,并进行一些测量工具(卡尺,ROI)的跟随移动。 获取相对位置 此处…...

TCL t508n 关闭电话语音王提醒/改用4G

先吐槽一波( TCL的系统真的比原生还毛坯,到目前为止部分功能没有完善由于学业压力本文缺少部分图片说明,请见谅改用4g 打开拨号界面输入 ##4636## 设置首选网络类型 NR就是5G ,LTE是4G,WCDMA 3G 只用4g就选择LTE only 按照自己的需求选择 https://pic1.imgdb.cn/item/68c5…...

完整教程:Markdown 编辑器 语法

完整教程:Markdown 编辑器 语法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

天地图的带洞多边形操作

/** 往 polygon 中添加一个洞 */ function addHole(polygon: T.Polygon) {const handler = new T.PolygonTool(map)handler.open()handler.addEventListener(draw, ({ currentPolygon }) => {const oldLnglats = polygon.getLngLats()map.removeOverLay(currentPolygon)poly…...

k8s集群中一台etcd的pod异常

k8s集群中一台etcd的pod异常 记一次etcd报错2380bind already in use杀掉容器依然无效 起初通过命令:kubectl get pod -n kube-system 发现etcd容器异常在主节点通过kubectl logs查看pod日志发现很明显的报错端口被占用当时查看2380端口确实有在占用通过nerdctl stop指令试着停…...

深入解析:基于51单片机电子称称重压力检测阈值报警系统设计

深入解析:基于51单片机电子称称重压力检测阈值报警系统设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...

手撕大模型|KVCache 原理及代码解析

在大型语言模型(LLM)的推理过程中,KV Cache 是一项关键技术,它通过缓存中间计算结果显著提升了模型的运行效率。本文将深入解析 KV Cache 的工作原理、实现方式,并通过代码示例展示其在实际应用中的效果。 一、为什么需要 KV Cache? 在 Transformer 进行自回归推理(如文…...

Kuby免疫学读书笔记01——造血干细胞

造血干细胞(HSC, Hematopoietic stem cell) 血细胞的起源造血干细胞位置骨髓(主要) 脾和肝(少量)分裂与分化正常状态多部份沉默 小部分分裂并分化 分裂得到的daughter cells部分依旧保持分裂分化潜力 另一部分分化为祖细胞,自我更新能力下降,并更倾向于分化为血细胞感染状态和…...

微信群机器人开发

使用微信云pad协议来开发微信机器人,可以开发的项目很多,例如一些娱乐机器人、云发单系统,私域流量的智能管理和营销拓客,还有一些自动采集和发朋友圈的云端系统等。每个行业都有需求这样的系统应用,在线教育、金融、电商已经一些个人微商应用。 可开发的功能包括但不限于…...

动态规划和马尔可夫决策对比

二、三大关键维度的效果对比 1. 问题适配性:动态规划适配 “简单线性流程”,MDP 适配 “复杂网状流程” 动态规划的优势在于 “处理线性、低维度的多阶段决策”,MDP 的优势在于 “处理多维、网状的动态决策”,二者在论文场景中的适配效果差异显著:动态规划在问题二中的适配…...

20250913 之所思 - 人生如梦

20250913 之所思这一周发生了太多的事,连续两晚彻夜失眠,咳嗽不止,但是工作又特别忙,没有时间和精力来复盘,今天身体稍微恢复了一点,好好整理一下9.9日晚上十点,软件刚刚发出来,同事们刚刚下班,结果某人说客户那边今天测试发现了两个严重的问题,一定要今天解决,并且…...

电视剧和综艺

综艺团建不能停电视机春色寄情人 爱情剧...

天地图编辑多边形和折线时,双击删除编辑点

天地图的编辑不支持删除编辑点的操作,于是研究写了一个。 // 使用 lodash 的防抖函数,防止双击时触发两次 const removeDotEventListener = debounce((e: T.MapEvent) => {// 获取被点击的目标// @ts-ignoreconst classList: DOMTokenList = e.originalEvent.target.class…...

Codeforces Round 1049 (Div. 2)

这场质量非常高。 A 我像区,我怎么卡 A 卡那么久。 睡眠不足会导致思路不清晰。这种题显然应该考虑所有位置不正确的字符。 对于一个在 \(0\) 位置上的 \(1\) 一定有一个与它未匹配的 \(0\),考虑能否通过一次操作将它们归位。 对于操作我们显然应该选择一个未归位的 \(0\) 和…...

POCamp 2023

P14011 [POCamp 2023] 珿求 / bootfall 神人题目。 令 \(A\) 为当前选择 \(a\) 的和,\(D\) 同理。我们要尽量让 \(\max(0, A - D) > \max(0, A - D)\)。 分类讨论,发现当 \(A - D \leq 0\) 且 \(A - D \leq 0\) 的时候一定平局,然后是两种特殊情况,若 \(A - D < 0 \w…...

美团AI面试

1、什么是正向代理和反向代理?两者有什么区别? 2、正向代理的作用时候,使用正向代理去访问被屏蔽的网站会怎样 3、JMM是什么,volintile的作用是什么 3、多线程中原子性的怎么实现的 4、数据库的事务分别是什么,他们解决了什么问题 5、可重复读是怎么实现的,他是怎么解决幻…...

技术面:Spring (bean的生命周期、创建方式、注入方式、作用域)

Spring Bean的生命周期是什么样的? 在Spring容器里一个Bean的从创建到销毁一般都是经历了以下几个阶段: 定义阶段(Bean元信息配置)=>实例化阶段(创建Bean对象)=>初始化阶段(执行初始化逻辑)=>使用阶段(Bean可用)=>销毁阶段(释放资源)定义阶段(BeanDef…...

马尔可夫决策

马尔可夫决策 马尔可夫决策:随机动态环境下序贯决策,其核心假设是 “马尔可夫性”—— 即 “未来状态的概率分布仅依赖于当前状态,与当前状态之前的历史无关”。MDP 的最终目标是找到一套最优策略 π(π: S→A,即 “在每个状态下选择哪个动作” 的规则) 马尔可夫决策可以…...

十九、指令流水线的基本概念

目录一、核心思想:类比工厂装配线二、一个经典的5级流水线模型(RISC)三、流水线的可视化:时空图四、流水线的优势五、流水线的挑战: hazards(冒险/冲突)总结指令流水线是一个计算机体系结构中的核心概念,旨在提高处理器的效率和吞吐率。 一、核心思想:类比工厂装配线 …...

本地布署Diffusers库 实现文生图 - yi

本地布署Diffusers库 实现文生图本地布署Diffusers库实现文生图 本次随笔,记录开源Python库Diffusers库的使用。 Diffusers库由Hugging Face维护,拥有活跃的社区和丰富的文档。Diffusers库是专注于扩散模型(Diffusion Models)的开源Python库。Diffusers库多任务支持​​:支…...

【光照】[光照模型]发展里程碑时间线

【从UnityURP开始探索游戏渲染】专栏-直达图形学光照模型发展史:技术演进与里程碑 section 基础奠基期(1960s-1970s)1967 : Lambert模型(漫反射) - Bui Tuong Phong提出 1971 : Gouraud着色 - Henri Gouraud发明顶点插值着色 1973 : Warnock算法 - 首次实现隐藏面消除 1975…...

算法设计作业-week1

任务一:企业内部编码规范参考 https://max.book118.com/html/2020/1120/8077006051003017.shtm任务二:《数学之美》阅读 读《数学之美》第二章:自然语言处理从规则到统计的启示 在阅读吴军博士《数学之美》第二章后,我对自然语言处理(NLP)的发展历程有了深刻的认识。这一…...

git merge

git merge :合并分支,从指定的分支名合并到当前所处的分支上。...

C语言学习

file:/D:/study/C语言/test1.c 现在开始学习c语言了,感觉跟java的大差不差,之后一段时间就学他吧。还有就是想吐槽一下devc的功能性有点差,连把代码文件拖拽到这里都不行。...

Ubuntu 的剪贴板

在 Ubuntu 上可以安装 copyq: sudo apt install copyq然后启动 copyq: copyqUbuntu 默认 Win+V 快捷键是打开通知,可以进行修改:为 copyq 添加快捷键,命令必须是 copyq toggle,名称可以随意。...

IDAPro--MCP详细配置教程

IDAPro--MCP详细配置教程 本文介绍如何配置idamcp实现ai自动化分析二进制文件,用于解决CTF竞赛中reverse与pwn类型的题目 IDA版本:9.1专业版 mcp:cherrystudio,lmstudio(本地部署ai) 一、项目简介 项目地址:https://github.com/mrexodia/ida-pro-mcp 功能:与IDApro实现联动…...

安全不是一个功能-而是一个地基

GitHub 主页 安全不是一个功能,而是一个地基 🔒🏗️ 我入行大概十年的时候,经历过一次让我至今心有余悸的安全事件。我们当时在为一个金融客户做一套在线交易系统。一个年轻的程序员,在写一个查询历史订单的接口时,为了图方便,直接用字符串拼接了 SQL 语句。是的,你没…...

你的测试又慢又不可靠-因为你测错了东西

GitHub 主页 你的测试又慢又不可靠?因为你测错了东西!🧪➡️✅ “我们应该写更多的测试。” 在每一个技术会议上,这句话都会被反复提起,就像一句神圣的咒语。人人都点头称是,人人都知道这是“正确”的。但一回到座位上,很多人脸上的表情就变得痛苦起来。😫 为什么?因…...

别再猜了-开始测量吧-一份实用的Web性能指南

GitHub 主页 别再猜了,开始测量吧:一份实用的 Web 性能指南 又是一年“黑五”,凌晨三点,我的手机像疯了一样尖叫起来。😱 不是闹钟,是监控警报。我们的主打电商服务,那个我们花了半年心血构建的系统,在流量洪峰面前,像纸糊的一样,彻底崩溃了。CPU 100%,内存溢出,日…...

你的中间件一团糟-是时候修复它了-️

GitHub 主页 中间件(Middleware)。这是 Web 开发中最强大的概念之一,也是最容易被滥用的概念之一。理论上,这是一个美妙的想法:一个由可复用组件构成的管道,可以检查、转换或终止请求。但在实践中,在我多年来使用过的许多框架中,它变成了一团乱麻,函数调用函数,控制流…...

文件不只是数据-一份稳健的文件处理指南

GitHub 主页 文件不只是数据:一份稳健的文件处理指南 📁💾 我永远忘不了那个下午。我们刚刚上线了一个允许用户上传个人头像的新功能。一切看起来都很完美。直到一个用户,出于无心或有意,尝试上传了一个他电脑上 2GB 大小的电影文件。🎬 服务器的内存监控瞬间飙红,CP…...

告别框架臃肿-我如何在不牺牲性能的情况下重新发现简单之美

GitHub 主页 我写了四十多年的代码。我刚开始编程的时候,打孔卡还是主流,互联网还只是大学实验室里一个遥不可及的梦想。我见证了无数语言和框架的兴衰起落,如同王朝更迭。我曾驾驭过技术的浪潮,也曾目睹它们在现实的海岸上撞得粉碎。如果说我从中学到了什么,那就是复杂性…...

超越-env-一份成熟的应用程序配置指南

GitHub 主页 超越.env:一份成熟的应用程序配置指南 🧐 让我给你讲个鬼故事。👻 几年前,我们团队的一个新来的小伙子,在一次紧急的线上热修复中,不小心把一个配置项搞错了。他本该把数据库地址指向生产环境的只读副本,结果,他忘了在生产服务器上更新那个小小的.env文件…...

20250913 NFLS 模拟赛 部分题目

简单倍增 #include <bits/stdc++.h> using namespace std; using ll = long long;int main() {freopen("fountain.in","r",stdin);freopen("fountain.out","w",stdout);ios::sync_with_stdio(false);cin.tie(nullptr);int n, q;…...

帐号内容定位

帐号定位原则和逻辑...