[K!nd4SUS 2025] Crypto

news2025/3/19 8:08:29

最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上,完成5/6,最后一个网站也上不去不弄了。

Matrices Matrices Matrices

这个是不是叫LWE呀,名词忘了,但意思还是知道。

b = a*s +e 这里的e是高斯分成,用10000个数测试会出现2,3但猜也就是1,0

另外这里a*s是反的,需要转置一下。

from sage.all import GF, Matrix
import os, random

assert("FLAG" in os.environ)
FLAG = os.environ["FLAG"]
assert(FLAG.startswith("KSUS{") and FLAG.endswith("}"))

q = 271
qf = GF(q)
m = 70
n = 30

def key_gen():
    a = Matrix(qf, [[qf.random_element() for _ in range(n)] for _ in range(m)])
    s = Matrix(qf, [[ord(c)] for c in FLAG])
    e = Matrix(qf, [[int(round(random.gauss(0, 2/3)))] for _ in range(m)])  #噪音[-3,3] 正常[-1,0,1]
    b = a * s + e
    return s, (a,b)

sk, pk = key_gen()
a, b = pk

print(f"a={[list(a[i]) for i in range(m)]}")
print(f"b={[list(b[i]) for i in range(m)]}")
q = 271
a = ...
b = ...
A = matrix(ZZ,a).T
B = matrix(ZZ,b).T
A1 = A.stack(B)

M = block_matrix(ZZ,[[1,A1],[0,q]])
K = 256
M[30,30] = K
M[:,31:] *= K
L = M.LLL()
for i in L:
    if i[30] in [256,-256] and all(k in [-768,-512,-256,0,256,512,768] for k in i[30:]):
        print(i)
        v = [abs(k) for k in i[:30]]
        if all(0x20<=k<0x7f for k in v):
            print(bytes(v))

#(-75, -83, -85, -83, -123, -73, -95, -103, -117, -51, -115, -115, -95, -112, -52, -114, -52, -109, -115, -95, -109, -52, -55, -55, -51, -114, -95, -58, -47, -125, 256, -256, 0, 0, -256, -256, 256, 0, 0, 0, 256, 0, 0, 0, 256, 256, 0, 0, 0, 0, -256, 0, -256, 0, 0, 256, 256, 0, 0, -512, 256, 0, -256, 0, 0, 256, 256, -512, 0, -256, -256, 0, -256, 256, 512, 256, 0, -256, 0, 0, 256, 0, 0, -256, 0, 256, -256, 0, 0, 0, 256, -256, 0, 0, 256, 256, 0, 0, 0, 0, -256)

#KSUS{I_gu3ss_p4r4ms_m4773r_:/}

Lightning Fast Scrambling

名字指出是LFS,但有点问题,当一开始使用时返回的直接就是从后前前的key每次8位。

from hashlib import sha256
from base64 import b64encode, b64decode

# utility wrapper for hashing

def digest(message):
	"Gives a bytes object representing the sha256 encoding of its argument (a sequence of bytes)"
	return sha256(message).digest()

# utility wrapper for encoding and decoding

def base64_encode(x):
	"Encodes a sequence of bytes in a string, using base64 encoding"
	return b64encode(x).decode()

def base64_decode(x):
	return b64decode(x, validate=True)

# crypto magic

def create_key(passphrase):
	h = passphrase.encode()
	h = digest(h)
	k = 0
	for i in range(8):
		k <<= 8
		k |= h[i]
	return k if k else 1

def secret_byte_stream(key):
	x = key
	mask = 255
	while True:
		y = x
		a = y & mask #返回尾部8位
		yield a
		y >>=  8
		x = y 
		y >>=  1
		a ^= y & mask
		y >>= 14
		a ^= y & mask
		y >>= 17
		a ^= y & mask
		x |= a << 56

def scramble(message, key):
	stream = secret_byte_stream(key)
	return bytes(x ^ y for x, y in zip(message, stream))

# user-facing stuff

