当前位置: 首页 > news >正文

CISCN2024 初赛 wp 部分复现(Re)

Misc
1. 火锅链观光打卡

答题即可

Re
1. asm_re

感谢智谱清言,可以读出大致加密算法

这是输入

这是加密部分

这里判断

找到疑似密文的部分,手动改一下端序

#asm_wp
def dec(char):return (((char - 0x1E) ^ 0x4D) - 0x14) // 0x50 #return (ord(char) * 0x50 + 0x14) ^ 0x4D + 0x1Eenc = [0x1fd7,0x21b7,0x1e47,0x2027,0x26e7,0x10d7,0x1127,0x2007,0x11c7,0x1e47,0x1017,0x1017,0x11f7,0x2007,0x1037,0x1107,0x1f17,0x10d7,0x1017,0x1017,0x1f67,0x1017,0x11c7,0x11c7,0x1017,0x1fd7,0x1f17,0x1107,0xf47,0x1127,0x1037,0x1e47,0x1037,0x1fd7,0x1107,0x1fd7,0x1107,0x2787]
flag = ''for char in enc:flag += chr(dec(char))print(flag)
#flag{67e9a228e45b622c2992fb5174a4f5f5}
2. android_re

jadx看一下,有个长度限制和加密inspect

按钮验证flag

加密是DES,需要key和iv

但是应该藏在so文件里了

IDA反汇编逻辑看不懂,动调取key和iv比较好。但这个题很伞兵ida跑不起来

可以先考虑objection hook,unitdbg也可以

法一:Objection

成功率比较玄学,有的版本就不行,我用nexus5x真机也是会崩溃,这里是雷电9.0模拟的OPPO 9

注意flag格式再触发

key:A8UdWaeq,iv:Wf3DLups

法二:unidbg

首先是unidbg的环境配置,这个特别麻烦,建议使用r0env集成环境一劳永逸

https://pan.baidu.com/share/init?surl=y6ceiOzWuv0Gl5FNksgciQ 提取码:v8at

在终端输入unidbg会自动打开unidbg的项目界面

/root/Documents/unidbg/unidbg-android/src/test/java/com/路径下构建我们的项目文件夹

package com.ciscn;import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
// 导入通用且标准的类库
import com.github.unidbg.linux.android.dvm.AbstractJni;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.VM;import java.io.*;public class ciscna extends AbstractJni {private final AndroidEmulator emulator; //android 模拟器 aprivate final VM vm;//vm 虚拟机private final Module module;private final Memory memory;private final DalvikModule dm;//将该类封装起来,以后直接套用模板public ciscna(String apkFilePath, String soFilePath, String apkProcessname) throws IOException {// 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验emulator = AndroidEmulatorBuilder.for64Bit().setProcessName(apkProcessname).build();memory = emulator.getMemory();memory.setLibraryResolver(new AndroidResolver(23));vm = emulator.createDalvikVM(new File(apkFilePath));vm.setVerbose(false); // 打印日志,会在调用初始化 JNI_unload 打印一些信息,默认:false// 加载目标 SOdm = vm.loadLibrary(new File(soFilePath), true); // 加载 so 到虚拟内存,第二个参数:是否需要初始化//获取本 SO 模块的句柄module = dm.getModule();vm.setJni(this); //设置 Jni,防止报错//创建完后,需要调用 JNI_onload 函数dm.callJNI_OnLoad(emulator); // 调用 JNI OnLoad,进行动态注册某些函数。如果都是静态注册,那就不用调用这个函数vm.setVerbose(true);// Debugger debugger = emulator.attach();// debugger.addBreakPoint(module.base + 0x1924C);// debugger.addBreakPoint(module.base + 0x19240);}public ciscna(AndroidEmulator emulator, VM vm, Module module, Memory memory, DalvikModule dm) {this.emulator = emulator;this.vm = vm;this.module = module;this.memory = memory;this.dm = dm;}public String func_getKey() {DvmClass dvmClass = vm.resolveClass("com.example.re11113.jni");DvmObject<?> object = dvmClass.newObject(null);DvmObject<?> object1 = object.callJniMethodObject(emulator, "getkey()Ljava/lang/String;");return object1.getValue().toString();}public String func_getiv() {DvmClass dvmClass = vm.resolveClass("com.example.re11113.jni");DvmObject<?> object = dvmClass.newObject(null);DvmObject<?> object1 = object.callJniMethodObject(emulator, "getiv()Ljava/lang/String;");return object1.getValue().toString();}//创建一个 main 函数public static void main(String[] args) throws IOException {// 1、需要调用的 so 文件所在路径String soFilePath = "/root/Documents/unidbg/unidbg-android/src/test/java/com/ciscn/libSecret_entrance.so";// 2、APK 的路径String apkFilePath = "/root/Documents/unidbg/unidbg-android/src/test/java/com/ciscn/app-debug.apk";// 3、apk 进程名String apkProcessname = "com.tencent.testvuln";ciscna myapp = new ciscna(apkFilePath, soFilePath, apkProcessname);System.out.println("getKeyresult:" + myapp.func_getKey());System.out.println("getivresult:" + myapp.func_getiv());}
}

