WWW.YOUINFO.SITE
标签聚合 好久不见

/tag/好久不见

v2ex · 2026-05-22 11:04:45+08:00 · tech

AI 确实给生活带来了变化,所以我可以把一直想实现的事情实现了,做了一款针对于光影处理的 APP ,以后也会继续延续这个方向深耕。 一个人的 AI 团队做东西还是有点糙,希望大家多提提意见。 https://apps.apple.com/cn/app/hazelens-mood-film-camera/id6763457050 以下是促销码: 3T9PJ6YL4W9R 99JM6RJ9TWPR JJWNJAHNNJNN RHN3PXW7MXKF XJFPM7TJ4HYJ X7JEEM4MH739 64LMATMTF9A9 W7T69F9FM3NX 7FWR6JP6WHKL 7J4YY4674P7E X6N3JARYWJM3 7K3R7ML379P7 WARRJXJJ9JW6 KJY9FNKRH4FX W7AXFH7JNEKL EMR97XY9FWA7 Y6HJMYWKMNH4 JPHPTPMT3TLT PAREAPJHXN6E JRNKYH9W7NR9

v2ex · 2026-05-22 11:01:19+08:00 · tech

AI 确实给生活带来了变化,所以我可以把一直想实现的事情实现了,做了一款针对于光影处理的 APP ,以后也会继续延续这个方向深耕。 一个人的 AI 团队做东西还是有点糙,希望大家多提提意见。 https://apps.apple.com/cn/app/hazelens-mood-film-camera/id6763457050 以下是促销码: 3T9PJ6YL4W9R 99JM6RJ9TWPR JJWNJAHNNJNN RHN3PXW7MXKF XJFPM7TJ4HYJ X7JEEM4MH739 64LMATMTF9A9 W7T69F9FM3NX 7FWR6JP6WHKL 7J4YY4674P7E X6N3JARYWJM3 7K3R7ML379P7 WARRJXJJ9JW6 KJY9FNKRH4FX W7AXFH7JNEKL EMR97XY9FWA7 Y6HJMYWKMNH4 JPHPTPMT3TLT PAREAPJHXN6E JRNKYH9W7NR9

v2ex · 2026-05-22 10:24:53+08:00 · tech

AI 确实给生活带来了变化,所以我可以把一直想实现的事情实现了,做了一款针对于光影处理的 APP ,以后也会继续延续这个方向深耕。 一个人的 AI 团队做东西还是有点糙,希望大家多提提意见。 https://apps.apple.com/cn/app/hazelens-mood-film-camera/id6763457050 以下是促销码: 3T9PJ6YL4W9R 99JM6RJ9TWPR JJWNJAHNNJNN RHN3PXW7MXKF XJFPM7TJ4HYJ X7JEEM4MH739 64LMATMTF9A9 W7T69F9FM3NX 7FWR6JP6WHKL 7J4YY4674P7E X6N3JARYWJM3 7K3R7ML379P7 WARRJXJJ9JW6 KJY9FNKRH4FX W7AXFH7JNEKL EMR97XY9FWA7 Y6HJMYWKMNH4 JPHPTPMT3TLT PAREAPJHXN6E JRNKYH9W7NR9

v2ex · 2026-05-22 10:24:53+08:00 · tech

AI 确实给生活带来了变化,所以我可以把一直想实现的事情实现了,做了一款针对于光影处理的 APP ,以后也会继续延续这个方向深耕。 一个人的 AI 团队做东西还是有点糙,希望大家多提提意见。 https://apps.apple.com/cn/app/hazelens-mood-film-camera/id6763457050 以下是促销码: 3T9PJ6YL4W9R 99JM6RJ9TWPR JJWNJAHNNJNN RHN3PXW7MXKF XJFPM7TJ4HYJ X7JEEM4MH739 64LMATMTF9A9 W7T69F9FM3NX 7FWR6JP6WHKL 7J4YY4674P7E X6N3JARYWJM3 7K3R7ML379P7 WARRJXJJ9JW6 KJY9FNKRH4FX W7AXFH7JNEKL EMR97XY9FWA7 Y6HJMYWKMNH4 JPHPTPMT3TLT PAREAPJHXN6E JRNKYH9W7NR9

v2ex · 2026-05-22 10:11:00+08:00 · tech

AI 确实给生活带来了变化,所以我可以把一直想实现的事情实现了,做了一款针对于光影处理的 APP ,以后也会继续延续这个方向深耕。 一个人的 AI 团队做东西还是有点糙,希望大家多提提意见。 https://apps.apple.com/cn/app/hazelens-mood-film-camera/id6763457050 以下是促销码: 3T9PJ6YL4W9R 99JM6RJ9TWPR JJWNJAHNNJNN RHN3PXW7MXKF XJFPM7TJ4HYJ X7JEEM4MH739 64LMATMTF9A9 W7T69F9FM3NX 7FWR6JP6WHKL 7J4YY4674P7E X6N3JARYWJM3 7K3R7ML379P7 WARRJXJJ9JW6 KJY9FNKRH4FX W7AXFH7JNEKL EMR97XY9FWA7 Y6HJMYWKMNH4 JPHPTPMT3TLT PAREAPJHXN6E JRNKYH9W7NR9

v2ex · 2026-05-22 09:45:31+08:00 · tech

AI 确实给生活带来了变化,所以我可以把一直想实现的事情实现了,做了一款针对于光影处理的 APP ,以后也会继续延续这个方向深耕。 一个人的 AI 团队做东西还是有点糙,希望大家多提提意见。 https://apps.apple.com/cn/app/hazelens-mood-film-camera/id6763457050 以下是促销码: 3T9PJ6YL4W9R 99JM6RJ9TWPR JJWNJAHNNJNN RHN3PXW7MXKF XJFPM7TJ4HYJ X7JEEM4MH739 64LMATMTF9A9 W7T69F9FM3NX 7FWR6JP6WHKL 7J4YY4674P7E X6N3JARYWJM3 7K3R7ML379P7 WARRJXJJ9JW6 KJY9FNKRH4FX W7AXFH7JNEKL EMR97XY9FWA7 Y6HJMYWKMNH4 JPHPTPMT3TLT PAREAPJHXN6E JRNKYH9W7NR9

