打 CTF 一定要用 Windows!✍️
Writer: W4t3rm310nabc from Hacklz Team
banner 来自 bilibili@Sth_Sunly
小鲸鱼我爱你喵 😍
DeepSeek 得了 MVP!我是躺赢狗!
话说今年 Web 这么难吗,我队两位 Webers 两天竟只做出一题
Web - 签到?
Wells 写了个签到系统,人都到了但人都没到
请协助 Wells 排查一下系统,作为奖励只要你签到上了就可以拿到 flag 了
原始解者与思路口述:SZ_KC
F12 开启开发者工具,会看到 HTML 里一个很长的注释:
1 | // 如果是处理点击坐标的请求 |
根据给出的坐标写模拟点击代码:
1 | // 获取图片元素 |
在控制台输入代码,回车,即可跳转到含有 flag 的页面。
flag 为 flag{c6359246-9276-454f-8404-df974d1ee877}
Reverse - easy re
题目描述:欢迎来到 FCTF,速来拿分!
手速题,基本没有什么加密的地方。
DIE 查一下:

无壳,拖到 IDA 反编译:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
单纯的异或加密。点一下 arr
,转换到 BYTE
类型数组:
1 | unsigned char _arr[100] = { |
写出解密函数(甚至伪代码可以直接用):
1 |
|
得到 flag:FCTF{IT_IS_EASY_WORK!}
Mobile - androidRe1
这道题的最大阻碍之一竟然是环境配置……
本题的工具主要为 jadx 和一个安卓模拟器(如果你有用电脑玩明日方舟的话,应该是已经有一个了)
在模拟器中安装并打开提供的 click.apk,会显示:

我勒个豆!竟然要点 20220422 下才有 flag,还有退出清零!我才不干。
打开 jadx,选择 click.apk,打开 “文本搜索” 窗口(大放大镜图标),搜索 20220422
,得到:

只有一处代码用到了这个数字,点击跳转:
1 | if (this$0.ccccccccc() == 20220422) { |
下面就是我们要的 flag 了(加密后的)。
点击 decrypt
跳转:
1 | public final String decrypt(String str) throws IllegalBlockSizeException, BadPaddingException { |
太长不看,让 DeepSeek 帮忙,发现解密缺少 key0
和 iv0
。搜索一下 key0
,结果 iv0
也出来了:
1 | private static String key0 = "82305002"; |
DeepSeek 生成的解密脚本:
1 | from Crypto.Cipher import DES |
执行后得到 flag:flag{9a2165f588d8cc5e86103e58bdbbd997cef18cc69cab1136a30147e3bbe6fbfd}
Crypto - signin_rsa
机智的你可以成功 signin 吗
作为一名 Re 新手,我自然是不懂 RSA 的(说得好像你解出来了 encrypt 和 Tree 似的)
不过给 DeepSeek 读了发现有戏:
1 | from Crypto.Util.number import long_to_bytes # 安装 pycryptodome |
输出:
1 | Found a = 302132503208700208393770833389777081577, b = 325301786642820377107162010542704820159 |
RkNURntXZWxjMG0zX21ZX1JTQTAxISEhfQ==
是一个明显的 Base64 密文。用 CyberChef 烹一下,得到 flag:FCTF{Welc0m3_mY_RSA01!!!}
Reverse - Tree
本题为赛后复现,比赛过程中未解出。其实很简单,不要被吓到了。
土豆哥表示一把梭~
(作者注:贞德是一把梭 TAT)
DIE 查一下:

无壳 32 位,拖 IDA,跳到主函数:
1 | int sub_411C00() |
如果只用静态分析结果去问 AI,又是二叉树又是 DFS 的,看不懂啦😢
但其实只需要动态调试,在 flag 判断处下断点,然后将密文 GAPNkFl^PJGQJ_YHEEx~d
作为输入,中断时查看 Str1
的值,即可得到 flag 为 FCTF{WeLCOME_TO_FCtf}
为什么?
如果去看 。sub_41127B()
初始化函数,会发现所有编译时数组的数据均为 0!也就是说,程序根本没有构建二叉树。加密算法退化为纯异或的对称加密,本质上和 easy re 相同
官方给的源码中的二叉树编码本身就是对称的。算法主体就是和 easy re 相同的异或加密,只是密钥变成了二叉树的节点值。
由于生成的二叉树固定,因此简单地复用机密函数即可解密。
Reverse - solo
数学中的逻辑游戏 -- 得到的 flag 请加上 FCTF {}
DIE 查一查:

无壳 64 位,拖 IDA:
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
然后下断点动调,看一下 flag
就行。对,就这么简单,因为这个程序不需要你来解这个数独 (sudoku),程序自己已经解好了。extract_flag
也只和已经解出的数独有关。
flag 为:FCTF{I_LK_SDK}
Misc - 溯
Satoru:[嘿,兄弟,听说你卡在这关了?我这儿有个好东西,CTF_ALL_IN_ONE.bat,一键通关,要不要试试?]
Wells 犹豫了一下,但疲惫和求胜心最终战胜了理智。他点击了下载链接。
文件解压后,他双击运行了那个神秘的批处理脚本。屏幕闪烁了一下,命令行窗口飞速滚动,然后 ——
黑屏。
“什么情况?!”Wells 猛地拍了下键盘,但已经晚了。他的电脑突然弹出一堆错误提示,桌面上所有的 CTF 工具包全部被删除,取而代之的是一堆 cmd 弹窗:
“Thanks for the free shell! - Satoru”
他这才意识到 —— 自己被骗了。
愤怒的 Wells 发送了一千封垃圾邮件,誓要爆破 Satoru 的校园邮箱
请你根据数据包取证 Satoru 的恶意批处理脚本,并根据此进一步追踪溯源,发掘两人的交互流程
用 Wireshark(大蓝鲨)打开所给的数据包,然后导出 HTTP 对象(文件 > 导出对象 > HTTP…),查看该分组下的 Hypertext Transfer Protocol 信息,得到 [Full request URI: http://47.120.51.45/files/],通过这个 URI 就可以下载题目所说的 CTF_ALL_IN_ONE.bat
了。
打开这个 bat 文件:
1 | @echo off |
发现这个 bat 会自动 clone 一个 Github 仓库。
这真的是弹出原!神!官网吗,我只看到了一个错版 bilibili 网站,还以为这东西有猫腻呢,然后 WHOIS 一查居然是 2011 年的 ldx(
追踪这个仓库及其所有者。
LetsEnjoyAttack 这个仓库没有什么价值,无论是内容、提交记录还是 Issues 等都干干净净,于是查看所有者的 Github 主页及其他仓库。
在 SatoruDaily0.0 下有两个 Issues,正是我们的解密关键。
首先看 Daily1 - Issue #1,Satoru 给了一张站台图片,并有提示:请 CTFer 找出这趟地铁的线路,这将作为获取 Flag 必不可少的一环,例如(A1)
图片放大后:

可以辨认出线路站点名。通过搜索关键词,得知这是南京地铁 S8 号线。
然后是最终的 Issue #2,给了 Wells 发来的邮件内容:
Dear Friend , Especially for you - this breath-taking
news ! This is a one time mailing there is no need
to request removal if you won’t want any more . This
mail is being sent in compliance with Senate bill 2116
; Title 3 , Section 303 ! This is a ligitimate business
proposal ! Why work for somebody else when you can
become rich inside 96 WEEKS . Have you ever noticed
nearly every commercial on television has a .com on
in it and people love convenience ! Well, now is your
chance to capitalize on this . We will help you decrease
perceived waiting time by 140% and use credit cards
on your website ! The best thing about our system is
that it is absolutely risk free for you ! But don’t
believe us ! Prof Jones of Indiana tried us and says
“I was skeptical but it worked for me” . We assure
you that we operate within all applicable laws . You
will blame yourself forever if you don’t order now
. Sign up a friend and you’ll get a discount of 10%
! Thank-you for your serious consideration of our offer
!
和 flag 提示:
请 CTFer 开动脑筋,将 LittleWells 的密文解开
陪 Satoru 一起感受 Wells 的愤怒也是计划的一部分:)
FLAG 格式FCTF{github账户缩写_地铁线路_垃圾邮件解密缩写}
缩写指仅保留大写字母喵
这份邮件是一种典型的垃圾邮件 (SpamEmail)。通过搜索 “垃圾邮件解密缩写”,我找到了一篇文章 CTF Misc 隐写术原理和工具 - 先知社区,里面恰好有提到基于这类垃圾邮件的加密方式,并有一个加解密网站 spammimic。
用该网站解密邮件,得到明文 HowDareYou
。
综合所有信息,得到 flag:FCTF{SG_S8_HDY}
Reverse - jump
简单的 jump -- 得到的 flag 请加上 FCTF {}
对我来说挺难的(
有两处花指令,需要嗯看汇编把花指令搞掉才能让 IDA 反编译出两个加密函数。
我要采一朵花,送给 REer
REer、REer 你看有花~🤓
函数认完了没有😡
啊啊啊啊啊啊,我只是想让你看看这花很好看而已啊😭
先用 DIE 查一下

无壳 32 位,拖进 IDA:
1 | int __cdecl main_0(int argc, const char **argv, const char **envp) |
主要是两个 flag 校验函数 sub_411361
和 sub_4110BE
。
但是,sub_411361
:
1 | // attributes: thunk |
sub_4110BE
:
1 | // attributes: thunk |
均出现 JUMPOUT
,说明有脏东西干扰了 IDA 的识别,此时必须从汇编入手,让 IDA 能够识别出正常函数。
先分析 sub_411361
。跳转到 0x4117E0
地址:

旁边的地址都是标红的,说明 IDA 无法判断函数的起始位置,需要我们来指定。
loc_41180A
调用的内存地址在 32 位机器上根本无法使用。对 loc_41180A
按 D
键将其强行视为数据而非代码(也可以直接 nop
掉),然后选择 loc_4117E0
到 loc_411803
这一段按 P
键确定反编译函数范围。

对 sub_4117E0
按 F5
反编译即可得到赏心悦目的伪代码:
1 | BOOL __cdecl sub_4117E0(char *Str1, int a2) |
(复现得到的伪代码比我比赛时瞎搞出来的伪代码质量高了不知道有多少……)
查看 Str2
,这是第一部分的 flag 密文:Vq} ht`u
对 sub_4110BE
如法炮制

得到:
1 | BOOL __cdecl sub_411930(char *Str) |
查看 aRpR1muj2
,这是 flag 的第二部分密文:rp_r1muj2_
接下来就可以拿着代码去问 AI 了。
flag 为:FCTF {Op} im`l_2jum1r_pr}
如果使用 AI,请务必让它正向验证,尤其是 sub_4117E0
。在我的复现过程中,虽然伪代码的质量更高,但 DeepSeek 给出的答案却是错误的。
也可以通过动态调试,用任意例子验证并修正算法,在比赛过程中 DeepSeek 有要求这一点。由于复现的伪代码比较完整,它没有要求动调验证。