看起来很复杂,不过大部分内容是模版改一改参数

key、iv也都可以得到

法三:雷电APP分析frida脚本一把梭(需要真机)

3. rust_baby

字符串可以定位到一段类似主逻辑的函数处

动调可以找到输入和判断等特殊位置

法一:双字节爆破


var number = 0function main()
{var base =  Module.findBaseAddress("./rust_baby.exe")if(base){Interceptor.attach(base.add(0x3EA8), {//序号加1的位置onEnter: function(args) {// console.log("成功!");number+=1;send(number);// 延迟 10 秒钟var delay = 0x4;// console.log("Program is ending, delaying for " + (delay / 1000) + " seconds...");var start = new Date().getTime();while (new Date().getTime() < start + delay);// console.log("Delay complete.");}});}
}
setImmediate(main);
#rust_exp
import subprocess
import fridafilename = "rust_baby.exe"
cmd = ["D:/下载/CTF附件/ciscn2024 初赛/rust_baby.exe"]
jscode = open("D:/fridafile/rust_hook.js", "rb").read().decode()class SUCCESSFLAG(Exception):"""这是一个自定义异常类"""passdef brute(F):  #程序插桩知道checkflag位置被运行了多少次def on_message(message, data): #定义了一个名为 on_message 的内部函数,用于处理从 Frida 脚本返回的消息global result  #声明了一个全局变量 result,用于存储 Frida 脚本返回的结果if message['type'] == 'send':result = message['payload']else:print(message)process = subprocess.Popen(cmd, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)#使用 subprocess 模块启动了一个外部进程session = frida.attach(filename) #通过 Frida 模块的 attach 方法附加到目标进程script = session.create_script(jscode) #在目标进程中创建了一个 Frida 脚本,脚本内容由 jscode 变量指定script.on('message', on_message) #置了一个事件监听器,当 Frida 脚本发送消息时,会调用 on_message 函数进行处理script.load() #加载了 Frida 脚本process.stdin.write(F.decode()) #将待破解的字符串写入了外部进程的标准输入output, error = process.communicate()if "correct flag" in output:print("正确的flag是:",F.decode())raise SUCCESSFLAG("抛出flag成功的异常!!!")process.terminate() #终止外部进程的执行return resultdef bp(startflag,old_number1,tag1): #回溯函数global temptagglobal maxnumberidx = 0temp = old_number1targetidx = -1table = "-0123456789abcdefghijklmnopqrstuvwxyz}"for ch in table:startflag.append(ord(ch))startflag.append(10) #将当前字符的 ASCII 码和换行符添加到 startflag 中,用于构建待破解的字符串my_bytearray = bytearray(startflag)new_number = brute(my_bytearray) #调用 brute 函数,获取当前字符串的破解次数# print(ch,new_number,ord(ch))# print(my_bytearray.decode())if(new_number>old_number1 ): #如果当前字符串的破解次数大于旧的破解次数:if tag1 == 0 : #如果 tag1 为 0,说明是第一次发现更高破解次数的字符串,则更新 old_number1 和 targetidxold_number1 = new_numbertargetidx = idxif(tag1 > 0): #如果 tag1 大于 0,说明已经回溯过一次,需要继续回溯,此时减少 tag1。tag1 -= 1# if(new_number == old_number1):#     print(ch)idx += 1startflag = startflag[:-2] #更新 idx 并删除 startflag 中添加的字符和换行符。# print(targetidx)if(targetidx == -1):  #如果 targetidx 仍然为 -1,则表示在两个字节爆破时出现错误,需要进行回溯print("错误的:")my_bytearray = bytearray(startflag)print(my_bytearray.decode())print("去除错误字符!")startflag = startflag[:-1]print("magic:",temp-1)temptag = temptag + 1print("magictag:",temptag+1)return startflag,temp-1,temptagbpret = table[targetidx:targetidx+1]print("目标数据:",bpret,ord(bpret))startflag.append(ord(bpret)) #如果 targetidx 不为 -1,则说明找到了下一个正确的字符,添加到 startflag 中my_bytearray = bytearray(startflag)print(my_bytearray.decode())return startflag,old_number1,0#1.一开始爆破的固定5个字符
startflag1 = [102, 108, 97, 103, 123] #flag的格式是固定的所以是,flag{
#2.爆破到一半突然开始回溯,非常不理解直接手动添加前爆破出来的flag数据,大概是因为程序插桩的问题,js和python通信有误差还得手动添加数组
#手动添加刚刚爆破出来的flag:"flag{6e2480b3-4f02-4cf",[102, 108, 97, 103, 123, 54, 101, 50, 52, 56, 48, 98, 51, 45, 52, 102, 48, 50, 45, 52, 99, 102]
startflag = [102, 108, 97, 103, 123, 54, 101, 50, 52, 56, 48, 98, 51, 45, 52, 102, 48, 50, 45, 52, 99, 102]
startflag.append(10)
my_bytearray = bytearray(startflag)old_number = brute(my_bytearray) #获取初始的爆破次数 old_number
# print(old_number)
startflag = startflag[:-1] #去除一个回车
temptag = 0
tag = 0
idx = 0 
temp = len(startflag) #计算一下初始长度cleartag = 5
while True:startflag,old_number,tag = bp(startflag,old_number,tag) #计算爆破if(temp < len(startflag)): #如果爆破出来的字节数增加,更新temptemp = len(startflag)print("----->",temp-5)if((temp-cleartag)%3 == 0):  #两个两个的字节爆破!!print("》》》》清理temptag")temptag = 0cleartag += 2
来自CISCN2024-re3-rust_baby(Frida多字节程序插桩爆破)_ciscn2024初赛 rust-CSDN博客的脚本
法二:硬逆

https://player.bilibili.com/player.html?bvid=BV1Zr421j7pr&autoplay=0

讲的蛮好的,就是挺麻烦,基本功要求高

4. whereThel1b

可以看到引用了whereThel1b动态链接库进行加密

Cpython打包的so文件没有什么反编译方法,只能IDA硬看

代码一坨看不懂

翻字符串能找到一个base64

密文长度是56,base64是3->4,转回来flag是42个字符(猜测)

法一:爆破

那就可以三字节爆破

参考自https://blog.csdn.net/wcj126/article/details/139065037

import string
import whereThel1b
# 初始化flag模板
flag_template = 'flag{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}'
flag_bytes = flag_template.encode()# 给定的加密向量
encryption_vector = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95,84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103,95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17,80, 102, 101, 75, 93, 68, 121, 26
]# 初始化匹配起始位置和步长
start_pos = 0
step = 3
match_start = 0# 解码循环
for i in range(start_pos, 41, step):temp_flag = flag_bytes  # 保存当前flag副本用于尝试修改found_match = False  # 添加标志位判断本轮是否找到匹配for x in string.printable:for y in string.printable:for z in string.printable:temp_flag = temp_flag[:i] + bytes([ord(x), ord(y), ord(z)]) + temp_flag[i + 3:]whereThel1b.whereistheflag(temp_flag)temp_result = whereThel1b.trytry(temp_flag)match = all(encryption_vector[j] == (temp_result[j]) for j in range(match_start, match_start + 4))if match:flag_bytes = temp_flag  # 更新flag字节found_match = True  # 设置找到匹配标志break  # 匹配成功,跳出yz循环if found_match:break  # 如果匹配成功,也跳出x循环if found_match:break  # 直接进行下一轮,无需执行else部分print(flag_bytes.decode())match_start += 4  # 更新匹配起始索引# 输出最终解码的flag
print(flag_bytes.decode())

中间加密部分照抄就行

法二:硬逆
import whereThel1b
flag = input("where is my flag:")
flag = flag.encode()
print("input: ",flag)
encry = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95, 84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103, 95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17, 80, 102, 101, 75, 93, 68, 121, 26]ret0 = whereThel1b.whereistheflag(flag)
print("whereistheflag ret: ",ret0)
print("after whereistheflag: ",flag)ret = whereThel1b.trytry(flag)print("ret: ",ret)
for i in ret:print(chr(i),end='')
print("\n")
print("encry: ", encry)
for i in encry:print(chr(i),end='')
print("\n")if ret == encry:print("rrrrrrrrrrrright")
else:print("wwwwwwwwwwwwwwwrong")

直接hook一下返回值

会发现whereThel1b.whereistheflag(flag)返回了一堆随机数,对flag似乎没有影响

最后的encry应该是flag加密后的base64

字符串收集信息,可以猜测是利用seed生成randint、random之类的随机数进行了处理

借助GPT对几个关键函数进行分析,忽略一些异常处理,看一下主要的逻辑

def trytry(*args, **kwargs):# Attempt to access 'random.seed' from the builtins or module globalstry:import randomseed = random.seedexcept AttributeError:raise ImportError("Cannot import 'random.seed'")# Call the seed methodtry:seed(0)except Exception as e:raise RuntimeError(f"Error calling 'random.seed': {str(e)}")# Attempt to access 'whereistheflag1' from the builtins or module globalstry:whereistheflag1 = globals().get('whereistheflag1', __builtins__.get('whereistheflag1'))except AttributeError:raise ImportError("Cannot import 'whereistheflag1'")# Call the whereistheflag1 method with platry:result = whereistheflag1(pla)except Exception as e:raise RuntimeError(f"Error calling 'whereistheflag1': {str(e)}")return result

看到trytry函数调用了whereistheflag1函数,设置了随机数种子0

import base64
import randomdef whereistheflag1(pla):# Encode input using base64encoded = base64.b64encode(pla.encode())# Convert encoded bytes to list of integersencoded_list = list(encoded)# Create an empty list to store resultsresult_list = []# Iterate over the encoded listfor i in range(len(encoded_list)):# Generate a random integer in the range [0, length of the list]rand_int = random.randint(0, len(encoded_list))# Fetch an item from the list based on the current indexitem = encoded_list[i]# Perform XOR operationxor_result = item ^ rand_int# Append the result to the result listresult_list.append(xor_result)# Return the result listreturn result_list

输入的内容base64编码之后,与通过randint生成的随机数异或

参考https://blog.csdn.net/qq_65474192/article/details/139089468?spm=1001.2014.3001.5502

import random
import base64encry = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95, 84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103, 95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17, 80, 102, 101, 75, 93, 68, 121, 26]
key = []
random.seed(0)
for ch in range(len(encry)):key.append(random.randint(0, len(encry)))
flag = []
for i in range(len(encry)):flag.append(key[i] ^ encry[i])# 将 flag 转换为字符列表并连接成字符串
flag_str = ''.join(map(chr, flag))# 将生成的字符串编码为字节
flag_bytes = flag_str.encode()# 使用 Base64 解码字节并打印
decoded = base64.b64decode(flag_bytes)
print(decoded)
#b'flag{7f9a2d3c-07de-11ef-be5e-cf1e88674c0b}'