v2ex · 2026-05-19 11:35:59+08:00 · tech

🎉 好久不见,祝大家 Vibe Coding 顺利! 之前送出 1 万刀福利后,我们的服务器遭到了一些同行的恶意攻击和举报。经过一段时间的全力调整与防御升级,我们终于满血复活,再次为大家提供稳定的服务! 💰 价格再降 为了回馈大家的支持,我们将 5.5 系列模型 的价格再次下调,充值 4 折: 新分组倍率 : 0.06 折合倍率 :约 0.024/刀 🎁 10 刀专属福利 因为遭受攻击,近期服务出现了偶发性波动,给部分开发者带来了不好的体验,在此我们深表歉意🙇‍♂️。 为了弥补大家,除了服务波动时间内在群内累计发出的 1300 元 Key 之外,我们决定 向全体用户再赠送 10 刀额度 ! 💡 领取方式: 添加 QQ 群 543293255 进群后发送口令 领取福利 即可获取! 🔗 快速开始 🌍 官方网站 : https://code.giot.edu.kg 🚀 主 API URL : https://code.giot.edu.kg 🛡️ 备用 API URL : https://code.huizhicode.com 祝大家工作顺利,代码一遍过,Bug 全退散! 👨‍💻👩‍💻

v2ex · 2026-05-19 11:35:29+08:00 · tech

🎉 好久不见,祝大家 Vibe Coding 顺利! 之前送出 1 万刀福利后,我们的服务器遭到了一些同行的恶意攻击和举报。经过一段时间的全力调整与防御升级,我们终于满血复活,再次为大家提供稳定的服务! 💰 价格再降 为了回馈大家的支持,我们将 5.5 系列模型 的价格再次下调,充值 4 折: 新分组倍率 : 0.06 折合倍率 :约 0.024/刀 🎁 10 刀专属福利 因为遭受攻击,近期服务出现了偶发性波动,给部分开发者带来了不好的体验,在此我们深表歉意🙇‍♂️。 为了弥补大家,除了服务波动时间内在群内累计发出的 1300 元 Key 之外,我们决定 向全体用户再赠送 10 刀额度 ! 💡 领取方式: 添加 QQ 群 543293255 进群后发送口令 领取福利 即可获取! 🔗 快速开始 🌍 官方网站 : https://code.giot.edu.kg 🚀 主 API URL : https://code.giot.edu.kg 🛡️ 备用 API URL : https://code.huizhicode.com 祝大家工作顺利,代码一遍过,Bug 全退散! 👨‍💻👩‍💻

LinuxDo 最新话题 · 2026-05-08 22:39:25+08:00 · tech

