格式化字符串漏洞攻防:从CTF题pwn6-printf看无libc环境下的利用策略
1. 项目概述从一道CTF题看格式化字符串漏洞的攻防本质最近在带新人入门二进制安全发现很多朋友在接触PWN题尤其是涉及格式化字符串漏洞的题目时总是感觉“原理懂了但一上手就懵”。正好BugkuCTF里那道经典的pwn6-printf就是一个绝佳的教学案例。这道题的精妙之处在于它没有直接提供目标系统的Libc库文件这恰恰是现实渗透测试和CTF比赛中更常见的情况——你面对的是一个“黑盒”或信息有限的二进制程序。这道题不仅考察了对printf格式化字符串漏洞的利用更考验了选手在信息不全时如何通过漏洞本身来“创造”信息最终达成攻击目标比如获取shell。今天我就结合这道题把格式化字符串漏洞从原理到利用再到无libc情况下的应对策略掰开揉碎了讲清楚。无论你是刚摸到PWN门槛的新手还是想巩固一下基础的老兵相信这篇超详细的复盘都能让你有所收获。2. 核心漏洞原理为什么printf会成为安全漏洞在深入题目之前我们必须把根基打牢。printf这个C语言里最常用的输出函数怎么会成为漏洞呢问题就出在它的“格式化”功能上。2.1 格式化字符串函数的工作原理printf函数的原型是int printf(const char *format, ...);。第一个参数format是格式化字符串后面是可变数量的参数。函数的工作方式是解析format字符串当遇到像%d、%s、%x这样的格式化占位符时它就按照调用约定去栈上32位或寄存器64位的相应位置取出参数并按照指定格式输出。这里的关键在于信任机制。printf函数完全信任程序员提供的format字符串是“正确”的即占位符的数量和后面提供的可变参数数量、类型是匹配的。它不会也没有能力去验证这一点。2.2 漏洞的诞生当程序员把用户输入当作格式化字符串漏洞产生的典型代码如下char buf[100]; fgets(buf, sizeof(buf), stdin); // 用户可控输入 printf(buf); // 危险直接将用户输入作为格式化字符串如果用户输入的不是普通的字符串而是包含了%x、%p、%s、%n等格式化占位符那么printf就会忠实地执行它的职责去栈上寻找对应的“参数”并输出。但问题是程序员并没有在printf(buf)后面提供任何可变参数。那么printf会取到什么作为“参数”呢它会取到调用printf函数时栈上或寄存器中原本就存在的一些数据。这些数据可能是返回地址、栈帧指针、甚至是栈上其他局部变量的值。举个例子如果用户输入%p.%p.%pprintf就会把栈上最顶层的三个数据在32位下通常是保存的寄存器值和返回地址附近的数据以指针形式打印出来。这就实现了内存信息泄露。2.3 关键格式化符不仅仅是泄露更是改写格式化字符串漏洞的强大远不止于泄露信息。几个特殊的格式化符赋予了它强大的攻击能力%n攻击的灵魂。这个很少被正常使用的格式化符作用是将其之前成功输出的字符总数写入一个指针参数所指向的内存地址。例如printf(12345%n, count);执行后count的值会被赋为5。在漏洞利用中我们可以通过精心构造的payload让这个指针指向我们想要修改的关键内存地址如GOT表项从而实现内存写。%x/%p侦察兵。用于泄露栈内存内容帮助我们构建内存布局的“地图”。%s深度侦察。如果泄露出的某个值看起来像一个指针比如指向.text段或libc可以用%s尝试将其作为字符串指针读出可能泄露代码或libc中的字符串这对于无libc情况下的利用至关重要。长度控制符如%10c,%100x用于精确控制%n写入的值。%10c会输出10个字符填充空格从而增加输出的字符总数。理解了这些你就明白了为什么一道名为pwn6-printf的题目会如此经典。它几乎涵盖了格式化字符串漏洞的所有核心考点。3. 题目环境搭建与初步分析面对任何PWN题第一步永远是“认识你的对手”。我们假设你已经拿到了题目的二进制文件pwn6。3.1 基础信息收集使用file和checksec命令进行初步检查file pwn6 checksec --filepwn6假设我们得到如下信息pwn6: ELF 32-bit LSB executable, Intel 80386。32位程序这对利用方式有决定性影响。32位程序函数参数通过栈传递这使我们的格式化字符串payload在栈上的布局更可控、更直观。checksec可能显示Partial RELRO甚至No RELRO并且NX enabled栈不可执行。Partial RELRO意味着GOT表是可写的这为我们通过修改GOT表来劫持程序流提供了可能。NX开启则意味着我们不能直接在栈上执行shellcode必须转向如ROP或修改GOT表等技巧。3.2 静态分析寻找漏洞点用IDA Pro或Ghidra打开二进制文件。快速浏览main函数或主要的输入函数。对于printf题目关键代码模式非常固定// 伪代码 int main() { char buffer[100]; puts(Please input your message:); fgets(buffer, 100, stdin); printf(buffer); // 漏洞点 return 0; }或者更“狡猾”一点的char buf[100]; read(0, buf, 100); printf(buf);找到这个printf(buffer)就找到了漏洞的入口。同时要留意程序里有没有其他有用的函数比如system或/bin/sh字符串。如果程序本身没有调用system也没有/bin/sh那么我们的目标通常就是泄露libc地址计算system函数地址然后修改某个函数的GOT表项为system地址最后触发该函数调用通常参数是/bin/sh。3.3 动态调试与栈帧布局探测启动gdb ./pwn6在printf调用处下断点。运行程序并输入一串简单的探测字符串例如AAAA%p.%p.%p.%p.%p.%p。注意在gdb环境中运行栈的布局可能与直接运行程序./pwn6有细微差别主要是因为环境变量的差异。这可能导致payload在gdb里成功在本地直接运行却失败。一个解决办法是**在gdb中使用unset env LINES和unset env COLUMNS**来清空影响栈布局的环境变量或者更可靠的方法是最终测试要在两种环境下都进行。输入AAAA%p.%p.%p.%p.%p.%p后程序可能会输出类似AAAA0xff8e1f10.0x1.0xf7e1c5a0.0x41414141.0x252e7025.0x2e70252e这里的0x41414141就是AAAA的十六进制形式。它出现在第4个%p对应的位置。这说明我们输入的字符串本身从AAAA开始在栈上第4个参数的位置被找到。这个偏移量这里是4是后续所有利用的基准。实操心得确定偏移量时建议使用像AAAA%4$p这样的payload。%4$p是格式化字符串的“直接参数访问”语法意思是直接访问第4个参数。如果输出是0x41414141那就确认了偏移是4。这样比数一堆%p更精确。4. 无Libc下的利用策略信息泄露的艺术题目没有提供libc这是最大的挑战也是这道题的价值所在。我们不能直接计算system的地址。我们的策略分两步先泄露后计算。4.1 泄露程序本身的地址与libc地址我们的payload需要完成以下泄露泄露ELF基址通过泄露某个指向程序.text段或.got.plt段的指针。例如栈上很可能存有main函数的返回地址指向__libc_start_main里的某个位置或某个GOT表项的地址。我们可以用%p或%s如果该地址可读来泄露。假设我们泄露到一个地址0x56555000这很可能是程序的加载基址。泄露libc中的地址这是最关键的一步。我们需要泄露一个已经在GOT表中填写的libc函数地址比如printf、puts、fgets的GOT表项。因为程序已经执行过这些函数它们的GOT表项里存放的就是该函数在libc中的真实地址。如何找到这些地址在静态分析中用IDA查看.got.plt段记下printf、puts等函数的GOT表地址例如putsgot.plt 0x56556018。在动态调试中通过多次尝试%p泄露结合vmmap命令查看内存映射识别出哪些泄露值落在libc的地址范围内通常是0xf7xxxxxx或0xf6xxxxxx。假设我们通过%5$p泄露到一个值0xf7e1c5a0通过vmmap确认它位于libc段内并且通过计算发现它和puts的GOT表项0x56556018在栈上的位置有关联那么我们就得到了一个libc地址leak_libc_addr 0xf7e1c5a0。4.2 确定libc版本与计算偏移现在我们有一个libc地址但不知道它是哪个版本的libc。在CTF中常用的libc版本有libc6-i386_2.23-0ubuntu11、libc6_2.27-3ubuntu1等不同版本函数的偏移量不同。我们有几种方法利用在线数据库如libc.blukat.me, libc.rip这是最快捷的方法。将泄露的地址的低12位即最后3位十六进制数如0x5a0或者函数相对于libc基址的偏移如果你能猜出泄露的是哪个函数提交到这些网站进行查询。网站会返回匹配的libc版本。泄露多个函数地址通过格式化字符串漏洞尝试泄露printf、fgets、system等多个函数的GOT地址。然后计算它们之间的差值。将这个差值与已知的libc版本函数偏移表进行比对可以更准确地确定版本。本地爆破如果题目来自已知的比赛平台如Bugku其libc版本往往是固定的几个之一。可以下载常见的libc版本到本地用leak_addr - offset_of_function_in_libc计算出libc基址然后验证其他函数的偏移是否匹配。假设我们通过在线数据库确定libc版本是libc6-i386_2.23-0ubuntu11_amd64注意这是32位程序用的32位libc但包名可能带amd64。我们查得该版本libc中puts函数偏移0x0005f140system函数偏移0x0003a940str_bin_sh字符串偏移0x15902b那么我们就可以进行计算Libc基址libc_base leak_puts_addr - 0x5f140system地址sys_addr libc_base 0x3a940/bin/sh地址binsh_addr libc_base 0x15902b至此我们完成了在无提供libc情况下的关键信息获取。5. 利用漏洞实现任意地址写修改GOT表有了目标地址system我们接下来要做的就是将它写入到目标位置例如printf的GOT表项。这就要用到格式化字符串的%n家族。5.1 单次写入与宽度控制%n写入的是已输出字符数。如果我们想写入一个很大的地址值如0xf7e1c940直接输出这么多字符是不现实的。因此我们利用%hhn或%hn进行分字节写入。%hhn写入1个字节char。%hn写入2个字节short。%n写入4个字节int32位下。我们的策略是将目标地址如printf_got拆分成4个字节32位然后利用%c或%x等格式化符控制输出的字符数量使其等于我们想要写入的字节值再用%hhn分别写入到printf_got、printf_got1、printf_got2、printf_got3这四个地址。这里有一个关键技巧地址本身也作为字符串的一部分放在payload里它们会占用栈空间从而影响“已输出字符数”。因此我们需要精心排列payload并利用格式化字符串的“直接参数访问”%k$n来精确控制。5.2 构造payload的通用方法假设我们要将printf_got地址0x56556010处的值修改为sys_addr0xf7e1c940。我们需要写入的四个字节分别是0x40低字节,0xc9,0xe1,0xf7高字节。一个典型的payload结构如下偏移量假设为4[p32(printf_got)][p32(printf_got1)][p32(printf_got2)][p32(printf_got3)]%[value1]c%4$hhn%[value2]c%5$hhn%[value3]c%6$hhn%[value4]c%7$hhn但这不对因为%hhn写入的是累计输出字符数。我们需要按顺序写入并且每次写入前累计输出数正好等于要写的字节值。更常用的方法是从小到大依次写入并利用前一次写入后累计值的差来控制。我们可以将payload构造在栈的更高处更大的偏移以避免地址字符串本身被计入。实际操作中我们常使用pwntools的fmtstr_payload函数来自动化生成但在理解原理时手动构造一次大有裨益。手动构造思路将四个目标地址printf_got,printf_got1,printf_got2,printf_got3依次放入payload开头。假设它们从栈上第4个参数开始存放。假设我们要写入的值是0x40,0xc9,0xe1,0xf7。第一个%hhn对应printf_got要写入0x40。目前累计输出字符数已经是4个地址的长度4*416字节即0x10。我们需要再输出0x40 - 0x10 0x3048个字符。所以第一部分是%48c%4$hhn。第二个%hhn对应printf_got1要写入0xc9。当前的累计输出是0x40。需要再输出0xc9 - 0x40 0x89137个字符。所以接着是%137c%5$hhn。依此类推。注意如果后面的值小于前面的值需要让计数“溢出”回绕因为%hhn只写一个字节0x100的溢出相当于0计算会复杂一些这也是为什么通常选择按地址从低到高、写入值也从小到大的顺序。注意事项这种计算非常繁琐且容易出错尤其是在地址对齐、字节序问题上。强烈建议在理解原理后使用pwntools的fmtstr_payload(offset, writes, numbwritten0)函数来生成payload。其中writes是一个字典如{printf_got: sys_addr}工具会自动处理所有分字节写入和宽度计算。6. 完整利用链构建与Exploit编写现在我们将所有步骤串联起来编写最终的利用脚本。这里使用Python的pwntools库。from pwn import * context.arch i386 # 32位程序 context.log_level debug # 1. 启动进程 p process(./pwn6) # 本地 # p remote(xxx.xxx.xxx.xxx, 端口) # 远程 # 2. 确定格式化字符串偏移 def find_offset(): for i in range(1, 20): payload fAAAA%{i}$p.encode() p.sendline(payload) resp p.recvline() if b0x41414141 in resp: # AAAA的十六进制 log.success(fFound offset at: {i}) return i p.clean() # 清空缓冲区准备下一次测试 log.error(Offset not found!) return None offset find_offset() # 假设我们找到 offset 4 # 3. 泄露关键地址 (这里以puts的GOT为例) puts_got 0x56556018 # 从IDA中获取的putsgot.plt地址 payload p32(puts_got) f%{offset}$s.encode() # 注意这里用%s它会将对应参数视为指针打印出该指针指向的字符串直到NULL。 # 但putsgot里存放的是地址这个地址指向libc中的代码不是字符串用%s可能会出错或截断。 # 更稳妥的方式是用%{offset}$p直接泄露该地址值本身。 payload2 f%{offset}$p.encode() # 先发送这个payload泄露栈上某个已知位置的libc地址 p.sendline(payload2) leak p.recvline() leak_addr int(leak.strip(), 16) # 假设泄露的是 puts 的GOT内容 log.info(fLeaked address: {hex(leak_addr)}) # 4. 计算libc基址和system地址 (需要根据泄露的地址确定libc版本) # 假设我们通过泄露的地址和在线数据库确定了libc版本和偏移 # 这里用假设的偏移量 libc_base leak_addr - 0x5f140 # puts偏移 system_addr libc_base 0x3a940 binsh_addr libc_base 0x15902b log.success(fLibc base: {hex(libc_base)}) log.success(fsystem addr: {hex(system_addr)}) # 5. 构造格式化字符串payload修改printf的GOT表项为system地址 printf_got 0x56556010 # 从IDA获取 # 使用pwntools自动生成payload writes {printf_got: system_addr} payload fmtstr_payload(offset, writes, numbwritten0) p.sendline(payload) # 6. 触发被修改的函数调用 # 修改printf的GOT后下次调用printf时实际会跳转到system。 # 我们需要让程序再次执行到printf并且最好能控制其参数为/bin/sh。 # 观察程序逻辑如果原程序是循环的或者有第二次输入并调用printf那最好。 # 如果没有我们可能需要修改其他函数的GOT比如strlen并提前在内存中布置好/bin/sh。 # 假设程序在漏洞点之后还会调用一次printf我们可以提前输入/bin/sh。 p.sendline(b/bin/sh\x00) # 7. 享受shell p.interactive()脚本要点解析find_offset函数自动化定位我们的输入在栈上的起始位置。泄露地址时优先使用%{offset}$p直接泄露栈上数据再用%{offset}$s尝试解析指针内容需谨慎可能崩溃。fmtstr_payload是神器它自动处理了复杂的字节拆分、宽度计算和payload构建。最后一步“触发调用”需要根据具体程序逻辑调整。理想情况是程序本身会再次调用被我们修改的函数如printf并且我们能控制其第一个参数即格式化字符串我们传入/bin/sh。如果不行可能需要构造更复杂的ROP链或修改其他函数。7. 常见问题与高级技巧在实际操作中你肯定会遇到各种问题。这里总结几个高频问题和解决思路。7.1 Payload发送后程序崩溃或无响应原因1地址不可写。检查目标地址如GOT表地址是否正确以及程序的RELRO保护级别。如果是Full RELROGOT表不可写此路不通需寻找其他可写且有函数指针的内存如.fini_array,.dtors等但现代编译默认不启用。原因2偏移量计算错误。在gdb中和直接运行时的偏移量可能不同。确保测试环境一致或使用%p多次探测确认。原因3格式化字符串解析错误。payload中包含不可打印字符或截断字符如\x00。printf遇到\x00会停止解析。确保地址放在payload前面因为%n写入操作不依赖字符串终止。使用send而非sendline有时可以避免额外的\n。原因4写入值计算错误导致死循环或崩溃。特别是使用%hhn写入时如果计算的长度差为负数printf的宽度参数会非常大导致输出极多字符程序卡死或缓冲区溢出。使用fmtstr_payload可避免此问题。7.2 泄露的地址无法匹配libc数据库原因1泄露的不是函数指针。栈上泄露的可能只是随机数据。多尝试几个偏移或者尝试用%s去读可能崩溃但崩溃地址有时也能提供信息。原因2地址随机化ASLR。每次运行libc基址都会变但泄露的地址与libc基址的偏移是固定的。确保你计算的是偏移而不是直接比对地址值。原因3libc数据库不完整。尝试使用多个数据库查询或者使用libc-database工具在本地生成所有常见版本的偏移信息进行匹配。7.3 如何提高利用成功率与稳定性多次泄露交叉验证不要只依赖一个泄露地址。尝试泄露puts、printf、__libc_start_main等多个函数的地址计算出的libc基址应该相同。使用%n而非%hn或%hhn如果条件允许目标地址值不太大一次性写入4字节的%n更稳定payload更短。布置/bin/sh字符串如果程序没有现成的/bin/sh可以利用格式化字符串的%s或%c配合将字符串写入到某个已知的可写地址如.bss段然后将该地址作为参数传递给被劫持的函数。一字节一字节写%hhn虽然复杂但最通用可以写入任意地址值。pwntools的fmtstr_payload默认就采用这种方式。7.4 64位与32位的差异这道题是32位的参数在栈上传递。如果是64位程序前6个整数或指针参数通过寄存器RDI, RSI, RDX, RCX, R8, R9传递之后的才通过栈传递。这意味着我们的格式化字符串本身第一个参数通过RDI传递。如果格式化字符串中有超过6个参数需要访问比如%7$p才会去栈上找。这使得64位下的格式化字符串漏洞利用更复杂因为我们需要先“填满”前6个寄存器通过pop gadget等才能让%n访问到栈上我们布置的地址。通常需要结合ROP链来利用难度大增。8. 总结与延伸思考通过这道pwn6-printf我们完成了一次完整的、无libc的格式化字符串漏洞利用。其核心思路可以概括为利用漏洞进行信息泄露 - 根据泄露信息推断或查询libc版本 - 计算关键函数地址 - 利用漏洞进行内存写 - 劫持控制流。这道题像一把钥匙打开了格式化字符串漏洞利用的大门。但现实世界和更高级的CTF比赛中情况会更复杂Partial RELRO vs Full RELRO我们依赖GOT可写。如果遇到Full RELRO需要寻找其他可写且有函数指针的地方或者转向栈溢出等其他漏洞。FORTIFY_SOURCE这个编译选项会对printf等函数进行加强检查可能直接检测到格式化字符串来自非字面量而终止程序。沙箱Seccomp程序可能限制了可以执行的系统调用即使拿到shell也做不了什么。需要利用ORWOpen-Read-Write等技巧来读取flag。对于初学者我的建议是一定要亲手调试。不要满足于运行一个写好的exp脚本。用gdb跟踪printf执行时栈的变化单步观察%n写入内存的过程亲眼看到GOT表项被修改感受控制流被劫持的瞬间。这个过程积累的直觉和经验是任何教程都无法替代的。格式化字符串漏洞是PWN的基础也是理解程序内存布局和运行机制的绝佳切入点把它吃透后续学习堆漏洞、内核漏洞都会顺畅很多。