def encrypt(text, passphrase):
	message = text.encode()
	hash = digest(message)
	key = create_key(passphrase)
	e = scramble(message, key)
	return '#'.join(map(base64_encode, [e, hash]))

def decrypt(text, passphrase):
	e, hash = map(base64_decode, text.split('#'))
	key = create_key(passphrase)
	message = scramble(e, key)
	if hash != digest(message):
		raise ValueError("Wrong key")
	return message.decode()

def create_flag(secret):
	return "".join(["KSUS{", secret.encode().hex(), "}"])

if __name__ == "__main__":
	secret = input("secret > ")
	passphrase = input("passphrase > ")
	flag = create_flag(secret)
	print("flag :", flag)
	challenge = encrypt(flag, passphrase)
	assert flag == decrypt(challenge, passphrase)
	print("challenge :", challenge)

由于flag头有5字节,所以只需要爆破3字节即可。通过hash值判断。

enc = 'VERY/Rjwj1U4DQZ/zyyHxSsMY1iYuOZHs//qWPVYInUz/5cxidrFCrSqco4bbVLpWjHHI4Z+JZOwOfsT#SUS/PDQPS4DlVum2aO+5+SuczHag7/rnYMBUr+pEqEU='
enc, h = map(b64decode, enc.split('#'))

#由已知头得到key的后5字节,前3字节爆破
key_tail = xor(b'KSUS{', enc[:5])[::-1]

for i1 in trange(256):
  for i2 in range(256):
    for i3 in range(256):
      key = bytes([i1,i2,i3])+key_tail
      key = bytes_to_long(key)
      m = scramble(enc,key)
      if h == sha256(m).digest():
          print(m)
          
#KSUS{6c6673725f6172655f6e6f745f7365637572653038363834363137}

Feistel <3

这个代码有点长

from Crypto.Util.number import bytes_to_long, getPrime, long_to_bytes
from Crypto.Util.Padding import pad
import os, signal

assert("FLAG" in os.environ)
FLAG = os.environ["FLAG"]
assert(FLAG.startswith("KSUS{") and FLAG.endswith("}"))

def xor_bytes(bytes_a, bytes_b):
    return bytes(a ^ b for a, b in zip(bytes_a, bytes_b)).ljust(2, b'\x00')

def f(sub_block, round_key, modulus):
    return long_to_bytes((bytes_to_long(sub_block) + pow(65537, bytes_to_long(round_key), modulus)) % (1<<17-1)).ljust(2, b'\x00')

def encrypt_block(block, key, modulus, rounds=8, shortcut=False):
    sub_block_1 = block[:2].ljust(2, b'\x00')
    sub_block_2 = block[2:4].ljust(2, b'\x00')
    sub_block_3 = block[4:].ljust(2, b'\x00')
    for i in range(0, rounds):
        round_key = key[i*2:i*2+2]
        new_sub_block_1 = xor_bytes(sub_block_1, sub_block_2) 
        new_sub_block_2 = f(sub_block_3, round_key, modulus)
        new_sub_block_3 = xor_bytes(sub_block_2, round_key)
        sub_block_1 = new_sub_block_1
        sub_block_2 = new_sub_block_2
        sub_block_3 = new_sub_block_3
        print(sub_block_1 + sub_block_2 + sub_block_3)
        if shortcut and sub_block_1 == b"\xff\xff":
            break
    return sub_block_1 + sub_block_2 + sub_block_3

def encrypt(plaintext, key, modulus):
    iv = os.urandom(6)
    padded = pad(plaintext.encode(), 6)
    blocks = [padded[i:i+6] for i in range(0, len(padded), 6)] 
    res = []
    for i in range(len(blocks)):
        if i == 0: block = xor_bytes(blocks[i], iv)
        else: block = xor_bytes(blocks[i], bytes.fromhex(res[-1]))
        res.append(encrypt_block(block, key, modulus).hex())
    return iv.hex() + "".join(res)

