[newstarctf2023] --RE wp

AndroGenshin:

rc4加密表,base64換表:

腳本梭就行

python

username = b"genshinimpact"
base64_table = [125, 239, 101, 151, 77, 163, 163, 110, 58, 230, 186, 206, 84, 84, 189, 193, 30, 63, 104, 178, 130, 211,164, 94, 75, 16, 32, 33, 193, 160, 120, 47, 30, 127, 157, 66, 163, 181, 177, 47, 0, 236, 106, 107, 144,231, 250, 16, 36, 34, 91, 9, 188, 81, 5, 241, 235,3, 54, 150, 40, 119, 202, 150]
def rc4(key, data):S = list(range(256))j = 0out = []for i in range(256):j = (j + S[i] + key[i % len(key)]) % 256S[i], S[j] = S[j], S[i]i = j = 0for t in data:i = (i + 1) % 256j = (j + S[i]) % 256S[i], S[j] = S[j], S[i]out.append(t^ S[(S[i] + S[j]) % 256])return out
import base64
def base64_custom_decode(data, custom_table):original_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"decode_table = str.maketrans(custom_table, original_table)decoded_data = base64.b64decode(data.translate(decode_table))return decoded_data
retval = rc4(username, base64_table)
new_table = "".join([chr(t) for t in retval])
enc_data = "YnwgY2txbE8TRyQecyE1bE8DZWMkMiRgJW1="
print(base64_custom_decode(enc_data, new_table))

SMC:

先來看主函數部分:

c

int __cdecl main(int argc, const char **argv, const char **envp)
{DWORD *v3; // eaxv3 = (DWORD *)malloc(0x26u);VirtualProtect(&sub_403040, 0x26u, 0x40u, v3);puts("Please enter your flag:");sub_401025("%s", data);if ( NtCurrentPeb()->BeingDebugged ){MessageBoxA(0, "Debug Detected!", "Warning!", 0);Sleep(0x1388u);exit(0);}sub_401042();if ( ((int (__cdecl *)(char *, void *))sub_403040)(data, &byte_403020) )puts("Win!");elseputs("Lose!");return system("pause");
}

主函數比較簡潔明了,就是sub_403040這個函數不知道,是由sub_401042這個函數解密而成的,看一下加密函數

c

char sub_401042()
{int i; // ecxchar result; // alfor ( i = 0; i < 38; ++i ){result = byte_403068[i & 3];sub_403040[i] ^= result;}return result;
}

接著動調把解密后的函數搞出來就行

可以直接set ip直接跳到目標函數處,patch掉反調試代碼

解密函數如下:

就是異或再加5,直接梭腳本就行

python

data=[0x7C, 0x82, 0x75, 0x7B, 0x6F, 0x47, 0x61, 0x57, 0x53, 0x25, 
0x47, 0x53, 0x25, 0x84, 0x6A, 0x27, 0x68, 0x27, 0x67, 0x6A, 
0x7D, 0x84, 0x7B, 0x35, 0x35, 0x48, 0x25, 0x7B, 0x7E, 0x6A, 
0x33, 0x71]for i in data:char=(i-5)^0x11print(chr(char),end="")

Petals:

看主函數:

c

__int64 __fastcall main(int a1, char **a2, char **a3)
{unsigned int v4; // [rsp+Ch] [rbp-4h]puts("Here is a pack of flowers, to my best love --- you.");puts("But I must check your identity, please input the right passwd");__isoc99_scanf("%s", byte_4080);v4 = strlen(byte_4080);if ( strlen(byte_4080) != 25 ){puts("Please check your input's format!");exit(-1);}((void (__fastcall *)(char *, _QWORD))loc_1209)(byte_4080, v4);sub_160C(byte_4080, &unk_4020, v4);printf("If you are succeed, the flag is flag{md5(your input)}");return 0LL;
}

邏輯依舊比較清晰,看一下sub_160C函數

c

int __fastcall sub_160C(const void *a1, const void *a2, unsigned int a3)
{if ( !memcmp(a1, a2, a3) )return puts("I love you.");elsereturn puts("I hate you!");
}

數據的判斷語句,要判斷的數據是

data=[ ?0xD0, 0xD0, 0x85, 0x85, 0x80, 0x80, 0xC5, 0x8A, 0x93, 0x89,

? 0x92, 0x8F, 0x87, 0x88, 0x9F, 0x8F, 0xC5, 0x84, 0xD6, 0xD1,

? 0xD2, 0x82, 0xD3, 0xDE, 0x87]

再來看一下上一個函數log_1209:

發現爆紅。初步判斷應該是加了花指令

果然,經典花指令,在call那里按u,然后將剩下的代碼按c轉化為代碼即可

去花函數為

c

unsigned __int64 __fastcall sub_1209(__int64 a1, unsigned int a2)
{int i; // [rsp+18h] [rbp-118h]unsigned int j; // [rsp+1Ch] [rbp-114h]__int64 v5[33]; // [rsp+20h] [rbp-110h] BYREFunsigned __int64 v6; // [rsp+128h] [rbp-8h]v6 = __readfsqword(0x28u);memset(v5, 0, 256);for ( i = 0; i <= 255; ++i )*((_BYTE *)v5 + i) = ~(i ^ a2);for ( j = 0; a2 > j; ++j )*(_BYTE *)((int)j + a1) = *((_BYTE *)v5 + *(unsigned __int8 *)((int)j + a1));return v6 - __readfsqword(0x28u);
}

其實加密過程很直接,第一個for循環生成密碼表,然后再根據字符作為下標就行加密

就是在密碼表中找對應的,然后下標就是加密前的數據。腳本如下:

python

data=[  0xD0, 0xD0, 0x85, 0x85, 0x80, 0x80, 0xC5, 0x8A, 0x93, 0x89, 0x92, 0x8F, 0x87, 0x88, 0x9F, 0x8F, 0xC5, 0x84, 0xD6, 0xD1, 0xD2, 0x82, 0xD3, 0xDE, 0x87]v5=[0]*256for i in range(256):v5[i]=~(i^25)&0xffprint(v5)    
flag=""
for i in range(25):flag+=v5.index(data[i])
print("\n")
import hashlib
md5=hashlib.md5()
md5.update(flag.encode())
result=md5.hexdigest()
print(result)

C?C++?:

c#編寫的程序,dnspy打開即可

找到加密函數部分

c

// ConsoleApp1.Program
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
private static void Main(string[] args)
{int num = 35;int[] array = new int[]{68, 75, 66, 72, 99, 19, 19, 78, 83, 74,91, 86, 35, 39, 77, 85, 44, 89, 47, 92,49, 88, 48, 91, 88, 102, 105, 51, 76, 115,-124, 125, 79, 122, -103};char[] array2 = new char[35];int[] array3 = new int[35];Console.Write("Input your flag: ");string text = Console.ReadLine();for (int i = 0; i < text.Length; i++){array2[i] = text[i];}string text2 = "NEWSTAR";for (int j = 0; j < num; j++){char[] array4 = array2;int num2 = j;array4[num2] += (char)j;char[] array5 = array2;int num3 = j;array5[num3] -= ' ';}for (int k = 0; k < 7; k++){char[] array6 = array2;int num4 = k;array6[num4] += (char)(k ^ (int)(-(int)(text2[k] % '\u0004')));char[] array7 = array2;int num5 = k + 7;array7[num5] += text2[k] % '\u0005';char[] array8 = array2;int num6 = k + 14;array8[num6] += (char)(2 * k);char[] array9 = array2;int num7 = k + 21;array9[num7] += (char)(k ^ 2);char[] array10 = array2;int num8 = k + 28;array10[num8] += text2[k] / '\u0005' + '\n';}for (int l = 0; l < num; l++){int num9 = (int)array2[l];array3[l] = num9;}for (int m = 0; m < 35; m++){bool flag = m == 34 && array3[m] == array[m];if (flag){Console.WriteLine("Right!");}bool flag2 = array3[m] == array[m];if (!flag2){Console.WriteLine("Wrong!");break;}}
}