相关新闻

【单片机课程设计/毕业设计】基于单片机的多呼叫信号优先级排序报警装置设计8 通道无线射频病床呼叫与复位控制系统实现 (020102)

【单片机课程设计/毕业设计】基于单片机的多呼叫信号优先级排序报警装置设计8 通道无线射频病床呼叫与复位控制系统实现 (020102)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/11 8:13:54 阅读更多 →
净化电网、提升良率,直流照明如何成为智能工厂的视觉基石

净化电网、提升良率,直流照明如何成为智能工厂的视觉基石

一.系统概述:净化工业电网污染,提升制造精度的视觉革命在现代工业厂房中,大量非线性电力电子设备密集运行——变频调速器、中频感应加热炉、电焊机、行吊起重电机(带变频控制)、大功率整流装置等——这些负载向380V交流…

2026/8/11 8:12:53 阅读更多 →
Java开发者快速实现金融指标可视化的最佳实践

Java开发者快速实现金融指标可视化的最佳实践

1. 为什么我们需要前端指标可视化? 在量化交易领域,数据可视化从来都不是可有可无的装饰品。想象一下,当你面对几十个技术指标的原始数值时,大脑需要花费多少精力才能理解这些数字背后的市场含义?而一张精心设计的图表…

2026/8/11 8:12:53 阅读更多 →