def handle():
    key = os.urandom(16)
    N = getPrime(1024)
    print("flag =", encrypt(FLAG, key, N))
    print("N =", N)

    encrypted = []
    while True:
        print("[1] Encrypt")
        print("[2] Exit")
        opt = input("> ")
        
        if opt == "1":
            plaintext = input("Enter your fantastic plaintext (in hex): ")
            if len(plaintext) % 2 != 0 or len(plaintext) < 2 or len(plaintext) > 12:
                print("It doesn't look fine to me :/")
            elif plaintext in encrypted:
                print("Nah, you've already encrypted it!")
            else:
                encrypted.append(plaintext)
                ciphertext = encrypt_block(bytes.fromhex(plaintext).rjust(6, b"\x00"), key, N, shortcut=True)
                print("Here it is: " + ciphertext.hex())
        elif opt == "2":
            print("Bye (^-^)")
            exit(0)
        else:
            print("Nope :/")

if __name__ == "__main__":
    signal.alarm(300)
    handle()

16字节密钥分成8段轮密钥,每段2字节。加密将密文分成6字节块块加密,块加密将明文分成3块:b1,b2,b3,然后得到b1^b2, b3+e^key_round, b2^key_round。

但在最后给了后门:当c1==FFFF里会退出并不都需要经过8轮。

这样就有了爆破的方法,只要让运行指定轮里使c1==FFFF即可。第一轮直接FFFF00000000则可根据第3段密文得到第1个轮密钥。第2轮是上一轮的c2和b1,b2如此类推。

先从远程得到key和密文。

#-------------远程获取密文,key,N
'''
i    b1^b2^c(i-1)   x    c(i-1)^ki
i+1  b1^b2^c(i-1)^c(i)   c(i)^k(i+1)
'''
from pwn import *

def getenc(tmp):
    p.sendlineafter(b"> ", b'1')
    p.sendlineafter(b"Enter your fantastic plaintext (in hex): ", tmp.hex().encode())
    p.recvuntil(b"Here it is: ")
    return bytes.fromhex(p.recvline().strip().decode())

p = remote('chall.ctf.k1nd4sus.it', 31013)

print(p.recvline())
print(p.recvline())

c2 = b'\x00\x00'
lc2 = b'\x00\x00'
tk = b''
for i in range(8):
    tmp = xor(b'\xff\xff', c2)+b'\x00'*4
    #enc = encrypt_block(tmp, key, N, shortcut=True)
    enc = getenc(tmp)
    c2 = xor(c2,enc[2:4])
    tk+=xor(enc[4:],lc2)
    lc2 = enc[2:4]
    print(tk.hex())

p.close()   

然后弄个解密函数解一下。这东西居然不是每次都成功,会出乱字符,不清楚怎么来的。

def decrypt_block(block, key):
    c1,c2,c3 = block[:2],block[2:4],block[4:]
    for i in range(7,-1,-1):
        round_key = key[i*2:i*2+2]
        b2 = xor(c3, round_key)
        b1 = xor(c1, b2)
        b3 = long_to_bytes((bytes_to_long(c2) - pow(65537,bytes_to_long(round_key), N))&0xffff)
        c1,c2,c3 = b1,b2,b3
        #print(c1,c2,c3)
    return c1+c2+c3

def decrypt(ciphertext, key, modulus):
    iv = ciphertext[:6]
    padded = ciphertext[6:]
    blocks = [padded[i:i+6] for i in range(0, len(padded), 6)] 
    res = b''
    for i in range(len(blocks)):
        tmp = decrypt_block(blocks[i], key)
        if i == 0:
            r = xor(tmp, iv)
        else: 
            r = xor(tmp,blocks[i-1])
        res += r
        #print(res)
    return res