好久不见佬友们,最近一个月忙着各种各样的事情,歇逼了一阵子,终于又来更新了。今天终于要正式进入Pwn用户态栈利用的部分了。章节1我们将从最基础的栈溢出漏洞开始,介绍这一元老级漏洞所造成的巨大危害,以及五花八门的利用手法。 Stack Buffer 我们即将学习你的第一个二进制漏洞—— 栈溢出 Stack Overflow 。或许一个更专业学术的名称是 栈缓冲区溢出 Stack Buffer Overflow 。那么,我们首先来简单介绍一下缓冲区的概念。 缓冲区 是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为 输入缓冲区 和 输出缓冲区 。 Wiki上叫作 缓冲器 ,以下是摘自其上的描述 缓冲器(英语:buffer),又称缓冲器,是暂时置放输出或输入数据的存储器区域。通常,自输入设备(例如麦克风)访问数据后,数据在输出至另一设备(例如扬声器)前,会暂存在缓冲器中。但此外,电脑内部的不同进程间传输数据也会用到缓冲器。这与电信中的缓冲器相当。缓冲器可以在硬件中的固定存储器位置中实现,也可以在软件中使用指向物理内存中的某个位置的虚拟数据缓冲器来实现。但无论如何,缓冲器中的数据都存储于某个实体的存储介质。多数缓冲器都是在软件层面实现的,它们一般会使用RAM来存储临时数据,因为RAM比硬盘的访问速度快得多。当接收数据的速率和处理数据的速率之间存在差异时,或者这些速率有波动的情况下,例如在打印机假离线程式或在线视频流中,通常也会使用缓冲器。在分布式计算环境中,数据缓冲器通常以突发缓冲器的形式实现,以提供分布式缓冲服务。 简单来说,这其实是一块 人为分配的大小有限的内存 ,它被用来暂时储存外部输入或将要输出到外部的数据,直到程序处理掉这块数据为止。如果这块内存被分配到栈上,那么就是 栈缓冲区 ;如果分配到堆上,那么就是 堆缓冲区 。 那么, 溢出 这个概念就自然好懂了,实际上就是 放入缓冲区的数据大小超过了缓冲区本身的大小 。如果该缓冲区是栈缓冲区,那么多出来的数据就会从那一片栈空间中 溢出 , 覆盖到栈上的其他数据 ,这就是 栈缓冲区溢出 。 Experiment - 分配一个用户输入栈缓冲区 我们由一个实验来直观地呈现栈缓冲区这个概念,同时熟悉pwndbg下栈的数据观察。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { char buffer[0x20]; read(0, buffer, 0x20); printf("Your Input is %s", buffer); return 0; } //gcc exper1111.c -o exper 简单解读一下程序,首先声明一个0x20大小的char数组,这就是我们所说的 缓冲区 。在0-1-3我们介绍过, 栈中存储着局部变量和函数调用信息 ,所以我们的 buffer 就是一个 栈缓冲区 。这个缓冲区用于储存后续 read 从 标准输入 读入的0x20个字节大小的数据,然后通过 printf 以 字符串 形式解析并打印到屏幕上。 关于文件描述符 Linux系统将每个对象当作文件处理。这包括输入和输出进程。Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符是一个非负整数,可以唯一标识会话中打开的文件。每个进程一次最多可以有九个文件描述符。出于特殊目的,bash shell保留了前三个文件描述符(0、1和2) 标准输入 STDIN fd=0 STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。shell从STDIN文件描述符对应的键盘获得输入,在用户输入时处理每个字符。 编译后,我们运行一下。 程序正常执行,我们通过pwndbg调试一下试试 这里是main函数起始位置。可以看到之前介绍的程序序言部分开辟了一个栈帧。然后 sub rsp, 0x30 抬栈,这里就是程序预留出的栈缓冲区了。 简单说一下 A -> B -> C <- D 这个很常见的表示方法 比如 0x7fffffffe0a0 -> 0x7fffffffe150 -> 0x7fffffffe1b0 <- 0 首先第一个是栈地址,然后这个栈地址上的空间存储 0x7fffffffe150 这个栈 指针 ,这个指针又指向 0x7fffffffe1b0 这个栈地址,然后 0x7fffffffe1b0 中存储着 0 这个数据。 然后我们单步到 read 函数。 可以看到这里的 rsi 存储着栈顶的地址,说明 read 函数将要从栈顶开始向栈中读入来自标准输入的0x20字节大小的数据。 这里我们会发现缓冲区似乎比预想的更大一些,有0x30字节大小,并且在 rbp+8 的位置我们发现了一串神秘的数据。这其实是程序开启了 Canary 产生的现象,这里我们先按下不表,只需了解这是一种缓解栈溢出攻击的措施。 总之,这里我们继续读入数据 在这里我们一共读入了11个字节,可以在栈视图中直观地看出。我们的数据已经从用户标准输入读入到了程序的栈缓冲区当中。 Stack Overflow 我们已经知道,栈缓冲区实际上就是一块可以由 用户控制其内容的栈空间 。那么设想这样一种情况:如果程序允许用户输入的数据大小超过了缓冲区的大小,理所应当地,就发生了栈缓冲区溢出。 char buffer[0x20]; read(0, buffer, 0x100); 由于栈上存储着局部变量和函数调用信息,因此,溢出的数据最终会 覆盖 掉这些信息,导致程序运行 出错 或者被 劫持 。 所以,发生栈溢出的基本前提是: 程序必须向 栈上写入 ,也就是说有一块 可控的栈缓冲区 写入的大小未被很好地控制 导致输入大小可以超过缓冲区的大小 一个十分简单的例子:如果我有一个 gets(buf) 原语,由于 gets 无限制地向 buf 缓冲区从标准输入读入数据,但是 buf 并不是无限大的 ,这就会导致栈溢出的发生。读入的数据大小超过了缓冲区的大小。 历史上的第一个蠕虫病毒 莫里斯蠕虫 就是利用了危险函数 gets 实现了栈溢出。由于该函数广为人知的不安全性,在2011年12月发布的标准中, gets 函数被移除 Experiment - Stack Overflow to Overwrite 接下来,我们由一个实验来体会栈溢出所能造成的严重后果。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int vuln() { char buffer[0x10]; int flag = 0; scanf("%s", &buffer); if(flag != 0) { return 1; } else { return 0; } } int main(){ int check = vuln(); if (check == 1) { printf("Congratulations!\n"); system("/bin/sh"); } else { printf("End of the line.\n"); } return 0; } //gcc exper1112.c -fno-protector -O0 -o exper 这是一个简单的 Proof of Concept ,在 vuln 中存在一个栈溢出漏洞,可导致程序输入 覆盖到其他变量 : vuln 申请了一片缓冲区和一个状态变量,用户输入使用 scanf("%s", &buffer) 向缓冲区读取数据并按照字符串形式进行解析。在此过程中, scanf("%s", &buffer) 是一个危险原语。由于 scanf("%s") 不检查输入长度 ,所以这里存在栈溢出漏洞。后续在返回前,函数检查了 flag 的值,然后返回不同的值 在 main 中,首先检查了 vuln 的返回值是否为1, 如果是,那么直接 GetShell ,如果不是,打印信息后返回。 直接运行程序输入abc试试 程序的缓冲区大小在编译后可能会发生变化,不过没关系,我们直接用gdb进行调试。 我们直接进入 vuln 函数, 单步到 scanf 的位置看看 再想想刚才的分析,如果我们想要 让 vuln 返回1的话,就必须让 flag 变量有值 。但是 flag 全程没有被调用,所以我们只能通过非正常手段让 flag 被 覆盖 为1. 显然是用我们刚刚提到的栈溢出漏洞了。我们尝试一下。 确认一下当前的栈情况 如何定位 flag 呢,在汇编中是没有局部变量符号的,我们只能从源码开始分析 scanf("%s", &buffer); if(flag != 0) 在 scanf 之后就是if判断块,那么下一条指令应该就是对 flag 的操作。 0x555555555183 <vuln+42> cmp dword ptr [rbp - 4], 0 那么 rbp - 0x4 的位置就是 flag 变量。我们通过 x/20gx 命令查看 由于我们的 flag 是 int 只有四个字节,那么在图上就在这里 现在的flag为0 我们先输入0x18个字符,测试下缓冲区边界。 这里输入了24个字符a,对应的十六进制就是0x61,可以看到刚刚好覆盖到 flag 的前面。那么我们直接重启程序,尝试将 flag 全部覆盖。 我们需要输入 0x20 个字符。 重新定位到 scanf 这里通过 cyclic 命令生成了0x20长度的字符串。直接复制即可。 这里我们实际上输入了0x21个字符,因为回车是最后一个换行符 \n 。但是在 scanf 解析后被替换为了 \x00 ,所以实际上还是 0x20 个字符读入。 C语言以 \x00 作为字符串结尾。 我们的 flag 被覆盖为了 aaaa , 成功了 !这里出现了栈溢出, 覆写 Overwrite 了 flag 的内容。根据函数逻辑,我们的 vuln 会返回1 RAX 为1, 成功了!当我们返回到 main 函数,我们将会获得 Shell 现在我们退出调试,直接运行程序,然后输入 0x20 长度字符串触发栈溢出,同样会得到Shell,试试看。 总结一下。我们利用 vuln 函数的栈溢出漏洞,成功覆盖了栈上的关键变量 flag ,导致绕过了if检查获取到了Shell。 这其实是缓冲区溢出漏洞利用中特别重要的 覆写思想 overwrite ,利用溢出漏洞,我们可以修改在内存中的敏感信息,例如 指针,变量,返回地址 等。通过覆写,我们可以劫持程序执行流,从而达到Getshell的目的。 Pwntools 脚本交互 刚才我们是通过终端直接和程序交互,但是很多时候,我们需要发送一些键盘不能直接打出的特殊字符,或者需要很快的交互光手打无法达成的时候,我们就需要使用 pwntools 这个Python库来和程序进程进行交互。 新建一个py文件,导入 pwntools 。 from pwn import * 然后通过创建一个IO对象来使用pwntools封装的方法 # 使用路径 filepath = "" # 从本地启动一个进程,建立socket连接 io = process(filepath) # 如果需要远程连接,使用remote io = remote('IP/domain name', Port) 比如我要发送一些数据,就使用 # 字符串前面加b表示以字节流形式发送,这是个好习惯。 io.send(b'Hello World') 要接收数据,使用 # 接收到最近的换行符 io.recvline() 也就是说,我们完全使用Python脚本进行数据收发,这极大方便了我们对程序进行测试和利用。只需要在这个脚本中写入我们需要的一切操作,运行就能达成我们想要的效果。这就是 Exploit利用脚本 刚刚的实验,我们完全可以通过python脚本的形式进行交互和利用。 from pwn import * # 新建io对象,从本地启动程序exper io = process("./exper") # 构建GetShell的Payload payload = cyclic(0x20) #生成0x20大小有序的字符串 # 在payload后加一个换行符发过去 io.sendline(payload) # 启动交互模式,可以直接在Python脚本运行环境下和程序交互,这里就用于和Shell进行交互 io.interactive() 跑一下试试。 Experiment - 通过栈溢出绕过随机数检查 在CTF中我们常见这样一类题目,需要你输入一串密码,但是这个密码是随机生成的。你虽然能通过调试拿到这个密码,但是每次启动程序这个密码都是不一样的。CTF Pwn中,我们需要获取的flag都在服务器上,本地只会给你一个测试用的程序。所以当我们 本地利用成功后,还需要连接到服务器上进行远程利用 ,远程利用和本地利用是同样的程序。在远程利用中,我们当然就不能直接通过gdb调试直接拿到密码了。 我们由一个实验来体会CTF Pwn的题目模型。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> char TOKEN[0x10]; void initpasswd() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); setvbuf(stderr, 0, 2, 0); //设置缓冲区,让输入输出即时显示 FILE* stream = fopen("/dev/urandom", "r"); fgets(TOKEN, 0x10, stream); } int vertify() { char PASSWORD[0x10]; char password[0x10]; memcpy(PASSWORD, TOKEN, 0x10); printf("Give me your passwd:"); read(0, password, 0x18); if (!strcmp(password, PASSWORD)) return 1; else return 0; } void main() { initpasswd(); if ( vertify() ) { printf("Welcome to the system!\n"); system("/bin/sh"); } else { printf("Invalid password!\n"); } } //gcc exper1113.c -fno-stack-protector -O0 -o exper 程序实现了一个验证功能。每次启动时在 initpasswd 去生成一串随机数,这个随机数从 /dev/urandom 读取。urandom通过当前设备的运行熵生成随机数。所以想要直接预测这个随机数是非常困难的,可以姑且看作是真随机。 发生器有一个容纳噪声数据的[熵池],在读取时, /dev/random 设备会返回小于熵池噪声总数的随机字节。 /dev/random 可生成高随机性的[公钥]或[一次性密码本]。若熵池空了,对 /dev/random 的读操作将会被[阻塞],直到收集到了足够的环境噪声为止。这样的设计使得 /dev/random 是真正的[随机数发生器] ,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。 /dev/random 的一个副本是 /dev/urandom (“unblocked”,非阻塞的随机数发生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对 /dev/urandom 的读取操作不会产生阻塞,但其输出的熵可能小于 /dev/random 的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。 然后通过 vertify 去做身份验证。如果通过的话就开一个Shell给你。这里 vertify 中存在一个栈溢出。 char PASSWORD[0x10]; char password[0x10]; read(0, password, 0x18); 栈在申请局部变量时是先申请的在下方,后申请的在上方。 这个栈溢出非常小,只有8字节,并且不足以完全覆写 PASSWORD 原密码缓冲区,只能覆写密码的前8字节。 怎么办呢?注意到比较是通过 strcmp 实现的。这里我们需要先考查一下 strcmp 函数的性质。 简单的比较字符串是吧。但是我们在上一个实验曾经提到过 C语言的字符串以 \x00 结尾 那么 strcmp 是否遵循这个规则呢?我们可以写一个简单的PoC验证一下 #include <string.h> #include <stdio.h> int main() { char str1[] = "abc\x00def"; char str2[] = "abc\x00xyz"; if (strcmp(str1, str2)) printf("Same Strings!"); else printf("NO!"); return 0; } 程序很简单,定义两个字符串,它们的前三个字符和 \x00 相等,后三个字符不同。通过 strcmp 进行比较,如果相同就打印相同。我们编译运行一下。 我们的猜想是正确的!在比较的过程中, strcmp 发生了 零截断 。这导致字符串没有被完整比较。事实上,它只比较了 \x00 前面的部分。 于是,我们的思路就呼之欲出了: 通过栈溢出覆写PASSWORD前字节为 \x00 ,截断字符串,使之与我们输入的 password 相同。 所以我们可以构建这样的Payload payload = b'\x00' * 0x18 脑测一下: 程序从 password 起始位置开始读入数据,整个 password 被读入为0x10个 \x00 缓冲区溢出到 PASSWORD , PASSWORD 的前8个字节被覆盖为 \x00 来到 strcmp ,由于零截断,只会比较 password 的第一个 \x00 和 PASSWORD 的第一个 \x00 通过验证,GetShell 所以我们的Exp如下 from pwn import * io = process("./exper") # 准备payload payload = b'\x00' * 0x18 # 在提示之后发送 io.sendlineafter(b'Give me your passwd:', payload) # 开Shell io.interactive() 试试看 没问题成功了。 实际上,由于 /dev/urandom 生成的随机数是完全随机,所以我们可以采用爆破的形式。当我们随机到 TOKEN 的第一个字节为 \x00 时,同样在 strcmp 时会发生零截断。 EXP如下 from pwn import * while True: io = process('./exper') io.sendlineafter(b'Give me your passwd:', b'\x00') # 缓存接收信息 result = io.recvline() if b'Welcome' not in result: io.close() else: break io.interactive() 可以看到同样成功了。 Summries 本节我们学习了第一个二进制漏洞:栈溢出。这是相当基础,相当重要的漏洞。栈溢出可以造成严重的后果,本节我们主要探讨了Pwn利用的一个重要思想: 覆写 Overwrite 。覆写是一切篡改的基础。后续的学习我们将和栈帧的相关知识结合起来,学习栈溢出基本的利用手法。后续的Pwntools教程也会跟进补上。 Have Fun!我们下个帖子再见! 1 个帖子 - 1 位参与者 阅读完整话题