其實加密過程不復雜,就是加密過程很亂,慢慢分析一下即可

python

v6 = 35
j = 0
v10 = [68,75,66,72,99,19,19,78,83,74,91,86,35,39,77,85,44,89,47,92,49,88,48,91,88,102,105,51,76,115,-124,125,79,122,-103]
a2 = "NEWSTAR"for j in range(7):v10[j + 28] -= (ord(a2[j])//5) + 10v10[j + 21] -= j ^ 2v10[j + 14] -= 2 * jv10[j + 7] -= ord(a2[j]) % 5v10[j] -= j ^ -(ord(a2[j]) % 4)for i in range(v6):v10[i] -= iv10[i] += 32print(chr(v10[i]%256), end='')

R4ndom:

主函數邏輯:

c

int __cdecl main(int argc, const char **argv, const char **envp)
{char v3; // blint v4; // eaxint i; // [rsp+Ch] [rbp-94h]__int64 s2[6]; // [rsp+10h] [rbp-90h] BYREF__int16 v8; // [rsp+40h] [rbp-60h]char data[8]; // [rsp+50h] [rbp-50h] BYREF__int64 v10; // [rsp+58h] [rbp-48h]__int64 v11; // [rsp+60h] [rbp-40h]__int64 v12; // [rsp+68h] [rbp-38h]__int64 v13; // [rsp+70h] [rbp-30h]__int64 v14; // [rsp+78h] [rbp-28h]__int16 v15; // [rsp+80h] [rbp-20h]unsigned __int64 v16; // [rsp+88h] [rbp-18h]v16 = __readfsqword(0x28u);s2[0] = 0x3513AB8AB2D7E6EELL;s2[1] = 0x2EEDBA9CB9C97B02LL;s2[2] = 0x16E4F8C8EEFA4FBDLL;s2[3] = 0x383014F4983B6382LL;s2[4] = 0xEA32360C3D843607LL;s2[5] = 42581LL;v8 = 0;puts("Can You Find the Secret?");puts("Give me your flag");*(_QWORD *)data = 0LL;v10 = 0LL;v11 = 0LL;v12 = 0LL;v13 = 0LL;v14 = 0LL;v15 = 0;__isoc99_scanf("%s", data);if ( strlen(data) != 42 )exit(0);for ( i = 0; i < strlen(data); ++i ){v3 = data[i];v4 = rand();data[i] = Table[(16 * ((unsigned __int8)(v3 + v4 % 255) >> 4) + 15) & (unsigned __int8)(v3 + v4 % 255)];}if ( !memcmp(data, s2, 0x2AuLL) )puts("You get the Right Flag!!");elseputs("Maybe your flag is Wrong o.O?");return 0;
}

直接看最關鍵的代碼邏輯

c

for ( i = 0; i < strlen(data); ++i ){v3 = data[i];v4 = rand();data[i] = Table[(16 * ((unsigned __int8)(v3 + v4 % 255) >> 4) + 15) & (unsigned __int8)(v3 + v4 % 255)];}if ( !memcmp(data, s2, 0x2AuLL) )puts("You get the Right Flag!!");elseputs("Maybe your flag is Wrong o.O?");return 0;
}

這里data和s2進行判斷,s2的數據上面已經給出了,for循環這里還有一個rand(),我們來看一下函數列表有沒有srand函數,發現是有的,我們交叉引用到調用處

發現是這個b函數進行了調用,再來交叉引用一下發現是在init_array處進行調用,也就是在main函數前就已經設置好了隨機數種子

回到主函數這里,可以直接爆破求值就行,注意這是elf文件,需要在linux下編譯運行