key = bytes.fromhex('35e7c26a66bc651827cac73bc99c6667')
N = 175914002278057050406831961452237183138299948079975109116384718227058692202299804814271876290451098159041914033459568540766514412008363701006284852804260357617529486527991021342873932212136053758342488462611451121664507695932811146083705960145782839959600560090211913120599024239421171256321562939861953258223
flag = bytes.fromhex('9f3d4928ba479f1e53a7f287efe0dba974745b5fb4a472e24ecdcefb3a70824f9ec87aba16cf7ab4551324af56035c387cb9bf390888')
decrypt(flag,key,N)
#b'KSUS{N3veR_Ev3r_5hOr7cuT_F3ist3l_Ne7w0rks}\x06\x06\x06\x06\x06\x06'

key in the haystack

后边这两个是同一问题,一个小一个大,放一起

from Crypto.Util import number
from base64 import b64encode

prime = lambda: number.getPrime(512)
def b64enc(x):
	h = hex(x)[2:]
	if len(h) % 2:
		h = '0' + h
	return b64encode(bytes.fromhex(h)).decode()


p = prime()
q = prime()
with open("flag.txt") as f:
	flag = f.readline().strip()

n = p * q
m = int(flag.encode().hex(), 16)
c = pow(m, 65537, n)

print("ciphertext:", hex(c)[2:])

bale = [p, q]
bale.extend(prime() for _ in range(1<<6))

def add_hay(stack, straw):
	x = stack[0]
	for i in range(1, len(stack)):
		y = stack[i]
		stack[i] = y + (straw * x)
		x = y
	stack.append(straw * x)

stack = [1]
add_hay(stack, p) #[1,p]
add_hay(stack, q) #[1,p+q,p*q]
for straw in bale:
	add_hay(stack, straw)

print("size:", len(stack))
for x in stack:
	print(b64enc(x))

生成包含p,q的66个素数。然后经过add_hay生成stack。

这里是我自己的想法,这个方法不适用加强后的第2题,但也是个思路记录一下。

先设一个变量,从后向前导一下:Kn = S(n) + v*S(n-1) => Sn = Kn - v*S(n-1) 

最后得到等于f = ss[-1]*v - stack[-1]  这是一个66次1元方程,不算太大sage可以直接解。由于这里的66个素数都是对称的,直接可以解出66个根,这里边就包含p,q

from base64 import *
from Crypto.Util.number import *

outs = open('output.txt').readlines()
st = [bytes_to_long(b64decode(outs[2+i])) for i in range(69)]

#Kn = S(n) + v*S(n-1) => Sn = Kn - v*S(n-1) 
var('v')
ss = [1]
for i in range(1,68):
    ss.append(st[i]-v*ss[-1])

#K68 = v*S68
f = ss[-1]*v - st[-1]
ps = f.roots()
#v有66个解,对应66个素数
ps = [int(i[0]) for i in ps]

c = 0x7434d263623892ca660f4139c54ab02a8a14d87cd5c658fca9105f88f7ed5c888a744e949b716094c1d73fd8084eeaf72b23e97325829a69ca57a34e5e0b5272ddaf039bcc0aed2055968c8dfa7cd0373cca072c31123e6259659af03ce87b224bb7fdf13fb89b4ceb580d2d11524025ccb4f86560f3b006d99d86a63ab3aa5a

#猜flag小于512位
for p in ps:
    m = pow(c,invert(65537,p-1),p)
    print(long_to_bytes(int(m)))

#b'KSUS{6465726976617469766573206172652061206e69636520747269636b}'

key in the big haystack

这个升级版想了一天也没结果,然后问小鸡块给秒了。(数据有44M,就不贴了,也贴不上)

bale = [p, q]
bale.extend(prime() for _ in range(1<<9))

stack = [1]
add_hay(stack, p)
add_hay(stack, q)
for straw in bale:
    add_hay(stack, straw)
for straw in bale[2:]:
    add_hay(stack, straw + 2)

这题与上边只有这些变化,素数由64改为512,并且用了两次,所以结果是1029项。

这些给定的值实际上是一个1029项多项式的系数。可以先用3个变量试下。