最新新闻

深入解析复制粘贴的技术原理与应用实践

深入解析复制粘贴的技术原理与应用实践

1. 复制粘贴背后的技术原理 我们每天都在使用复制粘贴功能,但很少有人真正了解它的底层实现机制。这个看似简单的操作背后,其实隐藏着一套精妙的技术架构。 现代操作系统中的剪贴板(Clipboard)系统本质上是一个数据中转站。当你执…

2026/8/11 9:02:11 阅读更多 →
Unity游戏资源分发优化:从OBB到Play Asset Delivery的迁移实践

Unity游戏资源分发优化:从OBB到Play Asset Delivery的迁移实践

1. 项目概述:为什么我们要告别OBB? 如果你是一个在Android平台上发布过Unity游戏的开发者,那么“OBB”这个词大概率会勾起你一些不那么愉快的回忆。OBB,全称Opaque Binary Blob,是Google Play为应对APK文件大小限制&am…

2026/8/11 9:02:11 阅读更多 →
广告标识行业楼顶大字制作解决方案与工艺创新

广告标识行业楼顶大字制作解决方案与工艺创新

1. 项目背景与行业痛点 在广告标识行业摸爬滚打十几年,我见过太多同行被楼顶大字制作这个"老大难"问题困扰。去年帮老友的图文店救急,他们接了个商场楼顶发光字的单子,结果外包的工厂延期半个月,安装当天发现"美&q…

