CTF-RE 从0到N:Chacha20逆向实战 2024 强网杯青少年专项赛 EnterGame WP (END)
只想解题的看最后就好了,前面是算法分析
Chacha20
c语言是如何利用逻辑运算符拆分变量和合并的
通过百度网盘分享的文件:EnterGame_9acdc7c33f85832082adc6a4e...
链接:https://pan.baidu.com/s/182SRj2Xemo63PCoaLNUsRQ?pwd=1111
提取码:1111
--来自百度网盘超级会员V2的分享
step1 主函数
int __fastcall main(int argc, const char **argv, const char **envp)unsigned int v3; // eax_WORD v5[20]; // [rsp+8h] [rbp-138h] BYREF_QWORD s2[2]; // [rsp+30h] [rbp-110h] BYREF_QWORD v7[4]; // [rsp+40h] [rbp-100h] BYREFchar s[112]; // [rsp+60h] [rbp-E0h] BYREF_BYTE s1[104]; // [rsp+D0h] [rbp-70h] BYREFunsigned __int64 v10; // [rsp+138h] [rbp-8h]v10 = __readfsqword(0x28u);puts("Welcome to the Youth Cybersecurity Challenge!");s2[0] = 0x7A2B7587D3AA135ELL;s2[1] = 0xD21D7E49A304161BLL;qmemcpy(v7, "k]X@^DcYHQ", 10);*(_QWORD *)((char *)&v7[1] + 2) = 0x82AD5855585E540DLL;*(_QWORD *)((char *)&v7[2] + 2) = 0xC1CE5D58ABE7DCAFLL;puts("Please enter the password to start the game:");fgets(s, 100, _bss_start);s[strcspn(s, "\n")] = 0;HIBYTE(v5[18]) = 0;v5[19] = 0;strcpy((char *)v5, "01234567Youth Strengthens the Nation");v3 = strlen(s);chacha20_encrypt(&v5[4], v5, s, s1, v3);if ( !memcmp(s1, s2, 0x2AuLL) ){puts("Password correct, you may start the game.");puts("With my strength, I secure the cyber frontier!");}else{puts("Incorrect password, cannot start the game.");}return 0;
}
直接定位到比较函数,在此处动态调试抽取s2的值
if ( !memcmp(s1, s2, 0x2AuLL) ){puts("Password correct, you may start the game.");puts("With my strength, I secure the cyber frontier!");}else{puts("Incorrect password, cannot start the game.");}
建立数组使用插件dump数组备用
unsigned char data[42] = {0x5E, 0x13, 0xAA, 0xD3, 0x87, 0x75, 0x2B, 0x7A, 0x1B, 0x16, 0x04, 0xA3, 0x49, 0x7E, 0x1D, 0xD2, 0x6B, 0x5D, 0x58, 0x40, 0x5E, 0x44, 0x63, 0x59, 0x48, 0x51, 0x0D, 0x54, 0x5E, 0x58, 0x55, 0x58, 0xAD, 0x82, 0xAF, 0xDC, 0xE7, 0xAB, 0x58, 0x5D, 0xCE, 0xC1
};
step2 分析chacha20_encrypt参数
unsigned __int64 __fastcall chacha20_encrypt(int *a1, int *a2, __int64 a3, __int64 a4, int a5)
{int i; // [rsp+38h] [rbp-98h]int j; // [rsp+3Ch] [rbp-94h]int v11[12]; // [rsp+40h] [rbp-90h] BYREFint v12; // [rsp+70h] [rbp-60h]int v13; // [rsp+74h] [rbp-5Ch]int v14; // [rsp+78h] [rbp-58h]int v15; // [rsp+7Ch] [rbp-54h]char v16[72]; // [rsp+80h] [rbp-50h] BYREFunsigned __int64 v17; // [rsp+C8h] [rbp-8h]v17 = __readfsqword(0x28u);qmemcpy(v11, "expand 32-byte k", 16);v11[4] = *a1;v11[5] = a1[1];v11[6] = a1[2];v11[7] = a1[3];v11[8] = a1[4];v11[9] = a1[5];v11[10] = a1[6];v11[11] = a1[7];v12 = 0;v13 = 0;v14 = *a2;v15 = a2[1];for ( i = 0; i < a5; i += 64 ){chacha20_block(v16, v11);++v12;for ( j = 0; j <= 63 && a5 > i + j; ++j )*(_BYTE *)(i + j + a4) = v16[j] ^ *(_BYTE *)(i + j + a3);}return v17 - __readfsqword(0x28u);
}
无视换位直接动态调试在此句断下
for ( i = 0; i < a5; i += 64 ){chacha20_block(v16, v11);++v12;for ( j = 0; j <= 63 && a5 > i + j; ++j )*(_BYTE *)(i + j + a4) = v16[j] ^ *(_BYTE *)(i + j + a3);}
化简,因为i + j + a4 等价于 a4[i + j]
for ( i = 0; i < a5; i += 64 ){chacha20_block(v16, v11);++v12;for ( j = 0; j <= 63 && a5 > i + j; ++j )a4[i + j] = v16[j] ^ a3[i+j];}
对比标准函数
while (in_len > 0) {// 生成一个加密块chacha20_block((uint32_t *)block, state);state[12]++; // 每次加密后递增计数器size_t block_size = (in_len < 64) ? in_len : 64; // 计算当前块的大小for (i = 0; i < block_size; i++) {out[i] = in[i] ^ block[i]; // 将输入数据与加密块异或得到密文}
step3 _block()分析
unsigned __int64 __fastcall chacha20_block(__int64 a1, const void *a2)
{int i; // [rsp+18h] [rbp-58h]int j; // [rsp+1Ch] [rbp-54h]unsigned int dest; // [rsp+20h] [rbp-50h] BYREFunsigned int v6; // [rsp+24h] [rbp-4Ch]unsigned int v7; // [rsp+28h] [rbp-48h]unsigned int v8; // [rsp+2Ch] [rbp-44h]unsigned int v9; // [rsp+30h] [rbp-40h]unsigned int v10; // [rsp+34h] [rbp-3Ch]unsigned int v11; // [rsp+38h] [rbp-38h]unsigned int v12; // [rsp+3Ch] [rbp-34h]unsigned int v13; // [rsp+40h] [rbp-30h]unsigned int v14; // [rsp+44h] [rbp-2Ch]unsigned int v15; // [rsp+48h] [rbp-28h]unsigned int v16; // [rsp+4Ch] [rbp-24h]unsigned int v17; // [rsp+50h] [rbp-20h]unsigned int v18; // [rsp+54h] [rbp-1Ch]unsigned int v19; // [rsp+58h] [rbp-18h]unsigned int v20; // [rsp+5Ch] [rbp-14h]unsigned __int64 v21; // [rsp+68h] [rbp-8h]v21 = __readfsqword(0x28u);memcpy(&dest, a2, 0x40uLL);for ( i = 0; i <= 9; ++i ){dest += v9;v17 = (dest << 16) ^ v17 | HIWORD(dest) ^ v17;v13 += v17;v9 = (v13 << 12) ^ v9 | (v13 >> 20) ^ v9;dest += v9;v17 = (dest << 8) ^ v17 | HIBYTE(dest) ^ v17;v13 += v17;v9 = (v13 << 7) ^ v9 | (v13 >> 25) ^ v9;v6 += v10;v18 = (v6 << 16) ^ v18 | HIWORD(v6) ^ v18;v14 += v18;v10 = (v14 << 12) ^ v10 | (v14 >> 20) ^ v10;v6 += v10;v18 = (v6 << 8) ^ v18 | HIBYTE(v6) ^ v18;v14 += v18;v10 = (v14 << 7) ^ v10 | (v14 >> 25) ^ v10;v7 += v11;v19 = (v7 << 16) ^ v19 | HIWORD(v7) ^ v19;v15 += v19;v11 = (v15 << 12) ^ v11 | (v15 >> 20) ^ v11;v7 += v11;v19 = (v7 << 8) ^ v19 | HIBYTE(v7) ^ v19;v15 += v19;v11 = (v15 << 7) ^ v11 | (v15 >> 25) ^ v11;v8 += v12;v20 = (v8 << 16) ^ v20 | HIWORD(v8) ^ v20;v16 += v20;v12 = (v16 << 12) ^ v12 | (v16 >> 20) ^ v12;v8 += v12;v20 = (v8 << 8) ^ v20 | HIBYTE(v8) ^ v20;v16 += v20;v12 = (v16 << 7) ^ v12 | (v16 >> 25) ^ v12;dest += v10;v20 = (dest << 16) ^ v20 | HIWORD(dest) ^ v20;v15 += v20;v10 = (v15 << 12) ^ v10 | (v15 >> 20) ^ v10;dest += v10;v20 = (dest << 8) ^ v20 | HIBYTE(dest) ^ v20;v15 += v20;v10 = (v15 << 7) ^ v10 | (v15 >> 25) ^ v10;v6 += v11;v17 = (v6 << 16) ^ v17 | HIWORD(v6) ^ v17;v16 += v17;v11 = (v16 << 12) ^ v11 | (v16 >> 20) ^ v11;v6 += v11;v17 = (v6 << 8) ^ v17 | HIBYTE(v6) ^ v17;v16 += v17;v11 = (v16 << 7) ^ v11 | (v16 >> 25) ^ v11;v7 += v12;v18 = (v7 << 16) ^ v18 | HIWORD(v7) ^ v18;v13 += v18;v12 = (v13 << 12) ^ v12 | (v13 >> 20) ^ v12;v7 += v12;v18 = (v7 << 8) ^ v18 | HIBYTE(v7) ^ v18;v13 += v18;v12 = (v13 << 7) ^ v12 | (v13 >> 25) ^ v12;v8 += v9;v19 = (v8 << 16) ^ v19 | HIWORD(v8) ^ v19;v14 += v19;v9 = (v14 << 12) ^ v9 | (v14 >> 20) ^ v9;v8 += v9;v19 = (v8 << 8) ^ v19 | HIBYTE(v8) ^ v19;v14 += v19;v9 = (v14 << 7) ^ v9 | (v14 >> 25) ^ v9;}for ( j = 0; j <= 15; ++j )*(4LL * j + a1) = *(&dest + j) + *(a2 + j);return v21 - __readfsqword(0x28u);
}
将其与标准Chacha20代码对比
void chacha20_block(uint32_t output[16], const uint32_t input[16]) {int i;uint32_t x[16]; // 创建一个32位的数组用于存储状态memcpy(x, input, sizeof(x)); // 将输入状态复制到数组x// 进行20轮加密操作,每轮执行四分之一轮操作for (i = 0; i < 10; i++) {// 奇数轮QR(x[0], x[4], x[8], x[12]);QR(x[1], x[5], x[9], x[13]);QR(x[2], x[6], x[10], x[14]);QR(x[3], x[7], x[11], x[15]);// 偶数轮QR(x[0], x[5], x[10], x[15]);QR(x[1], x[6], x[11], x[12]);QR(x[2], x[7], x[8], x[13]);QR(x[3], x[4], x[9], x[14]);}// 将加密结果与原始输入状态相加,输出最终结果for (i = 0; i < 16; ++i) {output[i] = x[i] + input[i];}
}
继续对比
#define QR(a, b, c, d) ( \a += b, d ^= a, d = ROTL(d, 16), \c += d, b ^= c, b = ROTL(b, 12), \a += b, d ^= a, d = ROTL(d, 8), \c += d, b ^= c, b = ROTL(b, 7))
此加密函数外层循环包含重复的此块8次,与此对应分析
QR(x[0], x[4], x[8], x[12]);QR(x[1], x[5], x[9], x[13]);QR(x[2], x[6], x[10], x[14]);QR(x[3], x[7], x[11], x[15]);// 偶数轮QR(x[0], x[5], x[10], x[15]);QR(x[1], x[6], x[11], x[12]);QR(x[2], x[7], x[8], x[13]);QR(x[3], x[4], x[9], x[14]);
dest += v9;v17 = (dest << 16) ^ v17 | HIWORD(dest) ^ v17;v13 += v17;v9 = (v13 << 12) ^ v9 | (v13 >> 20) ^ v9;dest += v9;v17 = (dest << 8) ^ v17 | HIBYTE(dest) ^ v17;v13 += v17;v9 = (v13 << 7) ^ v9 | (v13 >> 25) ^ v9;v6 += v10;
退化ida的HIWORD
dest += v9;
v17 = (dest << 16) ^ v17 | (dest >> 16) ^ v17;
v13 += v17;
v9 = (v13 << 12) ^ v9 | (v13 >> 20) ^ v9;
dest += v9;
v17 = (dest << 8) ^ v17 | (dest >> 24) ^ v17;
v13 += v17;
v9 = (v13 << 7) ^ v9 | (v13 >> 25) ^ v9;
v6 += v10;
分析
-
变量映射:
- 我们来对比两个代码片段中的变量:
a
对应dest
b
对应v9
c
对应v13
d
对应v17
- 我们来对比两个代码片段中的变量:
-
操作分析:
- 第一轮:
-
第一个代码片段:
a += b
d ^= a
d = ROTL(d, 16)
c += d
b ^= c
b = ROTL(b, 12)
a += b
d ^= a
d = ROTL(d, 8)
c += d
b ^= c
b = ROTL(b, 7)
-
第二个代码片段:
dest += v9
(对应a += b
)v17 = (dest << 16) ^ v17 | (dest >> 16) ^ v17
(对应d ^= a
和d = ROTL(d, 16)
)v13 += v17
(对应c += d
)v9 = (v13 << 12) ^ v9 | (v13 >> 20) ^ v9
(对应b ^= c
和b = ROTL(b, 12)
)dest += v9
(对应a += b
)v17 = (dest << 8) ^ v17 | (dest >> 24) ^ v17
(对应d ^= a
和d = ROTL(d, 8)
)v13 += v17
(对应c += d
)v9 = (v13 << 7) ^ v9 | (v13 >> 25) ^ v9
(对应b ^= c
和b = ROTL(b, 7)
)
-
- 第一轮:
step4 重新化简代码
unsigned __int64 __fastcall chacha20_encrypt(int *a1, int *a2, __int64 a3, __int64 a4, int a5)
{int i; // [rsp+38h] [rbp-98h]int j; // [rsp+3Ch] [rbp-94h]int v11[12]; // [rsp+40h] [rbp-90h] BYREFint v12; // [rsp+70h] [rbp-60h]int v13; // [rsp+74h] [rbp-5Ch]int v14; // [rsp+78h] [rbp-58h]int v15; // [rsp+7Ch] [rbp-54h]char v16[72]; // [rsp+80h] [rbp-50h] BYREFunsigned __int64 v17; // [rsp+C8h] [rbp-8h]v17 = __readfsqword(0x28u);qmemcpy(v11, "expand 32-byte k", 16);v11[4] = *a1;v11[5] = a1[1];v11[6] = a1[2];v11[7] = a1[3];v11[8] = a1[4];v11[9] = a1[5];v11[10] = a1[6];v11[11] = a1[7];v12 = 0;v13 = 0;v14 = *a2;v15 = a2[1];for ( i = 0; i < a5; i += 64 ){chacha20_block(v16, v11);++v12;for ( j = 0; j <= 63 && a5 > i + j; ++j )*(_BYTE *)(i + j + a4) = v16[j] ^ *(_BYTE *)(i + j + a3);}return v17 - __readfsqword(0x28u);
}
1.根据Chacha20加密代码v11
是state[16]
重定义v11
为int state[16]
2.根据Chacha20加密代码v12
重命名为block
3.根据Chacha20加密代码a4
=>char out[64]
,a3
=>in[64]
unsigned __int64 __fastcall chacha20_encrypt(int *a1, int *a2, char (*in)[64], char (*out)[64], int a5)
{int i; // [rsp+38h] [rbp-98h]int j; // [rsp+3Ch] [rbp-94h]int state[16]; // [rsp+40h] [rbp-90h] BYREF_BYTE block[72]; // [rsp+80h] [rbp-50h] BYREFunsigned __int64 v13; // [rsp+C8h] [rbp-8h]v13 = __readfsqword(0x28u);qmemcpy(state, "expand 32-byte k", 16);state[4] = *a1;state[5] = a1[1];state[6] = a1[2];state[7] = a1[3];state[8] = a1[4];state[9] = a1[5];state[10] = a1[6];state[11] = a1[7];state[12] = 0;state[13] = 0;state[14] = *a2;state[15] = a2[1];for ( i = 0; i < a5; i += 64 ){chacha20_block(block, state);++state[12];for ( j = 0; j <= 63 && a5 > i + j; ++j )(*out)[i + j] = block[j] ^ (*in)[i + j];}return v13 - __readfsqword(0x28u);
}
我们能看到此时ida代码已经趋近与标准代码
try get flag
#include <stdint.h> // 包含标准整数类型
#include <string.h> // 包含内存操作函数,如 memcpy
#include <cstdio> // 包含标准输入输出函数,如 putchar// 宏定义:循环左移(左移操作后,右边溢出的部分重新回到左边)
#define ROTL(a, b) (((a) << (b)) | ((a) >> (32 - (b))))// 宏定义:Chacha20的四分之一轮(Quarter Round)操作
#define QR(a, b, c, d) ( \a += b, d ^= a, d = ROTL(d, 16), \c += d, b ^= c, b = ROTL(b, 12), \a += b, d ^= a, d = ROTL(d, 8), \c += d, b ^= c, b = ROTL(b, 7))// ChaCha20加密算法中的块函数
void chacha20_block(uint32_t output[16], const uint32_t input[16]) {int i;uint32_t x[16]; // 创建一个32位的数组用于存储状态memcpy(x, input, sizeof(x)); // 将输入状态复制到数组x// 进行20轮加密操作,每轮执行四分之一轮操作for (i = 0; i < 10; i++) {// 奇数轮QR(x[0], x[4], x[8], x[12]);QR(x[1], x[5], x[9], x[13]);QR(x[2], x[6], x[10], x[14]);QR(x[3], x[7], x[11], x[15]);// 偶数轮QR(x[0], x[5], x[10], x[15]);QR(x[1], x[6], x[11], x[12]);QR(x[2], x[7], x[8], x[13]);QR(x[3], x[4], x[9], x[14]);}// 将加密结果与原始输入状态相加,输出最终结果for (i = 0; i < 16; ++i) {output[i] = x[i] + input[i];}
}// ChaCha20加密函数
void chacha20_encrypt(uint8_t *out, const uint8_t *in, size_t in_len) {/** 从 chacha20_block(block, state); 断点抽取*/uint32_t state[16] = {0x61707865, 0x3320646E, 0x79622D32, 0x6B206574, 0x74756F59, 0x74532068, 0x676E6572, 0x6E656874,0x68742073, 0x614E2065, 0x6E6F6974, 0x00000000, 0x00000000, 0x00000000, 0x33323130, 0x37363534};uint8_t block[64]; // 存储每次生成的64字节的加密块size_t i, j;while (in_len > 0) {// 生成一个加密块chacha20_block((uint32_t *)block, state);state[12]++; // 每次加密后递增计数器size_t block_size = (in_len < 64) ? in_len : 64; // 计算当前块的大小for (i = 0; i < block_size; i++) {out[i] = in[i] ^ block[i]; // 将输入数据与加密块异或得到密文}// 更新剩余输入数据的长度和指针in_len -= block_size;in += block_size;out += block_size;}
}int main() {/** 从 if ( !memcmp(s1, s2, 0x2AuLL) ) 断点抽取*/uint8_t ciphertext[42] = {0x5E, 0x13, 0xAA, 0xD3, 0x87, 0x75, 0x2B, 0x7A, 0x1B, 0x16, 0x04, 0xA3, 0x49, 0x7E, 0x1D, 0xD2,0x6B, 0x5D, 0x58, 0x40, 0x5E, 0x44, 0x63, 0x59, 0x48, 0x51, 0x0D, 0x54, 0x5E, 0x58, 0x55, 0x58,0xAD, 0x82, 0xAF, 0xDC, 0xE7, 0xAB, 0x58, 0x5D, 0xCE, 0xC1}; // 用于存储加密后的密文uint8_t decrypted[64]; // 用于存储解密后的数据// 执行解密操作(加密是对称的,解密过程与加密相同)chacha20_encrypt(decrypted, ciphertext, sizeof(ciphertext));// 解密后的数据应当与原始明文相同for (int i = 0; i < sizeof(decrypted); i++) {putchar(decrypted[i]); // 输出解密后的字符}return 0;
}
不知道为什么不对,直接暴力解题,尝试抽取chacha20_block(block, state);
的block
和密文暴力解题
a = [0x38, 0x7F, 0xCB, 0xB4, 0xFC, 0x46, 0x13, 0x4F, 0x22, 0x27, 0x31, 0xC2, 0x2D, 0x53, 0x25, 0xB4, 0x58, 0x6F, 0x75, 0x74, 0x67, 0x20, 0x53, 0x74, 0x71, 0x65, 0x6E, 0x67, 0x73, 0x68, 0x65, 0x6E, 0x9A, 0xE4, 0x9E, 0xB8, 0x86, 0xCF, 0x69, 0x3F, 0xAA, 0xBC, 0x94, 0x90, 0x84, 0xDD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x31, 0x32, 0x33, 0x33, 0x35, 0x36, 0x37]
b = [0x5E, 0x13, 0xAA, 0xD3, 0x87, 0x75, 0x2B, 0x7A, 0x1B, 0x16, 0x04, 0xA3, 0x49, 0x7E, 0x1D, 0xD2, 0x6B, 0x5D, 0x58, 0x40, 0x5E, 0x44, 0x63, 0x59, 0x48, 0x51, 0x0D, 0x54, 0x5E, 0x58, 0x55, 0x58, 0xAD, 0x82, 0xAF, 0xDC, 0xE7, 0xAB, 0x58, 0x5D, 0xCE, 0xC1]
flag = ''
for i in range(len(b)):flag += chr(a[i] ^ b[i])print(flag)
…直接出了,我想的太复杂了,不应该想这么复杂的
相关文章:
CTF-RE 从0到N:Chacha20逆向实战 2024 强网杯青少年专项赛 EnterGame WP (END)
只想解题的看最后就好了,前面是算法分析 Chacha20 c语言是如何利用逻辑运算符拆分变量和合并的 通过百度网盘分享的文件:EnterGame_9acdc7c33f85832082adc6a4e... 链接:https://pan.baidu.com/s/182SRj2Xemo63PCoaLNUsRQ?pwd1111 提取码:1…...
vue3 ajax获取json数组排序举例
使用axios获取接口数据 可以在代码中安装axios包,并写入到package.json文件: npm install axios -S接口调用代码举例如下: const fetchScore async () > {try {const res await axios.get(http://127.0.0.1:8000/score/${userInput.v…...
web安全之信息收集
在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…...
报错:java: 无法访问org.springframework.boot.SpringApplication
idea报错内容: java: 无法访问org.springframework.boot.SpringApplication 报错原因: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4…...
线上+线下≠新零售,6大互通诠释新零售的核心要点-亿发
新零售,这个词汇在近年来频繁出现在我们的视野中,它不仅仅是线上与线下的简单相加,而是一场深刻的商业变革。本文将通过6大互通的核心要点,为您揭示新零售的真正内涵。 1. 商品的互联互通 新零售模式下,商品的互联互…...
GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?
在技术快速发展的今天,代码辅助工具已成为提升开发效率的利器。今天,我们带来了一个激动人心的消息——GitHub Copilot宣布引入多模型选择功能,这不仅是技术上的一次飞跃,更是对开发者工作流程的一次革新。 多模型选择:…...
AWS账户是否支持区域划分?
在云计算的世界中,亚马逊网络服务(AWS)凭借其全球化的基础设施和丰富的服务选项受到许多企业和开发者的青睐。一个常见的问题是:AWS账户是否支持区域划分?为了回答这个问题,我们九河云一起深入了解AWS的区域…...
Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能
目录 Easy Excel 通过 【自定义批注拦截器】实现导出的【批注】功能需求原型:相关数据:要导出的对象字段postman 格式导出对象VO 自定义批注拦截器业务代码: 拦截器代码解释:详细解释:格式优化: Easy Excel…...
整数对最小和(Java Python JS C++ C )
题目描述 给定两个整数数组array1、array2,数组元素按升序排列。 假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素, 并对取出的所有元素求和,计算和的最小值。 注意: 两对元素如果对应于array1、array2中的两个下标均相同,则视为同一对元…...
MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`
目录 前言1. 问题背景2. 错误分析2.1 错误信息详解2.2 可能原因 3. 问题排查与解决方案3.1 检查 MySQL 错误日志3.2 验证 MySQL 配置文件3.3 检查文件和目录权限3.4 手动启动 MySQL 服务3.5 修复 systemd 配置文件3.6 验证依赖环境 4. 进一步优化与自动化处理结语 前言 在日常…...
谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...
深度学习Pytorch中的模型保存与加载方法
深度学习:Pytorch中的模型保存与加载方法 在 PyTorch 中,模型的保存和加载对于模型的持久化和后续应用至关重要。这里详细介绍了两种主要方法:保存整个模型(包括架构和参数)和仅保存模型的状态字典。以下内容进一步完善了加载模型…...
小红书矩阵运营:怎么通过多个账号来提升品牌曝光?
在如今的社交媒体环境中,小红书作为一个以分享生活方式、购物心得为主的平台,已经成为品牌营销的热土。尤其是通过“小红书矩阵”,品牌能够精准触达不同的用户群体,提升曝光度和转化率。那么,如何通过多个账号进行矩阵…...
Llama-2-7b:vocab size:32000;embeddings:4096;hidden_layers是什么意思
目录 Llama-2-7b:vocab size:32000;embeddings:4096 vocab size:模型能解析词汇数量==n_vocab num_hidden_layers: 32 nanogpt隐藏层4 "initializer_range": 0.02 Token Embed是什么 举例说明 不同Chat版本的Token Embed(Token Embeddings) 区别 Llama…...
【moveit!】ROS学习笔记
参考:Movelt使用笔记-Movelt Setup Assistant-CSDN博客 MoveIt! 学习笔记12 - MoveIt! Setup Assistant 配置方法_ros moveit 添加home点-CSDN博客 一、使用Setup Assistant配置机械臂 (1)使用如下命令启动MoveIt Setup Assistant rosrun…...
【Leetcode 每日一题 - 补卡】3259. 超级饮料的最大强化能量
问题背景 来自未来的体育科学家给你两个整数数组 e n e r g y D r i n k A energyDrinkA energyDrinkA 和 e n e r g y D r i n k B energyDrinkB energyDrinkB,数组长度都等于 n n n。这两个数组分别代表 A A A、 B B B 两种不同能量饮料每小时所能提供的强化…...
【人工智能】使用Python实现序列到序列(Seq2Seq)模型进行机器翻译
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Sequence-to-Sequence, Seq2Seq)模型是解决序列输入到序列输出任务的核心架构,广泛应用于机器翻译、文本摘要和问答系统等自然语言处理任务中。本篇文章深入介绍 Seq2Seq 模型的原理及其核心组件(…...
量化交易系统开发-实时行情自动化交易-4.4.1.做市策略实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略实现。 做市策…...
Pinia之2:计数器案例、computed函数、异步action、storeToRefs函数、pinia调试
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Microsoft Excel如何插入多行
1.打开要编辑的excel表,在指定位置,鼠标右键点击“插入”一行 2.按住shift键,鼠标的光标箭头会变化成如下图所示 3.一直按住shift键和鼠标左键,往下拖动,直至到插入足够的行...
Redis【1】- 如何阅读Redis 源码
1 Redis 的简介 Redis 实际上是简称,全称为 Remote Dictionary Server (远程字典服务器),由 Salvatore Sanfilippo 写的高性能 key-value 存储系统,其完全开源免费,遵守 BSD 协议。Redis 与其他 key-value 缓存产品(如…...
shell查看服务器的内存和CPU,实时使用情况
要查看服务器的内存和 CPU 实时使用情况,可以使用以下方法和命令: 1. 使用 top 运行 top 命令以显示实时的系统性能信息,包括 CPU 和内存使用情况。 top按 q 退出。输出内容包括: CPU 使用率:位于顶部,标…...
软件/游戏提示:mfc42u.dll没有被指定在windows上运行如何解决?多种有效解决方法汇总分享
遇到“mfc42u.dll 没有被指定在 Windows 上运行”的错误提示,通常是因为系统缺少必要的运行库文件或文件损坏。以下是多种有效的解决方法,可以帮助你解决这个问题: 原因分析 出现这个错误的原因是Windows无法找到或加载MFC42u.dll文件。这可…...
《Python基础》之函数、模块与库
目录 简介 一、函数 1、数学类函数 2、聚合类函数 3、和进制相关的函数 4、字符类函数 5、类型转换相关函数 6、获取输出类函数 二、模块与库的使用方法 1、模块和库的导入方法 2、第三方模块的下载 下载方法 简介 在Python编程的世界中,函数、模块和库是…...
selinux和防火墙实验
1 、 selinux 的说明 SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 系统资源都是通过程序进行访问的,如…...
k8s Init:ImagePullBackOff 的解决方法
kubectl describe po (pod名字) -n kube-system 可查看pod所在的节点信息 例如: kubectl describe po calico-node-2lcxx -n kube-system 执行拉取前先把用到的节点的源换了 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"re…...
Spring AOP相关知识详解
难 文章目录 1.AOP介绍1.1 面向切面编程 - Aspect Oriented Programming (AOP)1.2 优点 2.AOP的概念2.1 连接点、切入点、通知、切面:2.2 注解2.2.1 通知类型2.2.1.1 通知的优先级排序 2.2.2 其他重要注解2.2.3 示例代码(四种通知) 3.Spring …...
selinux和防火墙
第七章 selinux 一、selinux的说明 SELinux:安全强化的 linux,Security-Enhanced Linux的缩写 SELinux : 由美国国家安全局( NSA )开发,目的是为了避免资源的误用 SELinux: 是对程序、文件等权…...
【vue for beginner】Composition API 和 Options API 的区别
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 vue2中的方式叫Options API ,vue3中叫Composition API。 Composition…...
jmeter5.6.3安装教程
一、官网下载 需要提前配置好jdk的环境变量 jmeter官网:https://jmeter.apache.org/download_jmeter.cgi 选择点击二进制的zip文件 下载成功后,默认解压下一步,更改安装路径就行(我安装在D盘) 实用jmeter的bin目录作为系统变量 然后把这…...
专业网站设计报价/上海网站seo招聘
有源器件与无源器件的区别 简单地讲就是需能(电)源的器件叫有源器件,无需能(电)源的器件就是无源器件。有源器件一般用来信号放大、变换等,无源器件用来进行信号传输,或者通过方向性进行“…...
网站建设品牌推荐/飓风seo刷排名软件
1 返回值显示中文 问题: 显示中文乱码原因: 服务器response的charset没有设置为“UTF-8",默认为”ISO-8859-1",解决 在PrintWriter前加两条设置语句。 response.setHeader("Content-type", "applicati…...
网站防红链接怎么做/自媒体是如何赚钱的
添加小程序,兑换各种视频教程/数据资源。 因为是公司选的框架做实战项目,所有基本是边学边做项目,遇到的一些坑,可能解决方案不完全正确,欢迎指出。 1. wepy创建项目:在安装npm的情况下。 1.1 全局安装wep…...
云南省火电建设公司网站/客户营销
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 一、声明:public class AlarmManager extends Object 二、类结构: java.lang.Object ↳android.app.AlarmManager三、概述࿱…...
百度做网站教程/公众号推广接单平台
我们在之前有文章介绍过LOTO示波器信号源扫频测电源环路增益稳定性的方法和过程,可以参考演示视频如下: https://www.ixigua.com/7135738415382790663?logTaga843d537a27090d5117b 或者阅读对应的文章:《LOTO示波器 实测 开环增益频响曲线/电…...
iss服务器网站建设/中国关键词官网
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 博客项目有个需求。展示博客列表的时候,显示一些博客里的图片&…...