(x+p)*(x+q)*(x+r) = x^3 + (p+q+r)*x^2 + (pq+qr+rp)*x + pqr

然后把这些数据代入含x的方程

f = \sum (x^{1028-i}*stack_{i}) _{i=0}^{1028}

而这个式子里除了p,q是2次外其它都是1次(包含512和素数和512个素数+2,素数+2后跟原来不形成平方关系)所以对f求导后与原来的f作gcd就能得到对于p,q的多项式。然后直接求解可得p,q

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

outs = open('big_output.txt').readlines()
enc = bytes.fromhex('5894f38180b9f41fb816c7428b64b63cf207e349832aeb256977526ec750239c5b75e846f2c7db19fc84d44e57c1a6181562487cd4a7e58bab9903feead90d884b574dcc9d35b0d6ae7d491d399dcdf6aacc74efff2135c673178e08b50ac1a09f5334cd0d4b48355b28219dbc31b45a2c7687114b69c4f8a0ae20740e9ce1fe')
c = bytes_to_long(enc)
stack = [bytes_to_long(b64decode(outs[2+i])) for i in range(1029)]

PR.<x> = PolynomialRing(ZZ)
f = sum([stack[i] * x^(1028-i) for i in range(len(stack))])
g = gcd(f.derivative(), f)
print(g)
#x^2 + 20450065261452182016584260876047399525896704233984001074890163119931284325571387726435254377483741593577102784943815777723994032502151858215013739509078298*x + 101344562563413148702503209034490415272295393794389109823061195011331285068194700252292458323839836319978741203645201395179109429423054143994480684843212974225776158987058221755014377991550489320194566899710227109943050130147641582913932721996451645082208066936338974731735770555839605141969367848387625804201
#系数分别是p+q,p*q 
v = g.roots()
p = abs(v[0][0])
#8434298218257235619456993018380042120260367010962473119979826477888279532268658434816651817828253000282579391409905630356600119281235242527375263115386349
long_to_bytes(int(pow(c,inverse_mod(65537,p-1),p)))
#KSUS{43525420697320612076657279206e69636520747269636b}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作记录 2017-02-04

工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors&#xff0c;见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…

【C++】stack和queue的使用及模拟实现(含deque的简单介绍)

文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍&#xff08;引入…

MySQL原理:逻辑架构

目的&#xff1a;了解 SQL执行流程 以及 MySQL 内部架构&#xff0c;每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层&#xff1a;连接层 3.1 数据库连接池(Conn…

ora-600 ktugct: corruption detected---惜分飞

接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…

Houdini :《哪吒2》神话与科技碰撞的创新之旅

《哪吒2》&#xff08;即《哪吒之魔童闹海》&#xff09;截止至今日&#xff0c;荣登全球票房榜第五。根据猫眼专业版数据&#xff0c;截至2025年3月15日&#xff0c;《哪吒2》全球累计票房&#xff08;含预售及海外&#xff09;超过150.19亿元&#xff0c;超越《星球大战&…

flink 写入es的依赖导入问题(踩坑记录)

flink 写入es的依赖导入问题(踩坑记录) ps&#xff1a;可能只是flink低版本才会有这个问题 1. 按照官网的导入方式&#xff1a; 2. 你会在运行sql-client的时候完美得到一个错误&#xff1a; Exception in thread "main" org.apache.flink.table.client.SqlClientEx…

PCL 高斯函数拟合(正太分布)

文章目录 一、简介二、实现代码三、实现效果一、简介 类似于之前最小二乘法的做法,我们需要先确定目标函数: 通过最小二乘法,找到使预测值与实际数据残差平方和最小的参数: 不过由于这是一个非线性最小二乘问题,因此这里无法使用矩阵的形式之间求解它的解析解了,因此这里…

深度革命:ResNet 如何用 “残差连接“ 颠覆深度学习