2026/8/11 9:02:11 阅读更多 →
二氢茉莉酮酸甲酯:驱动全球香氛市场的“隐形冠军”

二氢茉莉酮酸甲酯:驱动全球香氛市场的“隐形冠军”

在高级香水的灵魂深处,有一种成分以其透明、优雅的茉莉花香和柑橘清香,默默提升着香气的扩散感与通透度。它就是二氢茉莉酮酸甲酯,在业内常被称为 Hedione 或 希蒂莺。作为一种极其重要的合成香料,二氢茉莉酮酸甲酯 不仅是许多经典…

2026/8/11 9:02:11 阅读更多 →
如何用Lenovo Legion Toolkit彻底掌控你的拯救者笔记本性能

如何用Lenovo Legion Toolkit彻底掌控你的拯救者笔记本性能

如何用Lenovo Legion Toolkit彻底掌控你的拯救者笔记本性能 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit Lenovo Legion T…

2026/8/11 9:02:11 阅读更多 →
Python连连看外挂:基于图像识别实现QQ游戏秒破的终极指南

Python连连看外挂:基于图像识别实现QQ游戏秒破的终极指南

Python连连看外挂:基于图像识别实现QQ游戏秒破的终极指南 【免费下载链接】Auto-Lianliankan 基于python图像识别实现的连连看外挂,可实现QQ连连看秒破 项目地址: https://gitcode.com/gh_mirrors/au/Auto-Lianliankan 在快节奏的数字娱乐时代&am…

2026/8/11 9:01:11 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →