FMCTF 2025

FMCTF 2025
Aristore比赛地址:FMCTF - Nowruz 1404
比赛时间:15 Mar 2025 21:30 CST - 16 Mar 2025 21:30 CST
复现的题目用🔁标注
OSINT
A Revengefu Accident
Challenge
OSINT/A Revengefu Accident
Inalov
We’re searching for a fatal aviation accident that occurred before 1990. According to the accident report, a passenger carrying a S&W 29 revolver caused the disaster by shooting at the cabin crew. We need the Accident Number to revisit and revise the investigation.
The aircraft involved in the accident is notable for its unique design:
It features four small engines mounted under high wings, a distinctive T-tail configuration, and a noticeably drooped nose profile. Its compact fuselage belies its four-engine configuration, and it’s equipped with a distinctive airbrake system that deploys from the tail cone area. This British-made regional jet was specifically designed for operations at noise-sensitive airports
Flag example:
FMCTF{ABC01DE234}
ALL UPPER CASE
Solution
由于我不懂飞机,所以直接问了通义大模型,提示词如下
1 | 我需要你帮我找一个飞机,描述如下(用中文回答) |
得到如下回答
1 | 根据您提供的详细描述,这架飞机极有可能是 **BAe 146**(英国航太146型),或其后续改进型号 **Avro RJ** 系列。以下是关键特征的匹配分析: |
根据题目信息这个飞机生产在 1990 年以前,所以这个飞机一定是 BAe 146
然后在维基百科找到发生过的事故 British Aerospace 146 - Wikipedia,和题目描述完全吻合
在该段引用的 82 号文件 Accident British Aerospace BAe-146-200 N350PS, Monday 7 December 1987 中找到所需编号 DCA88MA008
1 | FMCTF{DCA88MA008} |
Im hungry
Challenge
OSINT/Im hungry
Inalov
I’m hungry af. Can you find this McDonald’s phone number for me ASAP?
You might need to use this or this
Flag example:
FMCTF{+15554443388}
附件如下
Solution
这张全景照片显示了一个有麦当劳标志的交叉路口,周围有一些商业建筑和住宅区。根据这些特征,这个地点可能位于澳大利亚塔斯马尼亚州的伯尼 (Burnie)。具体来说,这个交叉路口可能是伯尼市中心附近的一个主要道路交汇处。以下是一些支持这一判断的细节:
1. 麦当劳标志:在伯尼市内有一个麦当劳餐厅。
2. 周围的建筑风格和环境:与伯尼市的商业区和住宅区相符。
3. 路标和交通信号灯的布局:与伯尼市内的主要道路布局相似。
在谷歌地图上找到了这个路口 National Highway 1 - Google 地圖,和题目提供的图片完全吻合
接下来只要提交附近这家麦当劳的电话号码就行
1 | FMCTF{+61364319955} |
🔁Somewhere Near The Bay Part 1
Challenge
OSINT/Somewhere Near The Bay Part1
Inalov
I’ve got a panorama picture of a landscape that I downloaded from Google Maps. I bet you can’t find the exact location.
What’s the location’s What3Words? (don’t put
\\\
inside the flag)You might need to use this or this
Flag example:
FMCTF{thunderous.satisfy.likewise}
Solution
这张照片来自美国缅因州阿卡迪亚国家公园(Acadia National Park)的海岸线,具体位置是公园内的 “Thunder Hole”。
以下是一些支持这一判断的细节:
- 岩石海岸线 :从照片中可以看到典型的岩石海岸地貌,这种地貌在 Acadia National Park 的海岸区域非常常见。
- 海浪冲击 :照片中似乎有海浪拍打岩石的迹象,这与 Thunder Hole 的著名特征一致。Thunder Hole 是一个天然的岩石洞穴,当海浪涌入时会发出巨大的声响。
我找到了和附件图中一模一样的地方(就连这块大石头的纹路都一模一样)
但是把周围的格试遍了都是错的(摊手)
然后就放弃了(真可惜)
下面是复现:
原来这张全景照片的定位是不准确的😇
因此答案很显然就是 hedge.preset.shape 了😢
Somewhere Near The Bay Part 2
Challenge
OSINT/Somewhere Near The Bay Part2
Inalov
I didn’t think you could do it and honestly, I’m surprised!
That was pure luck, don’t you think? Well, if you want to prove otherwise, you can do something crazy.
Can you tell me the legal name of the company that owns the bus in the picture?
Flag example:
FMCTF{MIDWEST_RENEWABLE_ENERGY_SOLUTIONS_LLC}
ALL UPPER CASE
Solution
图中的公交车具有很明显的特征,用谷歌搜图一搜就搜到了
打开搜索结果排名第一的这个链接 Bar Harbor, Maine’s premier walking map and restaurant guide | Port O’ Call Magazine
找到图中这则广告
根据这则广告找到公交车的官网 Acadia National Park Tours | Bar Harbor, Maine
由此我们也知道了这家公司叫做 Acadia National Park Tours
接下来到缅因州政府官网,在这里可以搜索公司记录,搜索 Acadia National Park Tours
找到了这条记录
找到公交人公司的所有人是 NATIONAL PARK TOURS AND TRANSPORT, INC.
1 | FMCTF{NATIONAL_PARK_TOURS_AND_TRANSPORT_INC} |
🔁 Anon Skiddie Part 1
Challenge
OSINT/Anon Skiddie Part1
Inalov
We have a new team member who is still in training. The other day, he said he is trying to learn Git in order to contribute to our writeup website but he is still struggling with it.
Let’s hope he hasn’t exposed his email address.
Flag example:
FMCTF{s3an.4lpha3d0n@outlook.com}
Solution
在他们的 wp 的仓库找到这条 pr 的记录 Pull requests · FlagMotori/writeups
查看这条 commit7H15 15 my F1r57 k0mm17 · FlagMotori/writeups@83655a2
在链接后面加上.patch
https://github.com/FlagMotori/writeups/commit/83655a201eedec8764463755c5c64bd5949a5989.patch
然后就找到题目说的泄露的邮箱了
1 | FMCTF{h4ck3r.g0odr4tm4nd@gmail.com} |
🔁 Anon Skiddie Part 2
Challenge
OSINT/Anon Skiddie Part2
Inalov
This dude is really ambitious. He literally begged us to let him attend our post-event meeting and we said yes.
Since he’s not good at time management, our organizer sent him the event’s
.ics
file and asked him to import it to his calendar. What can go wrong?Flag example:
FMCTF{1_541d_d0n7_0p3n_17}
Solution
将 Part1 得到的邮箱输入在左侧的输入框中
在这条日程中发现附件 1PDw-S4ZXQbGuKBNayEz6XqtiA6tl1lcOBT4nI1IFaac
粘贴到谷歌文档的后面(这招有点像某些博主分享度盘资源的操作啊😂),得到了这个链接 Flag - Google 文档,内容如下
1 | Rk1DVEZ7TTRZODNfMU1fbjA3XzdINDdfNG4wTnltMFU1fQ== |
显然是 Base64 解码
1 | FMCTF{M4Y83_1M_n07_7H47_4n0Nym0U5} |
Misc
Github
Challenge
misc/Github
SafaSafari
Solution
访问这个仓库,看到仓库里有一个 flag.txt
,打开发现是 placeholder for flag
因此回到主页,在 Activity 查看修改记录
在此处查看修改的信息
1 | FMCTF{bRu7E_FOrc1N9_917hUB_15_fUn!!} |
🔁 Traffic signs
Challenge
misc/Traffic signs
HIGHer
Traffic signs alway guide us to the correct way
附件如下
Solution
一眼看出是 LSB 隐写(Light Stone Bridge),可是到了这就没下文了,用 StegSolve 找了半天都没找到😢
下面是复现:
- 首先要想到是 LSB 隐写
- 然后 U 型转弯联想到要逆序遍历像素(从最后一个像素到第一个像素)
- 标志是绿色的联想到 RGB 图像中的绿色通道
代码如下
1 | from PIL import Image |
运行得到一下结果
1 | Embedding secret messages in the least significant bit (LSB) of |
1 | FMCTF{Tr4ff1c_5i9ns_Gu1de_7h3_5teg0_Hunt3rs} |
🔁 ecal
Challenge
misc/ecal
carrot303
let’s eval the calculator
plaintext
1 nc ecal.fmc.tf 5000
附件如下
1 | FROM python:3.12 |
1 | # jail.py |
Solution
这题考查的是 Python 沙箱逃逸
代码审计
我们先从源码入手,分析其功能和潜在漏洞。
主要功能
程序实现了一个简单的计算器,用户可以输入两个数字和一个操作符(
+
,-
,*
,/
),程序会通过eval
动态执行表达式并返回结果。程序对输入的表达式进行了沙箱限制:
替换了
__builtins__.__import__
函数为secure_importer
,禁止导入黑名单中的模块(os
,subprocess
,os
,posix
,subprocess
,shutil
,pickle
,marshal
,csv
,pdb
,tty
,pty
)。对
eval
的上下文进行了严格限制,传入了空的__builtins__
和globals
字典,防止直接访问内置函数或全局变量。使用
isnumber
函数确保计算结果是一个数字类型(int
或float
)。
潜在漏洞
eval
的上下文限制不完全 :虽然__builtins__
被清空,但仍然可以通过对象的属性访问绕过限制。例如,Python 中的对象都可以通过__class__
访问其类,进而通过类的继承链(__mro__
)找到其他类或方法。未对输入进行严格的类型检查 :用户输入的内容被直接拼接到表达式中,可能导致意外的行为。
黑名单过滤不够严格 :即使禁止了某些模块的导入,仍可能通过其他方式访问系统资源。
绕过沙箱限制
- 获取基础对象 :
- 在受限环境中,我们无法直接访问
__builtins__
或全局变量,但可以通过表达式(1).__class__
获取int
类型的类对象。 - 通过
int.__mro__
可以访问继承链,找到object
类。 - 从
object
类的子类列表中,可以找到一些有用的类,例如_wrap_close
(属于io
模块)。
- 在受限环境中,我们无法直接访问
- 访问内置函数 :
- 找到
_wrap_close
类后,可以通过其__init__
方法访问__builtins__
,从而恢复内置函数(如open
、getattr
等)。
- 找到
- 读取文件内容 :
- 利用恢复的
open
函数打开flag.txt
文件,并逐字符读取内容。 - 将字符转换为数字(通过
ord
或字节编码),并通过表达式返回给服务器。
- 利用恢复的
- 逐步构造 Flag :
- 每次只读取一个字符,将其转换为数字后返回,逐步拼接出完整的 Flag。
攻击代码如下
1 | from pwn import * |
输出 flag
1 | FMCTF{ev4luat1ng_calc_m5y_b3c0me_d4ng3r0us} |
Crypto
Crypto 是拿 AI 一把梭的
EZ_RSA
Challenge
crypto/EZ RSA
N1k4
Do you know RSA? Let’s do some basic math and find the flag!
附件如下
1 | # EX_RSA.py |
Solution
要解决这个问题,我们需要通过给定的 hint
、n
和 c
来还原出原始的 m
,并最终解码出 flag
。以下是详细的分析和解决方案:
问题分析
已知信息:
:两个素数 和 的和。 :两个素数 和 的乘积。 :加密后的消息 ,其中 。
目标:
- 从
和 计算出 和 。 - 使用
和 计算私钥 。 - 使用
解密 得到 。 - 将
转换回原始的flag
。
- 从
数学基础:
- 利用二次方程求解
和 :
即:
解密过程:
- 计算欧拉函数
。 - 计算私钥
满足 。 - 解密
。
- 计算欧拉函数
Python 实现
1 | from Crypto.Util.number import inverse, long_to_bytes |
代码解释
求解
和 :- 使用二次方程公式:
- 其中
, , 。
- 使用二次方程公式:
计算私钥
:- 使用扩展欧几里得算法计算
,满足 。
- 使用扩展欧几里得算法计算
解密
:- 使用公式
。
- 使用公式
转换为字符串:
- 将解密得到的整数
转换为字节串,并解码为字符串。
- 将解密得到的整数
运行结果
运行上述代码后,输出如下:
1 | Flag: FMCTF{F4K3_FL49} |
总结
通过已知的 (\text {hint} ) 和 ( n ),我们成功还原了 ( p ) 和 ( q ),并利用 RSA 的基本原理解密得到了原始的 flag
。最终答案是:
1 | FMCTF{rSA_34SY_P34SY_L3M0N_5QU33ZY} |
EZ_XOR
Challenge
crypto/EZ XOR
N1k4
Welcome to your first crypto challenge! 🕵️♂️ This one is all about XOR, one of the simplest yet most widely used operations in cryptography. Can you uncover the hidden flag?
附件如下
1 | from pwn import * |
Solution
要解决这个 XOR 加密问题,我们需要利用已知的 FLAG 前缀和密钥循环特性来推导密钥,进而解密密文。
步骤解析:
- 分析加密过程:FLAG 通过 7 字节的密钥循环 XOR 加密,密文为十六进制字符串。
- 提取已知信息:FLAG 通常以
FMCTF{
开头,对应的十六进制为46 4D 43 54 46 7B
。利用这部分明文与密文前 6 字节异或,得到密钥的前 6 字节。 - 推导密钥的第 7 字节:假设 FLAG 的最后一个字符是
}
(0x7D
),通过密文最后一个字节异或得出密钥的第 7 字节。 - 循环密钥解密:使用完整的 7 字节密钥循环解密密文,得到完整明文。
解题代码:
1 | encrypted_hex = "a850d725cb56b0de4fcb40de72a4df56a72ec06cafa75ecb41f51c95" |
最终答案:
1 | FMCTF{X0R_1S_L1K3_MAGIC_0x1} |