一文快速了解 ResNet创新点 在深度学习的历史长河中&#xff0c;2015年或许是最具突破性的一年。这一年&#xff0c;微软亚洲研究院的何恺明团队带着名为ResNet&#xff08;残差网络&#xff09;的模型横空出世&#xff0c;在ImageNet图像分类竞赛中以3.57%的错误率夺冠&#…

Java基础与集合

参考 Java基础知识详解&#xff1a;从面向对象到异常处理-CSDN博客 2024年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 基础知识 java概述 什么是java&#xff1f; java是一种面向对象的编程语言 java特点 面向对象&#xff08;继承&#…

【Python 算法零基础 1.线性枚举】

我装作漠视一切&#xff0c;以为这样就可以不在乎 —— 25.3.17 一、线性枚举的基本概念 1.时间复杂度 线性枚举的时间复杂度为 O(nm)&#xff0c;其中 n是线性表的长度。m 是每次操作的量级&#xff0c;对于求最大值和求和来说&#xff0c;因为操作比较简单&#xff0c;所以 …

003 SpringCloud整合-LogStash安装及ELK日志收集

SpringCloud整合-LogStash安装及ELK日志收集 文章目录 SpringCloud整合-LogStash安装及ELK日志收集1.安装ElasticSearch和kibana2.Docker安装logstash1.拉取docker镜像2.创建外部挂载目录3.拷贝容器内部文件到宿主机4.修改外部挂载文件5.运行docker容器 3.整合kibana1.进入kiba…

AI预测体彩排3新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月18日第22弹

前面由于工作原因停更了很长时间&#xff0c;停更期间很多彩友一直私信我何时恢复发布每日预测&#xff0c;目前手头上的项目已经基本收尾&#xff0c;接下来恢复发布。当然&#xff0c;也有很多朋友一直咨询3D超级助手开发的进度&#xff0c;在这里统一回复下。 由于本人既精…

数据结构入门(1)——算法复杂度

目录 一、前言 二、数据结构 2.1数据结构的概念 2.2数据结构的组成 2.3算法 三、oj题引进 四、复杂度 4.1复杂度的概念 4.2大O渐进表示法 4.3时间复杂度 4.4时间复杂度计算示例 4.4.1示例1 4.4.2示例2 4.4.3示例3 4.4.4示例4 4.4.5示例5 4.4.6示例6 4.4.7示例7 4.4.8示例8 4.5空…

【最新版】智慧小区物业管理小程序源码+uniapp全开源

一.系统介绍 智慧小区物业管理小程序,包含小区物业缴费、房产管理、在线报修、业主活动报名、在线商城等功能。为物业量身打造的智慧小区运营管理系统,贴合物业工作场景,轻松提高物业费用收缴率,更有功能模块个性化组合,助力物业节约成本高效运营。 二.搭建环境 系统环…

DeepSeek搭建本地知识库

1. 注册硅基流动 首先&#xff0c;打开浏览器&#xff0c;访问硅基流动的官方网站。 https://account.siliconflow.cn/ 在注册页面准确输入你的手机号&#xff0c;完成账号注册。这是搭建本地知识库的第一步&#xff0c;为后续获取重要权限做准备。 成功注册后&#xff0c;进…

实验9 高级搜索技术1

实验9 高级搜索技术1 一、实验目的 &#xff08;1&#xff09;掌握高级搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉爬山法搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&…

【数据挖掘】Python基础环境安装配置

【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2&#xff0c;然后基于该Python版本安装Jupyter not…

【2025新版本】【谷粒商城版】Kubernetes

本文作者&#xff1a; slience_me 文章目录 【2025】Kubernetes1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件&#xff08;CNI&#xff09;3.6 Ku…

vulhub-Billu-b0x攻略

靶场下载链接 https://download.vulnhub.com/billu/Billu_b0x.zip 将kali和Billu,NAT连接 获取靶场ip arp-scan -l 使用diesearch进行目录扫描 dirsearch -u " " 查看目录中的信息 打开add.php,得到有上传文件功能的&#xff08;看到后面你会发现其实这里就可以完…