相关文章:

CISCN2024 初赛 wp 部分复现(Re)

Misc 1. 火锅链观光打卡 答题即可 Re 1. asm_re 感谢智谱清言&#xff0c;可以读出大致加密算法 这是输入 这是加密部分 这里判断 找到疑似密文的部分&#xff0c;手动改一下端序 #asm_wp def dec(char):return (((char - 0x1E) ^ 0x4D) - 0x14) // 0x50 #return (ord(cha…...

YOLOv10、YOLOv9 和 YOLOv8 在实际视频中的对比

引言 目标检测技术是计算机视觉领域的核心任务之一&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列模型凭借其高效的检测速度和准确率成为了业界的宠儿。本文将详细对比YOLOv10、YOLOv9和YOLOv8在实际视频中的表现&#xff0c;探讨它们在性能、速度和实际应用…...

热题系列章节5

169. 多数元素 给定一个大小为 n 的数组&#xff0c;找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出:…...

ArcGIS for js 4.x 加载图层

二维&#xff1a; 1、创建vue项目 npm create vitelatest 2、安装ArcGIS JS API依赖包 npm install arcgis/core 3、引入ArcGIS API for JavaScript模块 <script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from arcgis…...

Three.js和Babylon.js,webGL中的对比效果分析!

hello&#xff0c;今天分享一些three.js和babylon.js常识&#xff0c;为大家选择three.js还是babylon.js做个分析&#xff0c;欢迎点赞评论转发。 一、Babylon.js是什么 Babylon.js是一个基于WebGL技术的开源3D游戏引擎和渲染引擎。它提供了一套简单易用的API&#xff0c;使开发…...

