格式化字符串漏洞入门:从printf误用到任意地址写
这道题目我第一次拿到的时候其实有点懵jarvisoj_fm乍一看像某个在线编程评测平台的编号连个正经题目名都没有。等把二进制下下来一跑才发现这是一个非常经典的 pwn 入门题型——格式化字符串漏洞Format String利用。简单说程序把用户的输入直接当成printf的格式串给打了出去导致我们不仅能任意读内存还能借助%n写任意地址最终把一个全局变量改成指定值就能触发“打印 flag”逻辑。这篇东西不是单纯贴一个 exp 就完事。我会从题目拆解、漏洞原理、偏移定位、本地调试、远程利用到常见坑位把这一条链路完整讲清楚。适合刚接触二进制安全、想从“会调 pwntools”进阶到“真的理解 fmt 漏洞”的人有汇编基础更好没有也能跟得上只要你能接受把栈看成一张“按顺序摆值的表格”。1. 先从最朴素的观察开始——题目到底在考什么1.1 拿到 pwn 题第一步永远是三件套不管题目叫什么名字只要是 pwn第一步绝对不要急着想利用技巧。先把二进制丢进file、checksec、strings三个命令里过一遍。这三个命令能告诉你这是什么架构、开启了哪些防护、有没有直接泄露出来的提示字符串。$ file fm fm: ELF 32-bit LSB executable, Intel 80386, dynamically linked, stripped $ checksec --file./fm [*] /tmp/fm Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)这类早期平台训练题基本都有相同的画像32 位 i386、无栈保护、无 PIE、部分 RELRO。这意味着什么意味着程序里函数的地址、全局变量的地址都是固定的不会因为 ASLR 随机化我们如果能找到目标变量的绝对地址就可以直接往那个地址写东西。NX 开启只是说明栈上不能直接执行 shellcode但本题根本不需要 shellcode所以 NX 对我们的路线没有影响。再跑一下strings看看输出通常会有一些非常友好的提示比如某个变量名、cat flag、/bin/sh、错误提示之类。即便这题的二进制被 strip 过符号表删干净了关键字符串依然在通过字符串引用就能反推出关键函数流程图。1.2 漏洞坐标printf(format)这种传参方式就是突破口用 IDA 或者 radare2 打开二进制反汇编主逻辑后看到的伪代码逻辑大概是这样的int main() { char buf[64]; int target 0; read(0, buf, 64u); printf(buf); // 漏洞点直接把 buf 当 format if (target 4) { system(cat flag); } else { puts(wrong); } return 0; }请注意我这里说的当然不是直接用源码编译出来的代码但反编译逻辑基本就是这个意思。核心问题集中在这一行printf(buf);正常写法应该是printf(%s, buf);这样buf里的内容只作为普通字符串数据被输出里面的%d、%x、%n统统原样打印不会产生任何副作用。但代码只传了一个参数printf会把buf的内容当做格式控制字符串来解析。于是当我们输入%p.%p.%p.%p时printf不会打印这四个字符而是把它当成四个“占位符”从当前函数栈上按顺序取出四个参数值以十六进制打印出来。1.3 目标条件并不复杂把一个变量改成 4 就赢了继续看反编译逻辑整个程序的成败就系于那个整型变量target。只要target 4程序就会执行system(cat flag)否则输出wrong然后退出。这里有一个很关键的设计程序并没有提供任何直接修改target的内置功能没有scanf(%d, target)、没有菜单、没有堆溢出点。我们能提供给程序的只有一串被当作格式化字符串的输入。换句话说你没法“正常”地把target改成 4唯一的写入口就是格式化字符串漏洞提供的任意地址写能力。1.4 为什么不是栈溢出而是格式化字符串很多新手会问程序明明用read读 64 字节到一个 64 字节的缓冲区为什么不做栈溢出两个原因第一read(0, buf, 64u)这个长度是精确的最多就读 64 字节不会多写一个字节所以想通过长度溢出覆盖返回地址完全没有空间。第二题目把printf(buf)放出来其实是在给提示这就是格式化字符串漏洞的教科书场景。一个漏洞利用题不会只给你一个漏洞它会在代码里用最显眼的方式把攻击面标出来。格式化字符串漏洞相比栈溢出的优势在于它天然具备“任意读”和“任意写”能力。你不需要精心构造 ROP 链只需要让格式化参数索引落到我们自己可控的数据上把一个内存地址嵌进输入再用%n写值就完成了一次“写什么、写哪里、写成多少”的自由控制。2. 把 printf 这件“打印外衣”脱掉看清 %n 的真面目2.1 可变参数背后的机制printf 怎么知道要读几个参数学 C 的时候printf(hello %d, %s, a, b)这种写法被当成“语法”背了下来。但在汇编层面printf是个可变参数函数调用时把所有参数按约定压栈32 位下从右往左压栈然后跳进printf函数内部。printf内部解析格式字符串遇到%d就从下一个参数槽位拿一个整数遇到%s就拿一个指针遇到%n就拿一个指针然后往指针指向的地址写入整数。但是可变参数函数根本不知道到底传了几个参数。这是 C 语言可变参数机制的天然缺陷它完全信任格式字符串里的占位符数量。如果你提供的占位符多于实际传入的参数printf不会报错只会安静地从栈上继续往后读数据读出来什么就打印什么。用一个生活化的类比你去食堂打饭食堂阿姨先问你要几个菜。正常情况下你报数阿姨按数打。但格式化字符串漏洞相当于你手里拿着一个根本不存在的菜单阿姨也不核对你的盘子你每喊一个菜名她就从锅里随便给你舀一勺。你控制菜单就能控制她最终给你什么。2.2 偏移量是格式化字符串的灵魂明白了printf会读栈下一个问题就来了我们输入的数据存在栈上的第几个参数位置只有确定这个位置你才能让%N$n精确指向自己可控的数据。%N$p这种写法是格式化字符串的“索引参数”特性其中 N 表示从第一个参数槽开始数的第 N 个参数。举例%3$p会打印第 3 个参数值。定位方法非常暴力但极其有效发送一串AAAA.%p.%p.%p.%p.%p.%p.%p.%p让printf从第 1 个参数依次打印到第 8 个参数看看哪个位置的值是0x41414141。0x41是字符A的 ASCII 码如果某个输出位点刚好是0x41414141就说明我们输入字符串的起始 4 字节正好位于那个参数槽位。在fm这个题目上实测结果基本都落在第 4 个参数。也就是AAAA.%p.%p.%p.%p.%p.%p.%p.%p ^ ^ ^ ^ ^ ^ ^ ^第 4 个%p输出的正是0x41414141。我们把这种偏移记作offset 4。有个细节要说清楚不同编译环境下偏移可能不同甚至不同函数里同一个缓冲区的位置也会变化。所以哪怕有人告诉你这题偏移是 4你自己也一定要动手打一串%p验证一遍这是格式化字符串题的基本素养。2.3%n系列把“已打印长度”变成“写操作”%n的语义比较冷门但威力巨大将当前已经输出的字符个数写入一个指针指向的内存单元。比如printf(AAAA%n)在%n执行前已经输出了 4 个字符那么它会把整数 4 写入%n对应参数所指向的地址。这个家族还有几个变种格式写入长度适用场景%n4 字节32位系统覆盖整型变量或函数指针%hn2 字节覆盖 16 位值常用于跳过空字节%hhn1 字节单字节精准写入常用于构造 GOT 改写我在写利用脚本时直接用了%n因为目标就是写一个完整的 4 字节整型值 4。2.4 为什么“输出 4 字节”就能把目标变成 4看到这里主线打法已经浮出水面。我们需要让%4$n的目标指向那个全局变量target的地址同时让%4$n执行前printf已经输出了 4 个字符。构造方法特别优雅payload p32(target_addr) b%4$n拆开看p32(target_addr)是目标地址的小端二进制表示正好 4 字节。程序用read接收数据因此这 4 字节即便包含\x00也能完整进栈不会像scanf(%s)那样被截断。栈上第 4 个参数恰好就是我们输入缓冲区的起始位置所以第 4 个参数的值就是target_addr。printf在处理%4$n时把第 4 个参数target_addr当作指针将当前已输出字节数写入该地址也就是把target_addr指向的变量赋值为 4。当前已输出字节数是多少它统计的是从格式串开始到%n之前打印的字符数。p32(target_addr)虽然包含大量不可见字符但printf一样把它们算进输出计数所以计数恰好是 4。至此target 4成功分支触发flag 到手。3. 实操实现——用 pwntools 一口气打通本地与远程环境3.1 工具准备为什么是 pwntools做 pwn 题pwntools 已经是事实标准单说两点就足够打动你一是p32/p64封装了大小端与字节转换二是有process()、remote()和interactive()配好后能直接把本地调试脚本无缝切到远程利用场景。另外还需要目标二进制本身以及一个能运行 32 位程序的环境。如果宿主机缺少 32 位动态库运行./fm会报No such file or directory这是最常见的第一道坎。安装方法各发行版大同小异这里不展开重点是你必须确认./fm能在你当前 shell 里正常跑起来再继续。3.2 第一步确认目标地址目标变量在数据段里。用objdump或readelf查符号表$ objdump -t ./fm | grep target 0804a02c g O .bss 00000004 target如果二进制被 strip符号表里可能看不到那就需要结合strings找到提示字符串再交叉引用其所在的printf位置从代码流反查数据段的变量地址。在我本地这一个复现里目标地址就是0x0804a02c但你不要把我的地址直接套用每份题目二进制的偏移可能不同请以你自己的objdump输出为准。3.3 第二步验证偏移先把利用脚本丢一边回到最基础的观测验证第 4 个参数是不是输入缓冲区起点。$ echo -e AAAA.%p.%p.%p.%p.%p.%p.%p.%p | ./fm AAAA.0xffffd4fe.0x64.0xf7f7e5c0.0x41414141.0x252e7025.0x2e70252e.0x70252e70.0x252e7025输出里第 4 位清清楚楚地打出了0x41414141偏移确认是 4。后面那些0x252e7025其实就是.、%、p这些字符的 ASCII 拼起来的不用管。不同的环境可能因为编译器栈布局不同导致偏移变化所以这一步永远不要省。如果你发现第 N 个位置才是0x41414141后面所有$4都要换成$N。3.4 第三步编写完整利用脚本目标地址已知偏移已知利用构造就是一行 payload 的事。完整脚本如下#!/usr/bin/env python3 from pwn import * context.arch i386 context.log_level info # 改成你本地的实际路径 elf ELF(./fm) # objdump -t 得到的 target 地址 target_addr 0x0804a02c def solve(io): # 如果程序有 banner 之类的输出这里 recv 一下 io.recvline(timeout1) # payload目标地址 格式化写入 payload p32(target_addr) b%4$n io.send(payload) # 拿到回显 io.interactive() if __name__ __main__: io process(./fm) solve(io) io.close()本地执行你会看到类似这样的交互过程$ python3 exp.py [] Starting local process ./fm as pid 12345 [] Receiving all data: Done wrong等等如果输出wrong说明利用失败。先别急着找远程我使用中遇到十次有八次都是同一个原因目标地址不对或者偏移不是 4。在调试模式下把log_level加到debug确认发送的 payload 十六进制是2c a0 04 08 25 34 24 6e并且目标地址在objdump里确实指向那个整型变量。本地的成功输出长这样$ python3 exp.py [] Starting local process ./fm as pid 24563 [] Receiving all data: Done flag{this_is_a_test_flag}3.5 第四步本地通了之后远程怎么接当这题还能在平台上远程跑的时候把process(./fm)一行换成remote(host, port)即可其余代码一字不用改。这里我要强调一个上线前要检查的点payload 只能发一次。因为程序读入、打印、校验、退出是一条直线没有第二次输入机会。所以不要在脚本里写io.recvuntil()然后还在循环里发送两三次发第二次的时候程序早已退出你会收到EOFError。如果远程环境抓 flag 的返回不完整可以不用interactive()改成io.send(payload) io.recvall(timeout2)recvall会把进程退出前所有输出都接回来对这类一次性交互的题最省心。4. 踩过的坑排查——本地能通远程不通的种种原因4.1 格式化字符串题常见问题速查做格式化字符串题多了你会发现翻来覆去就是这几类毛病。我整理了一张速查表先对照排除现象可能原因解法本地直接崩溃payload 里的地址写错或偏移不对用%p链重新定位偏移重新objdump输出 wrong目标变量没有变成 4确认%N$n索引、确认目标地址属于.bss/.data发送 NUL 字节后无回显接收函数是scanf/gets被\x00截断看反汇编确认是read若是scanf需改路线远程连接后脚本卡死平台下线或网络不通确认授权环境本地 Docker 起靶机输出乱码但没触发成功地址写到了错误变量用 gdb attach 查看目标地址值4.2 字节计数器的准确含义%n写入的值是“已经输出字符的计数”而不是“payload 里某段可见文本的长度”。这里有个特别容易误解的点p32(target_addr)输出的 4 个字节虽然包含0x00、0x2c这类不可见控制字符但只要它们被printf的putc写到了输出流计数就会增加。所以前面的 payload 计数是 4正确得恰到好处。但如果哪一天你要把目标改成其他数比如 32就不要以为直接%32c%4$n就行。%32c是“打印一个字符并用空格填充到 32 个字符宽度”它会输出 32 个字符于是%n写入的值是前面的杂项字节加上 32。要精确控制必须把“前面所有已打印字节数”一起算进去。举例如果你用 2 字节地址前缀想写目标值 32那么从 payload 开头到%n前的计数是“地址字节数 %32c产生的字符数”。如果还有什么其他可见字符一并计入。最稳妥的做法是直接用一个足够大的填充字符如%64c再根据实际写入值反推前缀字节数公式无非就是写入值 已打印前缀字节数 填充宽度4.3 为什么同一道题不同环境偏移会变偏移量不是数学常量它取决于编译器生成代码时的栈布局、有没有开优化、用什么优化等级。同样的代码gcc -O0和gcc -O2编译出来输入缓冲区可能就从第 4 个参数漂移到第 5 个参数。所以网上有的 wp 写%4$n有的写%5$n不要迷惑以你本地实测为准。在远程题目里如果偏移对不上先试试AAAA.%p.%p.%p.%p.%p.%p看第几个位置出现0x41414141再动态修改脚本里的数字。这一个步骤花不了十秒钟但能省掉一小时瞎猜。4.4 平台下线了远程地址失效了怎么办这类老平台很多已经停止对外服务不要为追求“远程打通”而去找一些来路不明的第三方私服。合规的做法是自己在本地搭一个与题目环境一致的容器或者虚拟机把 32 位二进制放进去跑。多了一道环境搭建步骤但对学习没有任何损失因为你练的是利用思路不是抄一个 remote 地址。如果你确实想模拟远程交互可以用socat把本地进程挂到一个 TCP 端口上再用 pwntools 的remote(127.0.0.1, 端口)连接效果和当年远程平台一模一样。5. 把 fm 背后的兵法提炼出来——格式化字符串的其他玩法5.1 从“改一个变量”到“改写 GOT 表”fm只是让你改一个全局变量这是一种“温和”的教学场景。真实赛题里格式化字符串通常用来改写 GOT 表让某个函数调用跳到攻击者想要的位置。GOT全局偏移表里存着外部函数在运行时的真实地址。程序调用system、exit、puts时会通过 PLT 跳转到 GOT 表对应项。普通情况下 GOT 项的地址是链接器写好的但在函数第一次调用后它会被解析成 libc 里的真实地址。如果漏洞能改写这个项把它改成system的地址下一次程序调用这个函数时就会执行system。这就是为什么checksec里 RELRO 很重要Full RELRO 时 GOT 段只读无法改写Partial RELROfm的情况时 GOT 表在程序启动后仍然可写。5.2 从“单点写入”到“多字节精确制造”你以为掌握了p32(addr) b%4$n就万事大吉进阶题不会让你只写一个 4。举一个典型场景你想覆盖某个函数指针为0x8048567十进制 134517607这不是输出一亿多个字符就能解决的问题性能上不现实。这个时候要用%hn写 2 字节和%hhn写 1 字节。以%hhn为例它每次只往目标地址写一个字节你可以把 4 字节指针拆成四次写入第一次写目标地址低 1 字节为地址的第 0 字节第二次写目标地址1 的 1 字节为第 1 字节依次类推每次写入前通过填充字符把当前输出计数调整到目标字节对应数值就能“拼”出任意 4 字节地址。这是格式化字符串进阶里最核心的练习很多 ROP 题的入口就是一个%hhn写 GOT。5.3 防御视角怎么让这种漏洞从源头消失站在防御者角度防范格式化字符串漏洞其实非常简单永远不要把外部输入当格式字符串。在 C/C 里用printf(%s, buf)而不是printf(buf)。使用带格式检查的编译器选项GCC 的-Wformat-security会在编译时对这类错误给出高优级别警告。全局层面RELRO、栈金丝雀、PIE、NX 这些都能提高利用门槛但根因还是代码里少了一个%s。我见过不少从代码审计转 pwn 的人第一反应是堆砌各种防护机制却忘了最便宜、最有效的修复是补齐格式串。防护是加高围墙修好漏洞才是拆掉门。5.4 经验沉淀做格式化字符串题的固定心法这些题目做多了我沉淀出一个固定套路先确认数据类型与读取方式再定位偏移最后精确计算计数。三步缺一不可。数据类型决定了 payload 里能不能直接带0x00字节。读取方式决定你能不能发完整二进制数据。偏移定位决定%N$n里 N 是多少。计数计算则决定写入值是否符合预期。fm这道题把这四步都演示了一遍只是每个环节都很温和数值恰好是 4payload 恰好是 7 字节利用路径短得一眼能望到头。但你要清楚它训练的不是“背一个模板脚本”而是让你理解格式串解析和栈布局之间的联系。一旦理解了后面遇到%hhn、遇到多阶段写入、遇到 PIE 开了需要先泄漏地址的题型你就会有意识地按同一套方法论去拆解而不是换个壳就认不出来。我个人在本地复现这道题时最喜欢玩的一个扩展是把题目二进制里的target故意改成其他值比如 5然后重新设计填充宽度。你会发现只要掌握了计数原理改目标数值只是数学题。这个小小的改题练习比做十道同类题更能检验你是不是真的懂了格式化字符串漏洞的本质。

相关新闻

ARM64离线安装K8s:flannel v0.11.0网络插件部署与避坑

ARM64离线安装K8s:flannel v0.11.0网络插件部署与避坑

简介:flannel v0.11.0 的 Linux ARM64 预编译安装包,面向需要在 ARM64 架构 Linux 环境(如树莓派、鲲鹏服务器)中部署 Kubernetes 集群、配置容器网络插件的运维与开发人员。该版本为 Pod 间通信提供稳定的 Overlay 网络支持&…

2026/10/14 7:26:38 阅读更多 →
Spring Boot集成Netty:自定义TCP协议服务端实战指南

Spring Boot集成Netty:自定义TCP协议服务端实战指南

接手真实的设备接入项目时,第一次需要把 Spring Boot 和 Netty 组合起来,用自定义 TCP 协议做服务端。刚开始那几天,网上翻到的资料要么只讲 Netty 单独跑通的 Demo,要么只贴一堆配置没有业务落地的细节,真正能把“自定…

2026/10/14 7:26:38 阅读更多 →
PS5远程串流全指南:从主机设置到网络优化,随时随地玩遍游戏

PS5远程串流全指南:从主机设置到网络优化,随时随地玩遍游戏

串流游戏这个东西,我前前后后折腾了小半年,踩过的坑能写满一页纸,但带来的便利也是实打实的。所谓“AnyPS5”,我自己的理解很简单:不管手里是手机、平板、轻薄本还是办公室的电脑,只要能装客户端、能联网&a…

2026/10/14 7:26:38 阅读更多 →

最新新闻

Node.js+Vue全栈开发出租车智能调度系统实践

Node.js+Vue全栈开发出租车智能调度系统实践

1. 项目背景与核心需求出租车业务管理系统是传统运输行业数字化转型的典型场景。随着网约车平台的兴起,传统出租车公司面临着运营效率低下、调度方式落后、数据统计困难等痛点。这个基于Node.jsVue的全栈项目,正是为了解决以下核心问题:实时调…

2026/10/14 10:08:38 阅读更多 →
瑞利-里茨法:弹性力学能量原理与工程实践

瑞利-里茨法:弹性力学能量原理与工程实践

1. 瑞利-里茨法基础理论1.1 能量原理的物理背景在弹性力学系统中,能量原理为我们提供了一种强有力的分析工具。最小势能原理指出:在所有满足位移边界条件的可能位移场中,真实的位移场使得系统的总势能取得极小值。这个原理不仅适用于静力学问…

2026/10/14 10:08:38 阅读更多 →
Kafka Log存储原理:揭秘顺序写、稀疏索引与Segment分片设计

Kafka Log存储原理:揭秘顺序写、稀疏索引与Segment分片设计

1. 这不是“日志存储”,而是 Kafka 的数据心脏——从磁盘文件结构看吞吐与一致性的底层博弈你打开 Kafka 的 data 目录,看到一堆形如topic-partition-0/00000000000000000000.log和00000000000000000000.index的文件,第一反应可能是&#xff…

2026/10/14 10:08:38 阅读更多 →
Qt+MinGW 编译 PCL 全依赖链实战指南

Qt+MinGW 编译 PCL 全依赖链实战指南

简介:本资源面向需要在Windows平台使用Qt与MinGW构建点云处理环境的C开发者,提供PCL及其全部依赖库的完整编译成果。PCL是开源三维点云处理库,涵盖数据采集、预处理、特征提取与表面重建;配套的Boost、Eigen、FLANN、Qhull与VTK分…

2026/10/14 10:08:38 阅读更多 →
基于机器学习的Web日志异常检测与根因分析

基于机器学习的Web日志异常检测与根因分析

简介:这是一套面向Web安全工程师、运维开发人员及机器学习初学者的终端日志分析工具,聚焦于Web服务器日志的自动化统计、审计与恶意请求识别。项目基于Python实现,集成日志解析、访问量/请求类型多维统计、SQLite(或MySQL&#xf…

2026/10/14 10:08:38 阅读更多 →
macOS C++20开发环境配置:LLVM+VS Code+Clang完整闭环

macOS C++20开发环境配置:LLVM+VS Code+Clang完整闭环

1. 为什么 macOS 上配 C 环境总让人“卡在第一步”?Mac 用着顺手,写代码也清爽,但一到配 C 环境,很多人就停在了终端里那行command not found: g上——不是没装 Xcode,就是装了却找不到编译器路径;不是clan…

2026/10/14 10:07:26 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →