1. 赛题全景与个人赛的作答节奏
1.1 资格赛到底在考什么:六类证据源的组合拳
刚打完这届电子数据取证挑战赛的资格赛个人赛,出来第一感觉不是“题难”,而是“题多”。团队赛可以拆人、可以并行,个人赛只有你一个人坐在那里,面对一个压缩包里散落的镜像、日志、导出包和几张截图,所有分支都得自己走完。所以这篇 WP 我不想按“第 1 题答案、第 2 题答案”这样平铺直叙,而是按取证动作来组织:拿到什么检材、先做什么、为什么这么做、哪一步最容易翻车。这样你换成别的赛题、别的工作场景,套路是能直接搬走的。
从题型分布看,个人赛的骨架基本稳定在六类证据源上:Windows 主机镜像(占分最重)、内存镜像、手机/应用数据导出、网络流量包、服务器或 Web 日志,外加零散的图片与文档元数据。这六类不是随便凑的,它们对应的是真实案件里最常出现的证据链:终端行为、运行时状态、移动侧通信、传输内容、服务端记录。出题人真正想筛的,是你能不能在一堆噪声里,用最短路径把“谁、在什么时候、用什么工具、对什么文件、做了什么”这五要素拼出来。
我个人的排序原则是:先把确定性高的分拿稳,再去啃需要反复交叉验证的题。系统版本号、计算机名、时区、账户列表、磁盘分区结构这类题,五分钟能出答案且几乎不会错;而“某个文件最后被谁删除”“某段聊天里提到的金额是多少”这类题,往往要翻三四个数据源才能确认,放在后面做,心态会稳很多。个人赛最大的敌人从来不是不会,而是在某一题上卡住二十分钟导致后面简单题没时间看。
提示:每道题先在草稿上写下“证据来源 + 提取方法 + 置信度”,再填答案。个人赛没有队友帮你复核,这个习惯能救回不少分。
1.2 时间分配与答题顺序的取舍逻辑
我给自己定的节奏是三段式:前 25% 时间做全量侦察,把所有检材过一遍,把每题标成“必得”“可解”“放弃”;中间 60% 时间主攻必得和可解;最后 15% 时间回头补放弃题和复核。这个比例不是拍脑袋来的——侦察阶段每多花一分钟,后面就少一次“翻遍整个镜像找某个键”的盲目搜索。我见过太多人上来就死磕内存镜像,结果发现答案其实在注册表里躺着。
答题顺序上还有个很实际的考量:同一份检材的题目要连着做。比如 Windows 镜像相关的七八道题,你只要把镜像挂载一次、把注册表配置单元导出一次,后面所有题都在这个“工作台”上完成。反之,如果你按题号顺序做,做第 3 题挂一次、做第 11 题又挂一次,光挂载和等索引就浪费十几分钟。这个道理在真实工作里同样成立——一次完整提取、多轮分析,永远比多轮提取、每轮只查一件事高效。
另外要提前想清楚哪些题允许“猜”。像“该文件的 MD5 前八位是多少”这种,算不出来就是算不出来,硬耗没意义;但“该用户最后一次登录时间落在哪个时间段”这种选择题,往往能通过相邻题目的答案反推。个人赛的选择题、填空题占比不低,蒙一个的期望收益是正的,前提是你得留出最后那 15% 的时间去蒙。
2. 检材预处理与统一取证环境搭建
2.1 校验、挂载与写保护:别让第一分钟毁掉后面三小时
拿到检材包的第一件事永远是校验。压缩包里通常会给一个哈希清单,先算一遍 SHA-256,确认和清单一致,再解压。这一步在比赛里可能只值一两分,但它是所有后续结论的前提——如果镜像在下载或解压过程中损坏,你后面查到的所有“异常”都可能是坏块造成的假象。工作场景里更是如此,证据完整性链断了,后面分析得再漂亮也站不住。
第二件事是写保护。Windows 镜像用只读方式挂载,Linux 下用mount -o ro,loop,Windows 上用带写保护的挂载工具或者直接挂成只读虚拟盘。手机导出包、数据库文件同理,先复制一份副本,在副本上操作。我吃过一次亏:直接用解析工具打开了原始 SQLite 文件,工具在打开时自动做了 WAL 回滚,原始文件的时间戳被改了,虽然内容没丢,但后面写报告时解释起来很别扭。
# 校验 sha256sum evidence_win.raw # 只读挂载,offset 为分区起始扇区乘以 512 sudo mount -o ro,loop,offset=$((2048*512)) evidence_win.raw /mnt/evid那个offset是新手最容易卡住的地方。分区表里给的是扇区号,不是字节偏移,必须乘以扇区大小(传统 512 字节,新盘可能是 4096)。我一般是先用分区解析工具列出所有分区的起始扇区和大小,把这张表抄在草稿上,后面每次挂载都对照着用,避免“挂上去发现是空的”这种低级问题。
注意:只读挂载不等于绝对安全。某些文件系统在有日志未回放的情况下,只读挂载也可能触发日志重放。更稳的做法是先对整个镜像做一份副本,所有实验都在副本上跑。
2.2 目录结构与证据编号:个人赛最容易忽略的“自留地”
这一条听起来像废话,但它真的影响速度。我的做法是在工作目录下建这么一套结构:/case/01_disk、/case/02_memory、/case/03_mobile、/case/04_pcap、/case/05_logs、/case/99_export。每份检材进对应目录,导出的注册表、解析结果、截图全部进99_export,文件名带上题号和一句话描述,比如Q07_usbSTOR_serial.txt。这样做的价值在于:当你两小时后回头复核某道题,不需要重新解析,直接打开文件就能看。
很多人在比赛里追求“快”,结果所有中间产物散落在桌面,最后复核阶段完全找不到当初是怎么得出那个结论的。个人赛没有第二个人帮你记,文件命名就是你的外置大脑。我甚至会给每个关键结论单独存一行文本,格式是“题号 | 结论 | 来源文件 | 偏移/键路径”,最后填答案时直接对照,几乎不会抄错。
再补一个细节:导出注册表配置单元的时候,一定要连同样本文件一起导出。有些键的值在解析工具里显示不全,需要回到原始配置单元里看二进制数据。还有AmCache、SRUM这类数据库,解析工具版本不同,字段含义会有差异,保留原始文件能让你在工具给出可疑结果时手动核对。
2.3 时间线统一:时区、文件系统时间、日志时间的三重对齐
时间类题目是资格赛的常客,也是最容易丢分的地方。原因很简单:同一个事件,在不同数据源里可能显示成三个不同的时间。文件系统时间戳可能是 UTC,注册表里存的是 FILETIME(UTC,单位 100 纳秒,起点 1601 年),事件日志里可能带本地时区偏移,浏览器历史又是另一套存储格式。
我处理这类题的固定流程是:先确认检材所在系统的时区设置(注册表里SYSTEM\CurrentControlSet\Control\TimeZoneInformation下的TimeZoneKeyName和Bias),再确认题目问的是本地时间还是 UTC。这两个信息一确定,剩下就是换算。举个实际算过的例子:某键值给出的 FILETIME 是0x01DB3C8A5F2E7B40,换算成 Unix 时间戳要减去 1601 到 1970 之间的 11644473600 秒,再除以 10^7。我一般是写个三行脚本批量转,比手算靠谱得多。
from datetime import datetime, timedelta def filetime_to_dt(v): return datetime(1601,1,1) + timedelta(microseconds=v/10)时区偏移也要注意方向。注册表里的Bias是“本地时间 = UTC - Bias(分钟)”,而很多工具在展示时已经帮你加过偏移了。同一个数值,加了偏移和没加偏移,答案能差整整八小时,这种错误在填空题里就是零分。我自己的规矩是:所有中间结果统一用 UTC 记录,最后一步才按题目要求换算成本地时间,并且在草稿上写明“此答案已按 UTC+8 换算”。
3. Windows 主机取证:从注册表到用户痕迹
3.1 系统信息与账户类题目
这类题基本是送分,但送分题也有坑。计算机名、系统版本、安装时间、最后关机时间、当前登录用户、账户列表、账户创建时间——它们分布在不同的配置单元里,路径记熟了就是肌肉记忆。
| 题目类型 | 数据来源 | 关键位置 |
|---|---|---|
| 计算机名 | SYSTEM 配置单元 | ControlSet00x\Control\ComputerName\ComputerName |
| 系统版本与安装时间 | SOFTWARE 配置单元 | Microsoft\Windows NT\CurrentVersion |
| 时区设置 | SYSTEM 配置单元 | ControlSet00x\Control\TimeZoneInformation |
| 本地账户列表 | SAM 配置单元 | SAM\Domains\Account\Users\Names |
| 最后关机时间 | SYSTEM 配置单元 | ControlSet00x\Control\Windows下的ShutdownTime |
| 网络配置历史 | SOFTWARE 配置单元 | Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles |
ControlSet00x这个x是很多人第一次做取证会疑惑的点。系统里通常有ControlSet001、ControlSet002,而CurrentControlSet只是个指向当前生效控制集的符号链接。判断哪个是“当前”要看SYSTEM\Select下的Current值。如果直接把CurrentControlSet当成实体键去解析,某些工具会给你空结果,因为它在离线配置单元里不是真实存在的键。
账户创建时间那道题还有个隐藏坑:SAM 里的时间字段是 FILETIME,但有些账户的该字段是0或者异常值,这时候要看旁边的Last Login和Pwd Last Set做交叉判断。当一个字段明显不合理时,不要硬答,去找能互相印证的第二个字段,这是取证里最基本的怀疑精神。
3.2 用户行为痕迹:最近访问、跳转列表、ShellBag
真正拉开差距的是行为痕迹类题目。用户打开过哪个文件、访问过哪个目录、运行过哪个程序,这些东西散落在五六个地方,每个地方只记录一部分,必须拼。
Recent目录下的 LNK 文件记录最近打开过的文档,LNK 里除了目标路径,还有卷序列号、文件大小、MAC 时间——卷序列号这一项经常被用来判断“这个文件是从 U 盘打开的还是本地的”。跳转列表(AutomaticDestinations)记录的是任务栏和开始菜单的访问历史,它的优势是带访问次数和最后访问时间,比 LNK 更完整。ShellBag 记录的是资源管理器里浏览过的文件夹,包括那些从没打开过文件、只是点进去看了一眼的目录。
我的实操顺序是:先解析 LNK 拿到“打开了什么”,再解析跳转列表拿到“打开了多少次”,最后用 ShellBag 补“还去过哪些目录”。三者对不上的时候,以 LNK 和跳转列表为准,因为 ShellBag 的写入时机比较特殊,有时候关闭窗口才落盘,进程被强杀就会丢记录。
实操心得:LNK 解析出来一堆路径别急着看,先按卷序列号分组。同一个卷序列号下的路径,大概率是同一个存储设备,这样你能快速把“本地行为”和“移动介质行为”分开,很多题的答案就在这个分组里。
3.3 应用程序痕迹与 USB 设备溯源
USB 设备题几乎每届都有,核心就三个键:SYSTEM下的Enum\USBSTOR给出设备型号和序列号,Enum\USB给出设备类 GUID 和首次接入信息,SOFTWARE下的Windows Portable Devices或者MountedDevices给出盘符分配。串起来就是一条完整链条:什么设备、什么序列号、什么时候插的、分到哪个盘符、里面存了什么。
这里有个细节值得说:USBSTOR下的子键名本身包含了设备型号和序列号,格式一般是Disk&Ven_厂商&Prod_型号&Rev_版本,再下一级才是序列号。序列号如果是0000000000这类全零值,说明设备没有上报真实序列号,这时候要靠ParentIdPrefix和ContainerID来区分不同设备。两个同型号的 U 盘,序列号都是零,你怎么区分?答案是看ContainerID,这个 GUID 是系统为每个物理设备生成的,同一设备在不同键下保持一致。
应用程序痕迹方面,浏览器历史、下载记录、书签、Cookie、缓存的表单数据,是最常被问的。浏览器数据库是 SQLite,直接用 SQL 查比用工具点界面快。要注意的是时间字段的存储格式:有的浏览器存的是自 1601 年起的微秒数,有的是自 1970 年起的秒数,还有的做了时区处理。查之前先看表结构,别默认。
-- 典型的浏览历史查询,注意先确认时间字段单位 SELECT url, title, visit_count, last_visit_time FROM urls ORDER BY last_visit_time DESC LIMIT 50;3.4 反取证痕迹识别
这一块是进阶内容,也是区分“会用工具”和“懂取证”的地方。常见的反取证手法包括:删除文件、清空回收站、使用文件擦除工具、修改文件时间戳、清除日志、使用便携版程序不留安装痕迹。对应的痕迹点是:$Recycle.Bin里的$I文件记录原始路径和删除时间;Prefetch目录里的执行记录能证明程序跑过,即使程序本体已经被删;AmCache记录程序的首次出现时间和文件哈希;UserAssist用 ROT13 编码记录 GUI 程序的运行次数和最后运行时间。
时间戳篡改的识别有个很好用的判据:NTFS 的$STANDARD_INFORMATION和$FILE_NAME两套时间戳应该基本一致,如果前者被改而后者没被改(或者反过来),就说明有工具动过手脚。这个判据在比赛里出现过不止一次。
还有一类是“删了但没删干净”。文件被删除后,只要簇没被覆盖,内容还在;$MFT里的记录被标记为空闲但没被复用,元数据还在;缩略图缓存、Thumbs.db、Office 的自动恢复文件,都可能残留内容。我遇到过一次,某个“已删除”的文档,本体找不到,但在 Office 的最近文档缓存里留下了标题和路径,直接锁定了答案。
4. 内存镜像分析:进程、网络连接与凭据
4.1 镜像信息与操作系统版本确认
内存镜像到手,第一步不是急着列进程,而是确认它是什么系统的内存。用分析框架的镜像信息功能跑一遍,输出里会有候选的配置文件列表,通常第一个命中的就是最可能的。这一步跑错配置文件,后面所有插件都会返回空或者乱码,很多人以为镜像坏了,其实是配置选错了。
我一般会做双重确认:先用框架给出的建议配置,再手动看一下版本字符串是不是和磁盘镜像里的系统版本对得上。如果磁盘镜像和内存镜像来自同一台机器,这两个版本号必须一致;对不上就说明其中一份检材被掉包过,或者题目故意给了干扰项。这种情况在资格赛里出现过,答案往往就藏在“不一致”这个事实本身里。
还要记录镜像的总大小和采集时间。总大小对判断“是否是完整物理内存”有用——如果镜像明显小于物理内存容量,可能是休眠文件转换来的,也可能是只采集了部分区域。采集时间则用来把内存里的证据和磁盘、日志的证据排在同一条时间轴上。
4.2 进程树与恶意进程定位
进程分析的核心不是“列出所有进程”,而是找异常。判断异常我有几个固定维度:父进程关系不合理(比如某个系统服务进程的父进程是个浏览器)、进程路径在临时目录或用户目录、进程名伪装成系统进程但大小写或拼写有细微差别、进程的创建时间和系统启动时间接近但路径很怪、同一个可执行文件有多个实例且路径不同。
进程树视图能一眼看出父子关系,但要注意一个坑:父进程可能已经退出,这时父进程 ID 会被复用,看起来就像“某个正常进程启动了这个可疑进程”。判断这种情况要看进程的创建时间——如果子进程的创建时间早于父进程,那这个父子关系就是假的,是 PID 复用造成的假象。
除了进程本身,还要看进程加载的模块和打开的文件句柄。有些恶意程序本体是干净的,真正干活的代码在注入的内存段里,或者在临时目录释放的动态库中。句柄视图还能告诉你进程正在读写哪个文件,这在“某文件被谁加密了”这类题里特别有用。
4.3 内存中的网络连接与命令行历史
网络连接视图给出的是采集那一刻的连接状态,包括本地地址端口、远端地址端口、所属进程。它的价值在于能把“进程”和“外部通信”直接绑定。很多题的答案就是“该进程连接的远端地址是什么”,直接在表里查即可。但要注意,连接可能已经关闭,残留的套接字结构还在,这时候状态会显示为已关闭或监听,需要结合进程是否还活着判断。
命令行历史是另一块富矿。内存里常常能找到控制台窗口的输入缓冲区,里面保留了用户敲过的命令原文。我遇到过一道题,问“攻击者执行的第一条命令是什么”,磁盘上没有命令历史文件(被删了),但内存里那段缓冲区还在,直接给出了答案。类似地,环境变量块、剪贴板内容、窗口标题,都可能藏着关键信息。
注意:内存里的字符串检索要配合上下文看。直接全量搜关键词会命中几千条,正确做法是先定位可疑进程,再针对该进程的内存段做字符串提取,命中率会高得多。
4.4 从内存里捞文件与密码
内存里能捞出来的东西比想象中多:正在编辑但没保存的文档内容、图片缓存、压缩包的明文片段、浏览器进程里的表单数据、甚至某些程序的配置文件全文。提取的思路是先按文件头尾特征扫描,再按进程内存段定向提取,最后人工筛。
密码类题目也是常客。内存里可能残留着登录凭据的哈希、明文口令、密钥材料。有些工具的转储功能能直接从内存里把本地账户哈希拉出来,这比从磁盘的 SAM 里提取再破解快得多——因为内存里可能存的是明文或者可逆加密的形式。同一道题,磁盘路线要跑字典半小时,内存路线三分钟出结果,这就是选择分析路径的价值。
5. 手机与应用程序取证
5.1 检材形态判断与解析工具选择
手机侧的检材形式比较杂:可能是完整文件系统镜像、可能是逻辑备份包、可能是某个应用的数据库导出、也可能只是一批截图和文档。先判断形态,再选工具,这个顺序不能反。拿到一个目录先看里面有什么:有data/data结构就是应用数据目录,有manifest和db就是备份包,有media和shared_prefs就是完整提取。
解析工具的选择上,我倾向于能用 SQL 就不用图形工具。图形工具胜在直观,但导出的字段经常被截断或者做了二次处理,遇到需要精确值的填空题就容易出错。直接打开数据库看原表,字段名、数据类型、存储格式一目了然。尤其是一些国产应用的数据库,字段命名很有特色,工具不认识就显示为空,但你自己看表结构反而能猜出来。
5.2 聊天记录与数据库结构
聊天类应用的数据库结构大同小异:一张消息表存内容和时间,一张会话表存会话信息,一张联系人表存账号和昵称,中间用会话 ID 或者账号关联。真正的难点在于内容的存储格式——文本消息可能是明文,也可能是先压缩再加密;图片视频存的是路径或者缩略图的二进制;语音存的是文件路径加时长。
我的处理套路是先定位消息表,看时间字段和内容字段的类型。如果内容字段是 BLOB 且长度固定,多半是加密的;如果长度浮动且有明显可读片段,多半是明文或者简单编码。明文的情况下直接查,加密的情况下要去找同目录下的密钥文件或者配置表——很多应用会把密钥存在shared_prefs里的 XML 中,虽然做了简单混淆,但格式特征很明显。
群聊和私聊的区分也要注意。群消息的发送者字段存的是成员 ID 而不是账号,需要再去成员表里映射一次。如果不做这个映射,题目问“某句话是谁说的”,你就会填成群 ID 而不是具体的人,这种错误特别隐蔽。
5.3 位置与多媒体元数据
位置信息的来源有好几处:照片的 EXIF GPS 字段、应用的位置缓存数据库、系统级的定位服务记录。EXIF 最直接,用元数据读取工具一条命令就能出经纬度、拍摄时间、设备型号。但要注意,很多社交应用在转发图片时会剥离 EXIF,所以“某张图有没有位置信息”这件事本身可能就是考点。
应用的位置缓存表通常存的是经纬度加时间戳,有时候还有逆地理编码后的地址字符串。地址字符串是现成的答案,直接用;没有的话就得拿经纬度去换算街道,这种题一般会给一个参考范围让你选,不会要求精确到门牌。
多媒体元数据还包括视频的时长、分辨率、编码格式,音频的比特率和采样率。这些字段在“判断某文件是否被二次编辑过”的题里很有用——原始拍摄的视频和剪辑后重新导出的视频,编码参数通常不一样,对比一下就能看出端倪。
6. 网络流量与日志分析
6.1 协议分布统计与可疑会话定位
流量包分析的第一步永远是统计:协议分层统计、会话统计、端点统计。三个表一看,哪个 IP 的流量异常大、哪个端口的会话数异常多、哪种协议占的比例不合理,基本就有方向了。这一步花不了两分钟,但能省掉后面半小时的盲目翻包。
我习惯关注这几个信号:大量重复的短连接(可能是扫描或者爆破)、单一会话传输体积远超其他(可能是数据外传)、非标准端口上跑着标准协议的明文特征(可能是隧道)、DNS 查询里出现超长随机字符串(可能是隐蔽信道)。这几个信号不保证一定是恶意的,但值得优先深挖。
定位到可疑会话后,右键追踪该会话的完整数据流,看请求和响应的原文。明文协议直接读,加密协议只能看握手信息、证书、SNI 和流量特征。证书里的字段经常是答案——颁发者、有效期、域名,这些信息在加密流量里是明文可见的。
6.2 从流量中还原文件
文件还原的关键是识别传输方式。明文传输的文件,直接从会话数据流里按文件头尾切出来就行,这是最省事的。压缩包、图片、文档、可执行文件,各有各的文件头特征,按特征扫一遍,把命中片段导出来再校验完整性。
走标准文件传输协议的,用工具的导出功能更稳,因为它会帮你处理分片和重组。走应用层协议的,就得看具体的封装格式:有的会在文件前后加自定义头,有的会把文件切成小块分别传输,有的做了编码转换。这种情况下我的做法是先导出一段样本看结构,把头部字节和尾部字节记下来,再写脚本批量处理。
# 从会话数据流中按特征提取文件,先看结构再批量处理 tshark -r capture.pcap -q -z follow,tcp,raw,3 | head -50提示:还原出来的文件一定要算哈希并和题目给的参考值比对。很多题的答案就是文件哈希,切多一个字节、少一个字节都对不上,这时候要回头检查文件头的起始位置。
6.3 Web 日志与时间线还原
日志类题目的核心是把非结构化的文本变成结构化的表。访问日志的格式一般是固定的字段顺序:来源地址、时间、请求方法、路径、状态码、响应大小、客户端标识。用一条命令就能切出来,再按状态码或者路径关键字过滤。
排查思路通常是三步:先看有没有异常的状态码集中出现(大量 404 可能是目录探测,大量 500 可能是漏洞利用尝试),再看请求路径里有没有明显的注入特征或者路径穿越特征,最后把可疑请求的时间点排出来,和磁盘、内存里的证据对照。时间线一旦对齐,整个事件序列就清楚了:几点几分发起请求、几点几分服务器上有文件被写入、几点几分用户账户被创建。
日志里的时间字段一定要注意时区标注。有的日志用本地时间,有的用 UTC,有的带偏移量。我一般先把所有日志时间统一转成 UTC,再和镜像里的文件时间比对,如果对不上就说明时区理解错了,回头重新确认。
7. 常见问题与排查技巧实录
7.1 高频踩坑速查表
下面这张表是我自己复盘出来的,几乎每一条都在赛场上真实遇到过。
| 现象 | 常见原因 | 处理办法 |
|---|---|---|
| 镜像挂载后目录为空 | 分区偏移算错,扇区未乘字节数 | 用分区表重新计算 offset |
| 注册表解析结果为空 | CurrentControlSet在离线单元中非实体键 | 改用Select\Current指向的实体控制集 |
| 内存插件全部报错 | 配置文件选错,版本不匹配 | 先跑镜像信息识别,手动核对版本字符串 |
| 时间答案差 8 小时 | 未做本地时间与 UTC 换算 | 统一用 UTC 记录,最后一步转换 |
| 数据库打开后内容乱码 | 加密或压缩存储,或未处理 WAL 文件 | 保留副本,连同 WAL、SHM 一起复制 |
| 文件哈希对不上 | 起止位置切错,或多切了协议头 | 按文件头魔数重新定位起点 |
| 两个同型号设备无法区分 | 序列号均为零值 | 改用ContainerID或ParentIdPrefix |
| 进程父子关系诡异 | 父进程已退出,PID 被复用 | 比较进程创建时间,剔除假关系 |
这张表里最容易被忽略的是数据库的 WAL 文件。很多移动应用和浏览器用的是 WAL 模式,最新的写入可能还在-wal文件里没有合并进主库。只复制主库文件去分析,你会看到“最后一条记录”比实际早很多,题目问最新一条消息就必然答错。正确做法是把db、db-wal、db-shm三个文件一起复制,用支持 WAL 的方式打开,或者先做一次 checkpoint。
7.2 答案提交前的自检清单
个人赛没有队友帮你复核,所以我把自检做成了固定动作,每道题填完答案前过一遍:
- 单位对不对:时间戳是秒还是毫秒,文件大小是字节还是 KB,哈希是全 32 位还是前 8 位。
- 格式对不对:题目要的是文件名还是完整路径,是账号还是昵称,是 IP 还是域名。
- 时区对不对:本地时间和 UTC 有没有混用。
- 来源唯一吗:这个结论是不是只有一个数据源支持?如果只有一个,再找第二个印证一下。
- 有没有更早/更晚的:问“第一次”和“最后一次”的题,排序方向千万别搞反。
还有一个纯经验的东西:凡是需要手算的题,算两遍。第一遍用工具,第二遍用另一种方式验算。比如时间戳换算,工具出一遍,脚本再出一遍,两个结果一致才填。听起来很笨,但填空题错一个字符就是零分,多花三十秒比丢一分划算得多。
最后说点个人感受。这届资格赛个人赛给我的最大体会是,工具熟练度决定下限,分析思路决定上限。工具用得快,能把该拿的分都拿到;但真正难的那几道题,考的是你会不会在信息不完整的情况下做合理推断、会不会主动去找交叉验证的证据、会不会在一条路走不通时果断换路。我这次在内存那一块走了弯路,硬啃了二十分钟才发现配置文件选错,换过来之后五分钟就出了三道题。这个教训比任何一道题的答案都值钱:当所有插件都返回空的时候,先怀疑自己的前提,而不是怀疑检材。下次再遇到类似的检材,我的第一动作会是先跑镜像信息识别,把版本、架构、采集时间确认清楚,再往下走。