v2ex.com · 2026-05-06 20:53:42+08:00 · tech

🎉 好久不见,祝大家开工大吉! 在这里附上一份 800 刀 的体验 Key 作为小小心意(按 codex 特价分组 0.08 倍率计算,折合可用 1 万刀 额度),祝大家工作顺利,Bug 全退散! 🔗 快速开始 网站官网 : https://code.giot.edu.kg API URL : https://code.giot.edu.kg/v1 备用 API URL : https://code.huizhicode.com/v1 🎁 免费体验 Key (请直接复制使用): sk-G0U7TVqMKlHAQjNgCZ5pQ3EtGL2g3m0UhE0ZwwayneaukgYA 💰 额度与计费详情 我们提供多种分组以满足不同场景的需求,具体倍率与折合单价如下: 分组类型 消耗倍率 折合单价 AmazonQ 分组 (5min 缓存) 1.5x 0.6 元 / 刀 Claude-逆向 3.25x 1.3 元 / 刀 高速分组 (MAX 号池) 4.5x 1.8 元 / 刀 Codex 0.5x 0.2 元 / 刀 Codex 特价 0.08x 0.032 元 / 刀 🛠 服务监控 & 交流答疑 📈 模型可用性实时监测 : https://check.huizhicode.com 💬 技术交流 QQ 群 : 543293255 (欢迎进群交流反馈或获取最新节点信息)