flask实现抽奖程序(一)

后端代码E:\LearningProject\lottery\app.py from flask import Flask, render_template import randomapp Flask(__name__)employees [赵一, 钱二, 孙三, 李四, 周五, 吴六, 郑七, 王八]app.route(/) def hello_world():return render_template(index.html, employeesemplo…...

Python中数据库连接的管理

在现代应用程序中&#xff0c;数据库是一个至关重要的组件。无论是小型应用还是大型分布式系统&#xff0c;良好的数据库连接管理都是确保系统高效、可靠运行的关键。本文将详细介绍在Python中管理数据库连接的最佳实践和技术&#xff0c;包括连接池、ORM&#xff08;对象关系映…...

【JAVA技术】mybatis 数据库敏感字段加解密方案

引言&#xff1a;自从有公司项目前2年做了三级等保&#xff0c;每年一度例行公事&#xff0c;昨天继续配合做等保测试。这2天比较忙&#xff0c;这里整理之前写的一篇等保技术文章。 正文&#xff1a; 现在公司项目基本用mybatis实现&#xff0c;但由于项目跨度年份比较久&…...

Collections工具类及其案例

package exercise;public class Demo1 {public static void main(String[] args) {//可变参数//方法形参的个数是可以发生变化的//格式&#xff1a;属性类型...名字//int...argsint sum getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);System.out.println(sum);}//底层&#xff1a;可…...

Duck Bro的第512天创作纪念日

Tips&#xff1a;发布的文章将会展示至 里程碑专区 &#xff0c;也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作&#xff1f;2. 创作这些文章是为了赚钱吗&#xff1f…...

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…...

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册 晨控CK-UR12-E01 是天线一体式超高频读写器头&#xff0c;工作频率默认为902MHz&#xff5e;928MHz&#xff0c;符合EPC Global Class l Gen 2&#xff0f;IS0-18000-6C 标准&#xff0c;最大输出功率 33dBm。读卡器同时…...

模板显式、隐式实例化和(偏)特化、具体化的详细分析

最近看了<The C Programing Language>看到了模板的特化&#xff0c;突然想起来<C Primer>上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀&#xff0c;我在网上了找了好多帖子&#xff0c;才把概念给理清楚。 看着这么多叫法&#xff0c;其…...

软件设计师笔记-计算机系统基础知识

CPU的功能 CPU(中央处理器)是计算机的核心部件,负责执行计算机的指令和处理数据。它的功能主要可以分为程序控制、操作控制、时间控制和数据处理四个方面: 程序控制:CPU的首要任务是执行存储在内存中的程序。程序控制功能确保CPU能够按照程序的指令序列,一条一条地执行。…...

flink 作业动态维护更新,不重启flink,不提交作业

Flink任务实时获取并更新规则_flink任务流实时变更-CSDN博客 一种动态更新flink任务配置的方法_flink 数据源 动态更新-CSDN博客 Flink CEP在实时风控场景的落地与优化 最佳实践 - 在SQL任务中使用Flink CEP - 《实时计算用户手册-v4.5.0》 Flink SQL CEP详解-CSDN博客 如…...

为何数据仓库需要“分层次”?

在数据驱动的商业世界中&#xff0c;数据仓库是企业决策的心脏。然而&#xff0c;一个高效、可扩展且易于管理的数据仓库&#xff0c;需要精心设计和构建。分层是构建数据仓库的关键策略之一。本文将探讨数据仓库分层的重要性以及它如何帮助企业更好地管理数据。 数据仓库分层…...

小熊家务帮day15-day18 预约下单模块(预约下单,熔断降级,支付功能,退款功能)

目录 1 预约下单1.1 需求分析1.1.1 业务流程1.1.2 订单状态 1.2 系统设计1.2.1 订单表设计1.2.2 表结构的设置 1.3 开发远程调用接口1.3.0 复习下远程调用的开发1.3.1 查询地址簿远程接口jzo2o-api工程定义接口Customer服务实现接口 1.3.2 查询服务&服务项远程接口jzo2o-ap…...

[word] word悬挂缩进怎么设置? #经验分享#职场发展#经验分享

word悬挂缩进怎么设置&#xff1f; 在编辑Word的时候上方会有个Word标尺&#xff0c;相信很多伙伴都没使用过。其实它隐藏着很多好用的功能&#xff0c;今天就给大家分享下利用这个word标尺的悬挂缩进怎么设置&#xff0c;一起来看看吧&#xff01; 1、悬挂缩进 选中全文&…...

6-Maven的使用

6-Maven的使用 常用maven命令 //常用maven命令 mvn -v //查看版本 mvn archetype:create //创建 Maven 项目 mvn compile //编译源代码 mvn test-compile //编译测试代码 mvn test //运行应用程序中的单元测试 mvn site //生成项目相关信息的网站 mvn package //依据项目生成 …...

WPF真入门教程32--WPF数字大屏项目实干

1、项目背景 WPF (Windows Presentation Foundation) 是微软的一个框架&#xff0c;用于构建桌面客户端应用程序&#xff0c;它支持富互联网应用程序&#xff08;RIA&#xff09;的开发。在数字大屏应用中&#xff0c;WPF可以用来构建复杂的用户界面&#xff0c;展示庞大的数据…...

数据可视化Python实现超详解【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...

Maxkb玩转大语言模型

Maxkb玩转大语言模型 随着国外大语言模型llama3的发布&#xff0c;搭建本地个人免费“人工智能”变得越来越简单&#xff0c;今天博主分享使用Max搭建本地的个人聊天式对话及个人本地知识域的搭建。 1.安装Maxkb开源应用 github docker快速安装 docker run -d --namemaxkb -p 8…...

React Hooks 封装可粘贴图片的输入框组件(wangeditor)

需求是需要一个文本框 但是可以支持右键或者ctrlv粘贴图片&#xff0c;原生js很麻烦&#xff0c;那不如用插件来实现吧~我这里用的wangeditor插件&#xff0c;初次写初次用&#xff0c;可能不太好&#xff0c;但目前是可以达到实现需求的一个效果啦&#xff01;后面再改进吧~ …...

Wireshark TS | 应用传输丢包问题

问题背景 仍然是来自于朋友分享的一个案例&#xff0c;实际案例不难&#xff0c;原因也就是互联网线路丢包产生的重传问题。但从一开始只看到数据包截图的判断结果&#xff0c;和最后拿到实际数据包的分析结果&#xff0c;却不是一个结论&#xff0c;方向有点跑偏&#xff0c;…...

架构设计-web项目中跨域问题涉及到的后端和前端配置

WEB软件项目中经常会遇到跨域问题&#xff0c;解决方案早已是业内的共识&#xff0c;简要记录主流的处理方式&#xff1a; 跨域感知session需要解决两个问题&#xff1a; 1. 跨域问题 2. 跨域cookie传输问题 跨域问题 解决跨域问题有很多种方式&#xff0c;如使用springboot…...

==Redis淘汰策略(内存满了触发)==

好的&#xff0c;面试官。这个问题我需要从三个方面来回答。第一个方面&#xff1a; 当 Redis 使用的内存达到 maxmemory 参数配置的阈值的时候&#xff0c;Redis 就会根据配置的内存淘汰策略。 把访问频率不高的 key 从内存中移除。maxmemory 默认情况是当前服务器的最大内存…...

2024年高考作文考人工智能,人工智能写作文能否得高分

前言 众所周知&#xff0c;今年全国一卷考的是人工智能&#xff0c;那么&#xff0c;我们来测试一下&#xff0c;国内几家厉害的人工智能他们的作答情况&#xff0c;以及能取得多少高分呢。由于篇幅有限&#xff0c;我这里只测试一个高考真题&#xff0c;我们这里用百度的文心…...

Vue3学习记录第三天

Vue3学习记录第三天 背景说明学习记录Vue3中shallowReactive()和shallowRef()Vue3中toRaw()和markRaw()前端...语法Vue3中readonly()和shallowReadonly()函数前端的防抖 背景 之前把Vue2的基础学了, 这个课程的后面有简单介绍Vue3的部分. 学习知识容易忘, 这里仅简答做一个记录…...

数仓建模中的一些问题

​​​在数仓建设的过程中&#xff0c;由于未能完全按照规范操作&#xff0c; 从而导致数据仓库建设比较混乱&#xff0c;常见有以下问题&#xff1a; 数仓常见问题 ● 数仓分层不清晰&#xff1a;数仓的分层没有明确的逻辑&#xff0c;难以管理和维护。 ● 数据域划分不明确…...

spring整合kafka

原文链接&#xff1a;spring整合kafka_spring集成kafka-CSDN博客 1、导入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.10.RELEASE</version> </depende…...

网络舆情工作方案/朝阳网站seo

一个简单的Java main函数签名如下&#xff1a; public static void main(String[] args) {System.out.println(args.length);for (int i 0; i < args.length; i) {System.out.println(args[i]);} } 一、使用应用程序参数&#xff1a; 1、在IDE中使用 结果如下&#xff1a…...

手机上怎么做微电影网站/磁力蜘蛛搜索引擎

1. virtualization 纠错 英 [ˈvɜːtʃʊəˌlaɪzeiʃən] 美 n. [计] 虚拟化 2. leave the implementation details out 给出 3. euclidean 纠错 英 [ju:klidiən] 美 adj. 欧几里德的&#xff1b;欧几里德几何学的 4. holistic 纠错 英 [həʊlɪstɪk; hɒ-] 美 [holɪ…...

九天智能建站软件/世界十大网站排名出炉

Andorid在M之后 将原有权限系统进行了重新的设计 &#xff0c;将权限分为两大块分别是NormalPermission 和Dangerous Permission 。不管是哪种权限都和M之前的系统一样 只要使用就需要在清单文件中进行注册 &#xff0c;但是对于Dangerous Permission 这样做还远远不够 &#x…...

网站定位授权开启权限怎么做/网络广告营销

1. Dubbo是什么&#xff1f; 只是一个框架 Hibernate是持久层框架&#xff0c;SpringMVC是MVC的框架&#xff0c;而Dubbo是分布式服务框架。 是框架而不是服务 所以不是像Tomcat或Memcached可以单独启动&#xff0c;它必须依附于应用才有意义。引入dubbo.jar的应用&#xff0c;…...

烟台网站推广效果好/百度平台投诉人工电话

文档下载地址&#xff1a;Django_2.0_中文教程 http://download.csdn.net/detail/julius_lee/6620099 在线地址&#xff1a;http://djangobook.py3k.cn/2.0/ Django 2.0 Book 关键内容记录&#xff0c;主要是为了帮助记忆和理清整个框架&#xff0c;同时以后忘了可以查看&a…...

医院网站建设的规划方案/中国国际新闻

链接&#xff1a;https://www.zhihu.com/question/36735960/answer/68902926来源&#xff1a;知乎要理解C&#xff08;只谈C11/14之后&#xff09;的初始化类型&#xff0c;我认为要从最一般类型入手&#xff0c;那就是list initialization&#xff0c;其形式为&#xff1a;[ne…...