c

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>int main() {uint64_t s2[6];s2[0] = 0x3513AB8AB2D7E6EELL;s2[1] = 0x2EEDBA9CB9C97B02LL;s2[2] = 0x16E4F8C8EEFA4FBDLL;s2[3] = 0x383014F4983B6382LL;s2[4] = 0xEA32360C3D843607LL;s2[5] = 42581LL;unsigned char* flag = (unsigned char*)s2;unsigned char table[] ={0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01,0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D,0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4,0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7,0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2,0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E,0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB,0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB,0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C,0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C,0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D,0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A,0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3,0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D,0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A,0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E,0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9,0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9,0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99,0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16};unsigned int flags[42];srand(1400333646);for(int i = 0; i < 42; i++) {int flag_char = flag[i];int random = rand();for(int num = 33; num < 127; num++) {int found = 0;for(int j = 0; j < 256; j++) {if (flag_char == table[(16 * ((unsigned char)(num + random % 255) >> 4) + 15) & (unsigned char)(num + random % 255)]) {flags[i] = num;found = 1;break;}}if (found) {break;}}}puts("\nDecrypted flag:");for(int i = 0; i < 42; i++) {printf("%c", flags[i]);}return 0;
}

easy_enc:

看主函數邏輯

c

__int64 sub_140016070()
{char *v0; // rdi__int64 i; // rcxchar v3[32]; // [rsp+0h] [rbp-20h] BYREFchar v4; // [rsp+20h] [rbp+0h] BYREF__int64 v5[9]; // [rsp+28h] [rbp+8h]char data[132]; // [rsp+70h] [rbp+50h] BYREFint j; // [rsp+F4h] [rbp+D4h]char Buf1[5]; // [rsp+120h] [rbp+100h] BYREFchar v9[127]; // [rsp+125h] [rbp+105h] BYREFint v10; // [rsp+1A4h] [rbp+184h]v0 = &v4;for ( i = 106i64; i; --i ){*(_DWORD *)v0 = -858993460;v0 += 4;}sub_14001135C(&unk_140021018);v5[0] = (__int64)sub_1400113C5;v5[1] = (__int64)sub_1400113CA;v5[2] = (__int64)sub_1400113F2;v5[3] = (__int64)sub_1400113ED;memset(data, 0, 0x64ui64);sub_14001118B("Input Your flag(format:A-Z a-z): ");sub_1400113FC((__int64)&unk_140019C18, (__int64)data);length = j_strlen(data);for ( j = 0; j < 4; ++j )((void (__fastcall *)(char *))v5[j])(data);Buf1[0] = -24;Buf1[1] = 0x80;Buf1[2] = -124;Buf1[3] = 8;Buf1[4] = 24;strcpy(v9, "<xh");v9[4] = 112;v9[5] = 124;v9[6] = -108;v9[7] = -56;v9[8] = -32;v9[9] = 16;v9[10] = -20;v9[11] = -76;v9[12] = -84;v9[13] = 104;v9[14] = -88;v9[15] = 12;v9[16] = 28;v9[17] = -112;v9[18] = -52;v9[19] = 84;v9[20] = 60;v9[21] = 20;v9[22] = -36;v9[23] = 48;memset(&v9[24], 0, 0x47ui64);v10 = 1;if ( !j_memcmp(Buf1, data, length) )sub_14001118B("Right!! flag is flag{your input}\n");elsesub_14001118B("Wrong!!\n");sub_1400112F3(v3, &unk_14001AA10);return 0i64;
}

其實這里的加密是比較清晰的,只是數據比較那里那里有點小問題,這里buf1是包括v9的,所以比較的字符串長度為29

接著看一下四個加密函數即可

c

