Octane的 DASCTF 2022 Nov月赛 Writeup

Octane的 DASCTF 2022 Nov月赛 Writeup

这次比赛可以说是本人参加的第一次团队赛。和三位同为22届天璇的同学组了个四人小队。队友:@Clovershrub @DoubleLii @Cabelis

大部分赛题对于咱目前的水平来说还是比较难的,比赛期间才解出来三道题,最后队伍积分总榜第十三名orz

但即使只有三道题,也水一篇WP吧。

005_001

比赛地址:https://buuoj.cn/match/matches/172 似乎因为这次比赛总体解题数量也不多,没有发布官方WP。

Misc

七仙女下凡

开赛之后直奔Misc。发现一道久违的图片隐写题!

题目附件一共七张图,图片内容都是相同的。因此很容易想到将图片合并叠加。先观察一下图片的属性:

005_002

1.png和2.png的分辨率和大小都是相同的,所以第一步应该是将这两个图片合并。用图片隐写的解密工具stegsolve.jar打开1.png,再用Analyse->Image_Combiner选项与2.png进行合并,观察一下哪种合并方法是合适的。

005_003

其他合并方法看起来都挺抽象的,只有Vertical_Interlace竖直交错这个选项比较靠谱。把该选项合并的结果保存为solved2.bmp,发现这个图片的尺寸和大小都与3.png相同。大概已经能猜到这道题是怎么回事了。

尝试将solved2.bmp与3.png合并,此时又能观察到用Horizontal_Interlace水平交错这个选项生成的图片solved3.bmp与4.png看起来差不多,大小与分辨率也相同。如此交替着用竖直交错与水平交错来合并上两张图片合并的结果和下一张图片,一直叠加到最后一张图片。得到一张大小约为9MB的长图。将这张图用stegsolve打开观察一下:

005_004

在RGB三色的plane0通道下能看到这张图片最上部分有明显痕迹,显然是LSB隐写。以RGB顺序提取LSB,可以从得到的数据中发现ffd8ffe1文件头。

005_005

将这些数据用Save_Bin选项保存为jpg格式的文件,直接将其打开即可得到含有flag的图片:

005_006

DASCTF{PnG_havE_tWo_1nTerLaCE_typES}

需要注意的是,在将图片逐个合并的过程中一定要按照正确的顺序叠加,即先用stegsolve打开前两张图片合并的结果,再在Image_Combiner选项中选择下一张图片进行叠加。叠加的顺序不同,得到的结果也不同。顺序不正确会导致最终得到的flag图出错。

感觉做这道题时的思路还是比较顺利的。题目不算特别难,但PNG竖直和水平交错的套路还是第一次见到。提交flag后发现居然拿到了全场一血orz

EzUSB

解压题目附件,得到一个4GB大小的文件。看题目描述,这个文件似乎是某个U盘的镜像,需要我们来恢复U盘镜像中的数据,找到flag。

首先简单了解一下一个U盘的文件结构是什么样的。

对于MBR(主启动记录)硬盘,其最开始部分,即第一个扇区,存储着MBR,用于记录该块硬盘的基本信息和各分区的所在位置。硬盘的每个分区的最开始部分则存储着DBR,记录了本分区的文件系统结构。

005_007

用WinHex打开文件,选择”将镜像文件转换为硬盘”选项。可以看到起始扇区和分区1可以被识别出来,但分区1的文件系统类型是未知的。

005_008

跳转到分区1查看:

005_009

该分区的开头第一个扇区本应该存储着DBR记录,但却全都是00。而其之后的几个扇区也没有找到看起来像DBR的东西。该DBR很可能是被故意删掉了。

文件最后还有未分区空间,跳转到这里可以发现一段额外的数据,很明显是zip文件头。

005_010

将该段十六进制数据保存为zip文件并打开,可以得到一个名为DBR的文件。直接将DBR文件的全部数据插入到分区1的第一个扇区。

005_011

再保存一下。重新打开,此时Winhex已经能够识别分区1的文件系统了,双击分区1就可以直接看到分区1的文件:

005_012