v2ex.com · 2026-05-06 20:53:12+08:00 · tech

🎉 好久不见,祝大家开工大吉! 在这里附上一份 800 刀 的体验 Key 作为小小心意(按 codex 特价分组 0.08 倍率计算,折合可用 1 万刀 额度),祝大家工作顺利,Bug 全退散! 🔗 快速开始 网站官网 : https://code.giot.edu.kg API URL : https://code.giot.edu.kg/v1 备用 API URL : https://code.huizhicode.com/v1 🎁 免费体验 Key (请直接复制使用): sk-G0U7TVqMKlHAQjNgCZ5pQ3EtGL2g3m0UhE0ZwwayneaukgYA 💰 额度与计费详情 我们提供多种分组以满足不同场景的需求,具体倍率与折合单价如下: 分组类型 消耗倍率 折合单价 AmazonQ 分组 (5min 缓存) 1.5x 0.6 元 / 刀 Claude-逆向 3.25x 1.3 元 / 刀 高速分组 (MAX 号池) 4.5x 1.8 元 / 刀 Codex 0.5x 0.2 元 / 刀 Codex 特价 0.08x 0.032 元 / 刀 🛠 服务监控 & 交流答疑 📈 模型可用性实时监测 : https://check.huizhicode.com 💬 技术交流 QQ 群 : 543293255 (欢迎进群交流反馈或获取最新节点信息)

v2ex.com · 2026-05-06 20:52:42+08:00 · tech

🎉 好久不见,祝大家开工大吉! 在这里附上一份 800 刀 的体验 Key 作为小小心意(按 codex 特价分组 0.08 倍率计算,折合可用 1 万刀 额度),祝大家工作顺利,Bug 全退散! 🔗 快速开始 网站官网 : https://code.giot.edu.kg API URL : https://code.giot.edu.kg/v1 备用 API URL : https://code.huizhicode.com/v1 🎁 免费体验 Key (请直接复制使用): sk-G0U7TVqMKlHAQjNgCZ5pQ3EtGL2g3m0UhE0ZwwayneaukgYA 💰 额度与计费详情 我们提供多种分组以满足不同场景的需求,具体倍率与折合单价如下: 分组类型 消耗倍率 折合单价 AmazonQ 分组 (5min 缓存) 1.5x 0.6 元 / 刀 Claude-逆向 3.25x 1.3 元 / 刀 高速分组 (MAX 号池) 4.5x 1.8 元 / 刀 Codex 0.5x 0.2 元 / 刀 Codex 特价 0.08x 0.032 元 / 刀 🛠 服务监控 & 交流答疑 📈 模型可用性实时监测 : https://check.huizhicode.com 💬 技术交流 QQ 群 : 543293255 (欢迎进群交流反馈或获取最新节点信息)