__int64 __fastcall sub_140015B80(__int64 a1)
{__int64 result; // raxint i; // [rsp+24h] [rbp+4h]sub_14001135C(&unk_140021018);for ( i = 0; ; ++i ){result = (unsigned int)length;if ( i >= length )break;if ( *(unsigned __int8 *)(a1 + i) < (unsigned int)'A' || *(unsigned __int8 *)(a1 + i) > (unsigned int)'Z' ){if ( *(unsigned __int8 *)(a1 + i) < (unsigned int)'0' || *(unsigned __int8 *)(a1 + i) > (unsigned int)'9' ){if ( *(unsigned __int8 *)(a1 + i) >= (unsigned int)'a' && *(unsigned __int8 *)(a1 + i) <= (unsigned int)'z' )*(_BYTE *)(a1 + i) = (*(unsigned __int8 *)(a1 + i) - 89) % 26 + 97;}else{*(_BYTE *)(a1 + i) = (*(unsigned __int8 *)(a1 + i) - 45) % 10 + 48;}}else{*(_BYTE *)(a1 + i) = (*(unsigned __int8 *)(a1 + i) - 52) % 26 + 65;}}return result;
}

c

__int64 __fastcall sub_140015CE0(__int64 a1)
{char *v1; // rdi__int64 i; // rcxchar v4[32]; // [rsp+0h] [rbp-20h] BYREFchar v5; // [rsp+20h] [rbp+0h] BYREFchar Str[44]; // [rsp+28h] [rbp+8h] BYREFint j; // [rsp+54h] [rbp+34h]__int64 v8; // [rsp+128h] [rbp+108h]__int64 v9; // [rsp+130h] [rbp+110h]size_t v10; // [rsp+138h] [rbp+118h]v1 = &v5;for ( i = 28i64; i; --i ){*(_DWORD *)v1 = -858993460;v1 += 4;}sub_14001135C(&unk_140021018);strcpy(Str, "NewStarCTF");memset(&Str[11], 0, 9ui64);for ( j = 0; j < length; ++j ){v8 = j;v9 = j;v10 = j_strlen(Str);*(_BYTE *)(a1 + j) += Str[j % v10];}return sub_1400112F3(v4, &unk_14001A920);
}

c

__int64 __fastcall sub_140012B40(__int64 a1)
{__int64 result; // raxint i; // [rsp+24h] [rbp+4h]sub_14001135C(&unk_140021018);for ( i = 0; ; ++i ){result = (unsigned int)length;if ( i >= length )break;*(_BYTE *)(a1 + i) = ~*(_BYTE *)(a1 + i);}return result;
}

c

__int64 __fastcall sub_140011830(__int64 a1)
{__int64 result; // raxint i; // [rsp+24h] [rbp+4h]sub_14001135C(&unk_140021018);for ( i = 0; ; ++i ){result = (unsigned int)length;if ( i >= length )break;*(_BYTE *)(a1 + i) *= 52;}return result;
}

逆是不可能逆了,直接爆破

c