发现 机密.zip 。flag应该就是在这个文件内。跳转到存储该文件的扇区,仔细观察,这一堆数据最末尾是 4030B405 ,就是zip文件头 504B0304 的倒序。将从扇区开始到 05 的十六进制数据全都倒序过来,就直接能看到flag:

005_013

DASCTF{y0u_Rea11yr3ally_kN0w_th3_DBR!!!}

比赛时已经找到了存储 机密.zip 的扇区。但没有看出来zip是倒序存储的,与第四个flag失之交臂…当时还以为是题目的DBR有问题啊orz

后来写wp的时候又发现,直接用DiskGenius的数据恢复,不用修DBR就可以直接找到 机密.zip 的扇区…

Crypto

eazy_hash

先看题目:

from Crypto.Util.number import bytes_to_long, long_to_bytes
from zlib import crc32
from secret import *
P = 93327214260434303138080906179883696131283277062733597039773430143631378719403851851296505697016458801222349445773245718371527858795457860775687842513513120173676986599209741174960099561600915819416543039173509037555167973076303047419790245327596338909743308199889740594091849756693219926218111062780849456373
def myhash(x):
res = []
end = b""
bytescipher = long_to_bytes(x)
a = bytescipher[:len(bytescipher) % 8]
res.append(a)
res.append(long_to_bytes(crc32(a)))
t = (len(bytescipher) // 8)
bytescipher = bytescipher[len(bytescipher) % 8:]
for i in range(t):
a = bytescipher[i*8:i*8+8]
res.append(a)
res.append(long_to_bytes(crc32(a)))
for i in res:
end += i
res = bytes_to_long(end)
res = (res + (res >> 500)) & 2**(500)-1
return res
def encode(pt):
a=[]
b=[]
a.append(myhash(pt))
for i in range(3):
a.append(myhash(a[i]))
for j in range(4):
secret=(a[0] + a[1] * a[j] + a[2] * a[j] ** 2 + a[3] * a[j] ** 3) % P
b.append([a[j],secret])
return b
pt = bytes_to_long(flag.encode())
FLAG=encode(pt)
print(FLAG[1])

# 输出略

又是一个自制hash函数的题。之前在moectf做过一道ezhash。

首先看看程序输出是什么东西。显然,程序的结果是一个有两个元素的列表。分析encode函数可知,第一个元素是a[1],第二个元素是secret,即是(a[0]+a[1]*a[1]+a[2]*a[1]**2+a[3]*a[1]**3)%P的结果。已知a[1]与P,a[2]是myhash(a[1])的结果,a[3]是myhash(a[2])的结果。并且易知a[0]远小于P,因此可以解出a[0]的值。

a2 = myhash(a1)
a3 = myhash(a2)
a0 = (a1 * a1 + a2 * a1 ** 2 + a3 * a1 ** 3)//P*P+secret-(a1 * a1 + a2 * a1 ** 2 + a3 * a1 ** 3)
print(a0)

# a0 = 2957101726941201632179067084095401321656420466530004630566266527204598229831554134973672777487933790319144163396714765872645685966

a[0]就是flag经过一次myhash运算的结果。直接将a[0]转换为字节,并将结果每隔4个字节取出来8个字节,即可得到flag。

output = b''
for i in range(len(long_to_bytes(a0))//12):
output+=long_to_bytes(a0)[12*i+6:12*i+13]
print(output)

# SCTF{ths_is_th_fe3st_uest1on

因此得到flag:

DASCTF{th1s_is_the_fe3st_quest1on}

Reverse

babyimg

这次比赛最离谱的一道题…题目给了一张图片和一个程序,需要修好程序,用程序解密图片隐藏的信息才能得到flag

本来是给Reverser做的。但程序似乎很难,各种反动调的机制,给Reverse的同学添了不少麻烦。

作为一名Misc手(?),听说reverse题里居然有张图,当然要拿过来看一眼了。

005_014

看起来很图片隐写啊!这样的图片也和几种隐写方法有点像。但既然是逆向题,应该不会用图片隐写的套路吧…

先猜一下是什么隐写。尝试将图片旋转90度,用stegsolve打开,选择StereogramSolver,调整offset为1。

005_015

居然真就直接出flag。给跪了。

orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz

评论