v2ex.com · 2026-05-06 20:51:42+08:00 · tech

🎉 好久不见,祝大家开工大吉! 在这里附上一份 800 刀 的体验 Key 作为小小心意(按 codex 特价分组 0.08 倍率计算,折合可用 1 万刀 额度),祝大家工作顺利,Bug 全退散! 🔗 快速开始 网站官网 : https://code.giot.edu.kg API URL : https://code.giot.edu.kg/v1 备用 API URL : https://code.huizhicode.com/v1 🎁 免费体验 Key (请直接复制使用): sk-G0U7TVqMKlHAQjNgCZ5pQ3EtGL2g3m0UhE0ZwwayneaukgYA 💰 额度与计费详情 我们提供多种分组以满足不同场景的需求,具体倍率与折合单价如下: 分组类型 消耗倍率 折合单价 AmazonQ 分组 (5min 缓存) 1.5x 0.6 元 / 刀 Claude-逆向 3.25x 1.3 元 / 刀 高速分组 (MAX 号池) 4.5x 1.8 元 / 刀 Codex 0.5x 0.2 元 / 刀 Codex 特价 0.08x 0.032 元 / 刀 🛠 服务监控 & 交流答疑 📈 模型可用性实时监测 : https://check.huizhicode.com 💬 技术交流 QQ 群 : 543293255 (欢迎进群交流反馈或获取最新节点信息)

linux.do · 2026-04-22 00:12:20+08:00 · tech

各位佬们!好久不见!由于近期班主任开始上压力了,就没在线过几次。很多佬友发送的帖子我都有看,但是一个一个回太麻烦了(摆)所以在这里做一个简单的情况说明 Q1:公益站目前的状况 A1:e目前的状况来看是似了的,我的域名已经趴窝了,完事儿数据库还被删了,再加上一堆乱七八糟的事儿就一直没修,问题也是越攒越多,再次上线的话花费的精力太多了,目前实在是抽不出来空,就先让公益站似一会吧 Q2:公益站还会再开吗 A2:答案是肯定的,开是一定会开的,毕竟不能让还在期待的佬友们失望不是吗(不过重新运营的日期可能要拖到暑假了。 Q3:日后的规划? A3:在暑假之前可能也就随便刷刷L站,跟各位佬们互相吹水啥的,发帖子可能得要大空了。暑假之后会尽快投入到公益站的重开工作中。之后的公益站还是会公开发布,额度上也不会有太多限制。 Q4:公益站目前面临的问题? A4:站里面的LDC还摊在那没改,并且两个站的LD登录还有点问题,另外根据始皇发布的公益站规范,本站还有很多不足,这些都是需要改的。 目前就先这么多吧)想着啥了再补充,佬们有啥想问的请直接发帖子,我看到会尽量回复,感谢各位了! 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-21 22:32:43+08:00 · tech

佬友们好久不见,正本清源系列恢复更新,让咱们直接进入正题,文章较长各位慢慢观看 一个普遍的感受是:AI 工具越来越多,混乱到让人焦虑。昨天学的 prompt 技巧今天已经过时,RAG 还没搞清楚 agent 又冒出来,agent 还没用熟练 MCP 又成了标配,MCP 没摸透 harness 又被推上舞台。每一波浪潮都宣称自己是"真正的答案",而上一波的东西顺理成章被贬为"过时的玩法"。 但如果你把时间拉长来看这条路径,会发现它不是随机堆积的。它有一个清晰的内在逻辑。每一层新范式都在解决上一层自己制造出来的瓶颈。看懂这个演化路径,比学会任何一个具体工具都重要——因为它决定了你该站在哪一层用力。 这篇文章想做的,是沿着时间线把每一波浪潮拆开:当时人们在和什么问题搏斗?这个问题的根源是什么?解决它的过程又制造了什么新问题?然后回到一个更根本的问题——作为一个 AI 使用者,你该如何学习、该如何优化、该如何在这片工具废土里找到自己的站位。 2022:Prompt 作为一种发现 2022 年 1 月,Google Brain 的 Wei 等人发表了 Chain-of-Thought 论文,证明了一件今天看来近乎废话的事——如果你让模型把推理步骤一步一步写出来,它在多步问题上的表现会显著提升。据 Google 在 PaLM 上的测试,这一简单变化让模型在 GSM8K 数学推理基准上达到了当时的最好成绩。几个月后 ChatGPT 发布,整个世界突然意识到"怎么跟模型说话"是一门可以学的手艺。 但今天回看,prompt engineering 的真正意义不是那些"技巧集合"。few-shot、chain-of-thought、role prompting——这些范式有效的本质原因是它们逼着使用者把一个模糊的问题翻译成精确的指令。它们在做的事情,是把"人没把问题想清楚"这个底层缺陷暴露出来,然后用技巧绕过去。 这个时期真正被验证的,是一个被低估的事实:模型对精确描述的敏感度极高,对模糊表达的容错极低。在这个约束下,任何能让使用者被迫变精确的机制都有效。而这些机制里最有效的那几个,后来被抽象成了可传授的技巧。 这个阶段留下的最大遗产不是某个 prompt 模板,而是一个认知起点——你的表达精度本身就是生产力。但这个认知很快就撞上了它自己的天花板。 2022 年底到 2023:推理是可以被"拉长"的 Chain-of-Thought 证明一件事之后,很自然地衍生出下一个问题:如果让模型把一步推理变成多步有用,那么让它把多步推理变成树状搜索、图状探索,是不是更有用?2023 年初,Yao 等人的 Tree-of-Thought 给出了肯定答案——让模型在每一步都枚举多个可能的"思路",然后用搜索算法遍历这棵思维树。之后又有 Graph-of-Thought、self-consistency 等一系列变体。 表面上看,这一阶段是 prompt engineering 的深化。但它真正传递的信号是另一件事:模型的推理能力不是一个静态的量,而是一个可以通过外部结构来放大的量。同一个模型,在线性 prompt 下可能答错,在树状 prompt 下可能答对。差别不在模型,在你给它搭的"思考脚手架"。 这个发现的深层含义,到后来才被完整消化——我们看到的不是"模型变聪明了",是"在适当的结构下,模型能表现出的推理水平比它在单轮对话里显露的要高得多"。ToT 和 GoT 本身并没有直接成为今天主流 agent 架构的骨架——后者更多是 CoT 加工具调用的结合体——但这一阶段留下的那条认知在后来被反复验证:怎么围绕模型搭一个好的工作流程,常常比选什么模型更决定结果。 2023:RAG 和 agent,向外部世界开口 到 2023 年,人们开始撞上 prompt 层面解决不了的问题。模型不知道你公司的文档、不知道今天的新闻、不能查数据库、不能执行代码。你把 prompt 调到天上去也没用,因为它答不出它不知道的事。 两条路同时被走通。一条是 RAG(Retrieval-Augmented Generation):在生成之前先去检索相关文档,把结果塞进上下文。另一条是 agent + tool use:让模型能调用外部工具,自己去搜索、去执行、去查询。2023 年 Yao 等人的 ReAct 论文把这两件事缝在一起——让模型交替进行"思考"和"行动",先推理下一步该干什么,再调用工具获取信息,再根据结果继续推理。6 月 OpenAI 推出 function calling,把 agent 能力下沉到 API 层。同年 AutoGPT、CAMEL 等多 agent 实验把这条路推到极端,LangChain 顺势成了构建 agent 系统的事实标准框架。 这一阶段的技术细节很丰富,但内核只有一个问题:模型的智能被它的"信息封闭"严重限制了。训练数据截止之后的事它不知道,你桌面上的文件它看不到,生产环境的数据库它连接不上。解决这个问题需要的不是更好的模型,是更宽的接口。 但这条路走出来之后,马上显露出新的代价。每接入一个工具都要写自定义集成,每个框架有自己的一套约定,不同模型供应商的 function calling 格式不一样,同一个能力在 LangChain 里是一种写法、在自研系统里又是另一种。工具越多,维护成本呈平方级增长。这个问题后来被 MCP 的叙事正式命名为 N×M 集成问题——N 个模型、M 个工具,每一对组合都可能要写一遍。 2024:MCP 是标准化的必然 2024 年 11 月,Anthropic 发布了 Model Context Protocol(MCP),把 agent 接入外部工具的方式标准化了。概念其实很朴素——定义一套协议,让工具提供方只实现一次 MCP 服务端,模型和客户端就都能使用;反过来,客户端只对接 MCP 规范,就能连上生态里任何遵循该协议的工具。这个设计和 Language Server Protocol 的思路是同构的——用一层标准协议把 N×M 问题降维成 N+M。 MCP 推出之后的一年,生态扩展得非常快。Anthropic 官方数据显示,到 2025 年末已经有超过 75 个连接器直接挂在 Claude 上,MCP 的 Python 和 TypeScript SDK 每月下载量合计超过 9700 万。OpenAI、Google DeepMind、Microsoft 相继加入,协议最终被捐给 Linux Foundation 下的 Agentic AI Foundation。它成了这一代 agent 基础设施的公共底座。 MCP 层面真正在解决的问题,其实不是"怎么用 AI",而是"怎么让 AI 的使用不重复造轮子"。它是一个工程范畴的胜利,不是 AI 能力范畴的胜利。这一点很关键——很多人看到 MCP 被热捧,以为自己也该去学 MCP,但如果你根本还没到需要编排多个工具的阶段,MCP 对你不会产生任何边际价值。它是为那些已经感受到 N×M 疼痛的人准备的。 2025:Context engineering,承认窗口是幻觉 到 2025 年,另一个反直觉的事实开始被广泛接受:上下文窗口不是越大越好。 早期人们默认,如果模型能看到 100 万 token,那就把所有可能相关的东西都塞进去,让模型自己挑。现实是,窗口一旦超过某个阈值,模型从长上下文里准确召回信息的能力反而下降——研究者把这种现象命名为 context rot。SWE-rebench 的维护者观察到模型性能在 100 万 token 附近会撞上一道硬墙,再往后不管窗口技术上支持多少都会明显劣化。塞得越多,模型越走神。Databricks 的一项研究甚至在 32K token 附近就观测到了明显的精度下降。 这个认识直接催生了 context engineering 的概念。2025 年 9 月,Anthropic 在官方工程博客里把它定义为 prompt engineering 的自然延续,关注的焦点从"如何措辞一条指令"变成了"如何配置模型在每一步推理时能看到的信息"。同时期,Gartner 发布报告称 prompt engineering 正在被 context engineering 取代;Andrej Karpathy 和 Shopify 的 Tobi Lütke 在社交媒体上公开支持这个转向。按 DataCamp 的测试数据,合理的上下文管理能在 agent 基准上带来 54% 的性能提升。 这一阶段真正在解决的问题是:模型的注意力是有预算的。和人一样,给它看的东西越多,它能给每一部分的关注就越少。好的使用不是最大化给它的信息,是精准地给它最少但最必要的信息。这和 prompt engineering 时代的"把话说清楚"其实是同一个原理的升级版——当年是一句话的精度,现在是整个上下文窗口的精度。 现在:Harness 是让模型能"做事"的基础设施 走到 2025 年底、2026 年初,我们来到了目前这个阶段——harness 时代。Claude Code、Cursor、Aider 这些工具被统称为 harness,不是因为它们把多次使用串起来,而是因为它们把一个只能"说话"的模型包裹进了一整套"能做事"所需的基础设施:文件系统访问、shell 执行、工具调用原语、权限和确认机制、错误回退、长任务的状态编排、多 agent 之间的协调通道、跨会话的记忆文件。语言模型本身只能产出 token,harness 负责把这些 token 翻译成对真实世界的动作,再把真实世界的反馈翻译成模型能理解的输入。 harness 要解决的问题也是前几代自己制造出来的。agent 能力足够强、工具链足够完备、上下文管理足够讲究之后,单纯的"模型 + 几个工具"已经不够用——你需要一个能让模型在真实环境里持续工作的运行时。它要决定什么操作需要用户点头、什么可以静默执行;要在工具失败时选择重试还是回退;要把一个长任务拆分成子 agent 并回收它们的结果;要在会话中断后恢复到接近中断前的状态。这些需求单独拎出来每一个都不新鲜,合起来才构成 harness 这一层。 但 harness 层本身也在迅速制造下一代问题。我自己配置过一整套 Claude Code 的定制化设施——全局规则文件、领域规则文件、subagent、slash 命令、跨会话记忆——每一个单独看都合理,但组合起来之后,系统的维护成本和认知负担开始吃掉它带来的收益。你花在记忆"每个组件的状态、每个配置的影响范围、每次更新可能的连锁反应"上的时间,开始和它节省的时间打平。harness 是一把双刃剑——它让复杂协作成为可能,也让简单任务变得复杂。 贯穿所有阶段的模式 现在站到高处俯瞰这条路径,会看到一个清晰的循环结构。 每一个时代都是这样的:某个瓶颈暴露出来,有人发明了一套新范式去解决它,这套范式确实有效,于是被广泛采用并成为行业标准。但这套范式在运行过程中必然消耗一些新资源——更多的 token、更多的集成、更多的调用、更多的协调开销。消耗积累到一定程度,就暴露出下一个瓶颈。然后下一波人又站出来,发明下一套范式。 prompt 解决的是"模型不理解你要什么";推理链解决的是"模型一次想不了那么多";RAG 和 agent 解决的是"模型不知道/做不了外部的事";MCP 解决的是"每个工具接入都要重写一遍";context engineering 解决的是"信息多了反而更糟";harness 解决的是"模型只能说话,不能直接在真实环境里做事"。 每一步都是合理的,每一步也都是局部最优。但连起来看,你会意识到没有任何一个阶段是"终极答案"。每一层都在处理上一层的溢出。而那些宣称自己是终极答案的范式,无一例外地在下一两年内被发现有自己的天花板。 这给使用者的启示其实很简单:如果你不理解一个新范式在解决什么问题,就不要急着采用它。采用一个为解决你还没遇到的问题而设计的工具,是在用复杂度换一个你用不上的能力。 该如何学习,该如何优化 面对这条路径,合理的学习策略不是"从下往上把每一层都学一遍",也不是"只学最新的那一层"。合理的策略是先诊断自己的真实瓶颈在哪一层,然后集中学那一层和它相邻的一点。 诊断瓶颈的方法也不复杂。你观察自己最近几次和 AI 协作的失败案例,问一个问题:这一次失败,是因为模型误解了我的意图,还是因为模型缺少相关信息,还是因为模型无法调用某个工具或执行某个动作,还是因为任务规模大到单次对话已经撑不住——需要长时运行、权限控制、多个子 agent 分工、跨会话状态?这四个答案分别指向 prompt 层、context 层、agent/tool 层、harness 层。把失败案例分个类,看分布在哪里集中,你就知道自己该去哪里用力。 一个推论是,大多数人其实应该在更低的层上停留更久。如果你的 AI 使用还处于"偶尔模糊、不知道怎么问"的阶段,你不需要 MCP、不需要 harness、不需要 agent framework——你需要在 prompt 和 context 层练更多次。反过来,如果你已经在每天处理几十个并行任务、需要让 AI 维持跨周的上下文、要协调多个工具链,那么 prompt 技巧对你边际收益极低,你真正该投资的是 harness 和工作流。 还有一个常被忽略的维度——工具的门槛不等于它的价值。很多人看到业界在谈 context engineering 就去学,以为这是"更高级"的东西。但 context engineering 只对那些已经建立了 agent pipeline、并且因为 token 预算在挣扎的人有意义。对一个日常用 AI 写邮件的人来说,context engineering 是过剩的复杂度。 真正重要的,是在每一次工具选择的时候问自己两个问题:这件工具要解决的问题,我已经遇到了吗?如果没有它,我今天的工作会不会真的卡住?如果两个答案都是"否",这件工具就不是你现在该学的。它可能很好,但不是你的。 一句话 从 prompt 到 harness 的演化,不是一条从原始到高级的阶梯,而是一系列针对不同瓶颈的专门解决方案。它们共同构成了一个工具栈,每一层都在解决具体的问题。 作为使用者,你真正需要做的不是追着每一层的新名词跑,而是搞清楚自己当前撞在哪一层的天花板上,然后精准地在那一层用力。看懂了这个演化逻辑,工具的"混乱"就不再混乱——它只是一张地图,你需要的是知道自己站在哪里。 这件事的残酷之处在于:地图看懂之后,大多数人会发现自己的瓶颈比想象中低得多。但这恰好是好消息——因为越低层的瓶颈,通常越容易突破。 2 个帖子 - 2 位参与者 阅读完整话题