
2024年6月-7月DASCTF做题与复现

2024.6 DASCTF x HDCTF
谐乐大典
本想binwalk一下,结果发现文件名有问题,放在sublimetext里查看,是零宽字符
PASS=ROBIN
得到了一个密码
回到原本binwalk的思路,发现了图片,binwalk提取不出来可以用foremost,但是以这种思路提取封面啥都发现不了,回到flac文件中,所有的信息都会在文件的二进制里。
- 在010中运行flac模版,查看metadata,发现大多是jpg图片,可以分别在每个部分的
FF D8
处运行jpg模版,最终发现METADATA_BLOCKS[4]
数据块jpg后存在冗余数据,且开头为9E 97 BA 2A
,是oursecret的加密特征,结合拿到的PASSROBIN
解密 - 把这个数据块提取出来
- oursecret解密,得到
MXCD.png
- 放大图片后可以看见很多很明显的更改后的像素点,并且间隔大概为宽14,高8,但也不一定有的宽间隔是13,有的高间隔是9,所以不能利用间隔提取,而应该采用相似像素(近邻法)提取,这里参考大佬的写法。官方WP使用的是ps自带的近邻法提取,我懒得装PS了
1 | from itertools import product |
Key Point in this code:
近邻法图片缩放
Width range and height range:根据间隔大概算出来的尺寸。这一步是在猜测需要提取出来的图片的大小
利用近邻法,生成不同尺寸的图像,爆破得到400x376
丢个AI对于这个算法选取像素的解释:
1 | 当使用 Image.NEAREST 方法缩小图像时,选取像素的过程基本原理相同,但会出现一些特殊情况。让我详细解释缩小图像时的像素选取过程: |
- 这个码Google搜索一下,结合图片名称
MXCD.png
,得到Maxicode - 找个在线网站扫了
1 | DASCTF{57aca8f8-5d8d-04ef-8061-609a0f09fa44} |
2024.07 DASCTF 2024暑期挑战赛
png_master
zsteg
查看,发现了末尾存在额外数据,一眼base64
- Base64解码得到第一段:
flag1:DASCTF{2fd9e9ff-e27
but the understanding of png is just beginning 估计有多个png隐写的考点
- stegsolve看一下lsb隐写,发现Alpha通道,plane0-7开头都不相同,存在隐写,把数据提取出来
- stegsolve-Analyse-DataExtract,拿到第二个部分:
d-5405-c5f5-
- pngcheck或者010editor运行模版可以看出有一个IDAT块的异常,未填满就出现了下一个3394长度的IDAT块
- 打开010看一下58674的块和3394的块,发现58674是正常的,而3394的块像是硬加上去的块,而且头尾填充了这些看似无意义的重复数据
提取数据后需要添加png头和尾,需要爆破宽高,但这里crc也是未知的,因此不是根据crc爆破
==修复宽高的方法:==
- CRC正确,宽高数据错误,可以使用CRC爆破方法
- CRC错误,宽高数据错误
- 宽高一把梭(实现方式未知)
- 把png转成data文件,用GIMP分析正确宽高
Misc_PNG高宽详解_png图片宽高一把梭-CSDN博客
博客中的转data脚本有点小问题,read后要加(),且zlib头可以去掉后两个字节,正确的脚本我会在下述中放出。
GIMP分析宽高之前,需要将png去头去尾,对中间的zlib数据解压
1 | import re,os |
- 得到的
flag1.data
文件,放进GIMP中,我们的目的是得到正确的宽,高相对宽而言没有那么重要
于是我们会发现,当宽为500,此时这部分数据看起来最集中,因此500很有可能是正确的宽,为了对比,放出宽为501和499时的图像,可以自己变动宽高查看,500时很明显像素最集中
501:
499:
在010中把宽改成500,高可以随意点,不改也行,mac用户可以把修改宽高后的crc修改一下(运行一下模版,会在结果中告诉你正确的crc值),防止图像crc校验无法打开。
==记得修改colortype,这个图像从GIMP中可以看出是RGB,而不是RGBA,因此
0806000000
要把06改成02==得到最后一段flag:
a19131f86216}
1 | DASCTF{2fd9e9ff-e27d-5405-c5f5-a19131f86126} |
这道题还是学到了很多的,看wp,宽高一把梭真就一把梭了,除此之外,发现还有大佬是直接算出来的:DASCTF2024暑期挑战赛 | mumuzi的blog (mumuzi7179.github.io)
太牛了
EZ_zip
- 题目附件zip直接解压会出错,用010打开查看,发现里面的320应该也是个zip,但是由于
Filenamelength
被设置为03
,因此只能读到320
,正确的文件名是320.zip
,即长度为7,因此修改0A 00 03 00
为0A 00 07 00
- 提取320.zip,查看发现是加密的,里面有个319.zip,010查看发现注释是:
just a byte
,猜测密码就是一个byte,写脚本爆破了第一个密码为\x11
,发现319里面是318.zip,猜测要一直爆破,所以加了一个while循环,一直提取然后爆破,加密算法使用的不是传统加密,只使用Zipfile会报错,因此要使用pyzipper,pyzipper支持AES
1 | import pyzipper |
- 到最后一层由于找不到zip会报错自动退出,每爆破出都会打印密码,最后提取的文件是
AES-ECB.txt
1 | 64ZpNmbv2Hg4Jj9bH8Kv6D3OBliD9hgyI3vZWfMDJs2TcEwVnBmH/zkBtPBE3g8e |
密文看起来应该是base64编码,key应该就在爆破的密码中
- 查看爆破的密码发现规律,查找第一个爆破出的byte,发现存在10个,后面的byte也是出现10次,而且是循环出现。一共有320个zip,所以有32个byte按顺序循环出现了10次,而32byte长度的key也是AES-256的key长度
1 | #先简单处理一下数据,删除换行符得到一组bytes |
- 不难想到,解压是倒序解压的即从320->1,所以得到的bytes应该也要倒序才是正确的key,再用python处理一下得到hex
1 | # reversed内置函数直接倒叙,bytes转换类型为bytes,bytes.hex()可以直接得到hex |
- cyberchef
1 | DASCTF{514755c6-8280-463c-8378-a29702fc88df} |
ServerMeM
- 题目描述:公司的服务器遭受了黑客的攻击,经过勘察黑客为维持权限留下了后门,我们获取到了服务器的内存文件,请你分析黑客留下的痕迹
这题是一道Linux内存取证,完全没接触过,跟着大佬的wp复现一下,有两种做题方式:
- 常规:通过虚拟机更换题目对应内核,编译dwarf文件,和system.map文件一起打包成profile,导入到
/volatility/plugins/overlays/linux
下(导入后可以通过vol --info
查看),--profile
链接所需符号表,再正常vol分析内存文件即可
以上是vol2的方式,vol3使用Symbols替代了Profile,vol3构造符号表:Linux内存取证总结 - 先知社区 (aliyun.com)
- 除了这种方式,还可以直接手动分析内存文件,这道题由于flag的处理体现在Command中,因此手动分析是一种很快速的方式
常规方式(待复现)
手动分析
- 先strings搜索一下常用文件类型,这里搜索到
tar.gz
,发现有个S3rCr3t.tar.gz
,而且发现了几行关键命令
1 | strings out.lime|grep ".tar.gz" |
F14ggg
应该是flag,flag经过openssl aes256加密输出为S3rCr3t.tar.gz
,而且在命令中发现了cat S3rCr3t.tar.gz
,cat的结果应该在文件中可以找到,接下来我们只需要找到password,以及openssl的版本就可以了
strings out.lime|grep "openssl version" -A 1
-A 1 打印匹配结果之后的一行,成功找到openssl版本
1 | strings out.lime|grep "openssl version" -A 1 |
- 通过搜索命令,在openssl加密时应该会要求输入password,所以password应该会出现在命令后几行,同样的
-A 4
参数grep搜索tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz
命令
1 | strings out.lime|grep "tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz" -A 4 |
得到password:P@ssW0rdddd
- 加密后的密文去010找方便一些,因为有些是不可见字符,搜索
cat S3rCr3t.tar.gz
就能找到,0D 0A
是回车和换行,从0D0A
后复制数据到0D0A
就是密文,而且经典Salted__
开头,可以直接保存为bin文件,我这里通过cyber存成了dat文件,都一样
- 我使用的是macos,brew只支持安装openssl1.1,为了方便,于是我安装了openssl1.1
⚠️需要注意:Openssl1.1将默认摘要从md5修改成了sha256,因此需要额外添加参数-md md5
- 这里还需要关注一个细节:根据命令
tar -czf - F14ggg | openssl enc -e -aes256 -out ./S3rCr3t.tar.gz
可以知道原加密逻辑是先将F14ggg进行tar打包,因此解密的逻辑是输出一个tar.gz文件,然后解压出F14ggg
1 | /usr/local/opt/openssl@1.1/bin/openssl enc -d -aes256 -k P@ssW0rdddd -in ~/Downloads/cipher.dat -out flag.tar.gz -md md5 |
输出到flag.tar.gz
1 | tar -xzvf flag.tar.gz |
- Title: 2024年6月-7月DASCTF做题与复现
- Author: MADISUN
- Created at : 2024-07-26 17:01:01
- Updated at : 2024-08-08 18:54:42
- Link: https://redefine.ohevan.com/2024/07/26/2024年6月-7月DASCTF做题与复现/
- License: This work is licensed under CC BY-NC-SA 4.0.