#include <stdio.h>
#include <string.h>// 第一個加密函數
unsigned char encrypt_first(unsigned char data, int i) {if ( data < (unsigned int)'A' || data > (unsigned int)'Z' ){if ( data < (unsigned int)'0' || data > (unsigned int)'9' ){if ( data >= (unsigned int)'a' && data <= (unsigned int)'z' )data = (data - 89) % 26 + 97;}else{data = (data - 45) % 10 + 48;}}else{data = (data - 52) % 26 + 65;}

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

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

相關文章

發布 rust 源碼包 (crates.io)

rust 編程語言的包 (或者 庫, library) 叫做 crate, 也就是軟件中的一個組件. 一個完整的軟件通常由多個 crate 組成, rust 編譯器 (rustc) 一次編譯一整個 crate, 不同的 crate 可以同時并行編譯. rust 官方有一個集中發布開源包的網站 crates.io. 發布在這上面的 crate 可以…

uniapp微信公眾號H5分享

如果項目文件node_modules中沒有weixin-js-sdk文件&#xff0c;則直接使用本文章提供的&#xff1b; 如果不生效&#xff0c;則在template.h5.html中引入 <script src"https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> 首先引入weixin-js-…

vue3框架組件自動導入unplugin-vue-components

1.安裝 npm i unplugin-vue-components -save-dev 2.配置 我這里用的是Vue CLI&#xff0c;所以要在vue.config.js文件中添加配置&#xff0c;官網中有寫不同打包工具的配置寫法 框架我使用的是Element Plus&#xff0c;使用前去官網查看自己的框架是否支持&#xff0c;主流…

LLM之RAG實戰(二十七)| 如何評估RAG系統

有沒有想過今天的一些應用程序是如何看起來幾乎神奇地智能的&#xff1f;這種魔力很大一部分來自于一種叫做RAG和LLM的東西。把RAG&#xff08;Retrieval Augmented Generation&#xff09;想象成人工智能世界里聰明的書呆子&#xff0c;它會挖掘大量信息&#xff0c;準確地找到…

電腦黑屏什么都不顯示怎么辦 電腦開機黑屏不顯示任何東西的4種解決辦法

相信有很多網友都有經歷電腦開機黑屏不顯示任何東西&#xff0c;找了很多方法都沒處理好&#xff0c;其實關于這個的問題&#xff0c;首先還是要了解清楚開機黑屏的原因&#xff0c;才能夠對癥下藥&#xff0c;下面大家可以跟小編一起來看看怎么解決吧 電腦開機黑屏不顯示任何…

【無刷電機學習】基礎概念及原理介紹(持續更新中...)

目錄&#xff08;2024.02.22版&#xff09; 1 定義 2 各種電機優勢比較 2.1 有刷與無刷比較 2.2 交流與直流比較 2.3 內轉子與外轉子比較 2.4 低壓BLDC的一些優點 3 基本原理 3.1 單相無刷電機 3.2 三相無刷電機 4 驅動方法 4.1 六步換相控制 4.1.1 基本原理 4…

突發!AI獨角獸「竹間智能」被曝停工停產6個月

大家好我是二狗。 今天早上起來刷朋友圈&#xff0c;看到一張截圖——AI創企竹間智能&#xff0c;宣稱因為公司所處的經營環境艱難&#xff0c;部分部門和崗位將從即日起停工停產6個月。 圖源&#xff1a;&#xff08;企服科學&#xff09; 下面是文字版&#xff1a; 由于公司…

Web服務器基礎介紹

目錄 Web服務器基礎介紹 一、HTML是什么&#xff1f; 二、靜態網頁和動態網頁 1、靜態網頁 2、動態網頁 3、動態網頁語言 PHP JSP Python Ruby 三、HTTP協議 1、HTTP協議是什么&#xff1f; 2、HTTP請求訪問的方法 3、GET與POST比較 GET&#xff1a; POST&…

Linux網絡編程(三-UDP協議)

目錄 一、UDP概述 二、UDP的首部格式 三、UDP緩沖區 四、基于UDP的應用層協議 五、常見問題 一、UDP概述 UDP(User Datagram Protocol&#xff0c;用戶數據協議報)是傳輸層協議&#xff0c;提供不可靠服務&#xff0c;其特點包括&#xff1a; 無連接&#xff1a;知道對端…

CSP-202309-3-梯度求解

CSP-202309-3-梯度求解 作為一個算法小白&#xff0c;本人第一次接觸大模擬的題&#xff0c;本題的算法參考自&#xff1a;【CSP】202309-3 梯度求解 解題思路 1.輸入處理 getchar();&#xff1a;從標準輸入讀取一個字符。這里它的作用可能是用來“吃掉”&#xff08;消耗&a…

Kafka_04_Topic和日志

Kafka_04_Topic和日志 Topic/PartitionTopicPartition 日志存儲存儲格式日志清理刪除壓縮 Topic/Partition Topic/Partition: Kafka中消息管理的基礎單位 Topic和Partition并不實際存在(僅邏輯上的概念) 如: Topic和Partition關系 // 每個日志文件可對應多個日志分段, 其還可…

緩存篇—緩存擊穿

在很多場景下&#xff0c;我們的業務通常會有幾個數據會被頻繁地訪問&#xff0c;比如秒殺活動&#xff0c;這類被頻地訪問的數據被稱為熱點數據。 如果緩存中的某個熱點數據過期了&#xff0c;此時大量的請求訪問了該熱點數據&#xff0c;就無法從緩存中讀取&#xff0c;直接…

《UE5_C++多人TPS完整教程》學習筆記22 ——《P23 記錄加入的玩家(Couting Incoming Players)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P23 記錄加入的玩家&#xff08;Couting Incoming Players&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為 Udemy 課程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻譯版&#xff0c;UP主&#xff…

前端面試問題(jwt/布局/vue數組下標/扁平化/菜單樹形/url api/新版本)

前端面試問題(jwt/布局/vue數組下標/扁平化/菜單樹形/url api/新版本) 1. jwt鑒權邏輯 前端 JWT 鑒權邏輯通常涉及在發起請求時攜帶 JWT&#xff0c;并在接收到響應后處理可能的授權問題。 1. 用戶登錄&#xff1a; 用戶提供憑證&#xff1a; 用戶在登錄界面輸入用戶名和密碼…

如何使用Docker部署MongoDB并結合內網穿透實現遠程訪問本地數據庫

文章目錄 前言1. 安裝Docker2. 使用Docker拉取MongoDB鏡像3. 創建并啟動MongoDB容器4. 本地連接測試5. 公網遠程訪問本地MongoDB容器5.1 內網穿透工具安裝5.2 創建遠程連接公網地址5.3 使用固定TCP地址遠程訪問 正文開始前給大家推薦個網站&#xff0c;前些天發現了一個巨牛的 …

2024最佳住宅代理IP服務商有哪些?

跨境出海已成為了近幾年的最熱趨勢&#xff0c;大批量的企業開始開拓海外市場&#xff0c;而海外電商領域則是最受歡迎的切入口。新興的tiktok、Temu&#xff0c;老牌的Amazon、Ebay&#xff0c;熱門的Etsy、Mecari等等都是藍海一片。跨境入門并不難&#xff0c;前期的準備中不…

深入理解文件查看命令:cat、more、less、tail、head

在Linux系統中&#xff0c;有許多命令用于查看文件的內容&#xff0c;其中包括cat、more、less、tail和head。這些命令提供了不同的方式來瀏覽文本文件&#xff0c;適用于各種查看需求。在本篇博客中&#xff0c;我們將深入介紹這些命令&#xff0c;并通過示例演示它們的用法。…

Spring Boot打war包部署到Tomcat,訪問頁面404 !!!

水善利萬物而不爭&#xff0c;處眾人之所惡&#xff0c;故幾于道&#x1f4a6; 文章目錄 Spring Boot打war包部署到Tomcat&#xff0c;訪問頁面404 &#xff01;&#xff01;&#xff01;解決辦法&#xff1a;檢查Tomcat版本和Jdk的對應關系&#xff0c;我的Tomcat是6.x&#x…

Sping基礎篇----掌握Sping的控制反轉/依賴注入的概念【實戰案例總結】

作為一名對技術充滿熱情的學習者&#xff0c;我一直以來都深刻地體會到知識的廣度和深度。在這個不斷演變的數字時代&#xff0c;我遠非專家&#xff0c;而是一位不斷追求進步的旅行者。通過這篇博客&#xff0c;我想分享我在某個領域的學習經驗&#xff0c;與大家共同探討、共…

SMMU介紹

SMMU&#xff08;System Memory Management Unit&#xff09;是一種硬件設備&#xff0c;其作用是在虛擬地址空間和物理地址空間之間提供地址轉換的功能。它通常用于處理虛擬化環境中的 I/O 設備&#xff0c;例如虛擬機中的設備訪問或者容器環境中的設備隔離。 SMMU 的主要作用…