前言

经过了5个月又15天的漫长等待,数信杯终于迎来了半决赛……

要不是收到了半决赛的邮件提醒,我都快忘了还有这个比赛……

简单和大家分享一下我的WriteUp,望各位师傅轻喷。

注:本篇文章由Markdown转换,布局上可能没那么美观。

数据安全

【信息收集表】

题目内容:请下载附件,并规范填写,发送到文档中所提及的邮箱,获取flag,谢谢。(flag不包含flag{}格式)

解题思路:

真签到题,送分,根据附件要求,撰写好邮件,等待主办方回复flag即可。

签到寄语

题目内容:留下你的寄语~

解题思路:

打开网页随便写点东西,页面返回一个很奇怪的二维码。

这个二维码在前两周很火,刚好有所研究,是一个开源项目,叫libcimbar [https://github.com/sz3/libcimbar],利用二维码可以实现离线传输文件。(出题人有心了~)

利用项目提供的cfc APP(CameraFileCopy [https://github.com/sz3/cfc] )扫码即可得到一个文件,文件内容就是寄语+Flag。

Ezsql

题目内容:realezsql(flag在whatisthis的表里)

解题思路:

用burp sql fuzz:

推测为单引号注入

闭合无果:

加了一个括号成功闭合:

Order by和group by都不能用,直接尝试Union3列:

题目说了flag在whatisthis表里,直接select出来:

ez_sign

题目内容:小明将flag切割为三部分藏在附件当中,运用所学知识将flag找出来,flag格式为flag{uuid}

解题思路:

打开压缩包里面还一个压缩包并且需要密码,使用ARCHPR破解得到密码:123456

解压后有三个文件对应着题目所说的123部分。

Part1的图片打开就有Flag的字符串

Part2是一个数据包,在http的第二个响应包中可以看到Flag的第二部分。

Part3是一个压缩包,但直接打开会无法正常打开,用010Editor查看发现文件头不对,将所有字节与FF异或即可得到正常压缩包,解压后得到Flag的第三部分。

最后将Flag三部分组合起来就是完整的Flag。

数据分析

secret_1

题目内容:小强离开电脑的时候,某人把小强的秘密给偷走了,还把文件修改覆盖了,作案脚本也删了。请帮助小强找到丢失的相关数据。

1.提交加密算法工具当中的flag值。(提交示例:flag{*})

解题思路:

利用Volatility查看cmd历史命令

vol.py -f data.raw --profile=Win7SP1x64 cmdscan

发现有个encode.py的脚本操作了flaggg.png

利用LovelyMem找到这个png,在该文件夹中找到了pyc文件,该题的flag就在其中。

secret_2

题目内容:2.恢复图片中的flag值。(提交示例:flag{*})

第二届数据安全大赛暨首届数信杯·(南部赛区)半决赛 WriteUp

解题思路:

在前一题中得到了一个pyc文件,将其逆向后得到了

def encode(png): flag = 'flag{eba771fd-2b03-418f-b11a-60f1141c99ee}' lens = len(flag) with open(png, 'rb') as f: pic_bytes = f.read() print(len(pic_bytes)) output_bytes = bytearray() for i in range(0, len(pic_bytes)): output_bytes.append(pic_bytes[i] ^ ord(flag[i * 2 % lens])) with open(png, 'wb') as f: f.write(output_bytes)

根据encode函数写一个decode函数进行解密

def decode(png):    flag = 'flag{eba771fd-2b03-418f-b11a-60f1141c99ee}'    lens = len(flag)    with open(png, 'rb') as f:        pic_bytes = f.read()        output_bytes = bytearray()        for i in range(0, len(pic_bytes)):            output_bytes.append(pic_bytes[i] ^ ord(flag[i * 2 % lens]))    with open(png, 'wb') as f:        f.write(output_bytes)

利用Volatility导出被加密的flaggg.png文件

vol.py -f data.raw --profile=Win7SP1x64 filescan | grep 'flaggg.png'

vol.py -f data.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007f3f17b0 -D ./

利用Python脚本解密就得到了原始图片。

secret_3

题目内容:3.提交压缩包当中的flag值。(提交示例:flag{*})

解题思路:

在前一题中得到的图片尾部藏有一个压缩包,提取出来后发现有密码。

使用Volatility获取剪切板数据即可拿到压缩包的密码:finallyfindyou

vol.py -f data.raw --profile=Win7SP1x64 clipboard -v

Ps:此处获取剪切板的命令一定要加-v使用,否则获取不到有用信息。[-v参数会显示详细的调试信息]

history_1

题目内容:浏览器历史数据查找。

1.提交flag中uuid值32位小写md5加密第一位为4的uuid(提交示例:9c26d7a6-ea44-4beb-96a8-bc9c75866fef

解题思路:

结合题目,利用Volatility查看浏览器历史记录

vol.py -f data.raw --profile=Win7SP1x64 iehistory

发现浏览器打开过两个ipynb文件。

利用Volatility导出第一个ipynb文件,发现其中的flag1对应的uuid的MD5值就是题目所要求的第一位为4,即正确Flag。

history_2

题目内容:

2.提交flag中uuid值32位小写md5加密第一位为a的uuid(提交示例:9c26d7a6-ea44-4beb-96a8-bc9c75866fef)(提交示例:9c26d7a6-ea44-4beb-96a8-bc9c75866fef)

解题思路:

利用Volatility导出第二个ipynb文件,发现其中的flag1对应的uuid的MD5值就是题目所要求的第一位为a,即正确Flag。

数据算法

水印攻击_南区

题目内容:

(本题满分为1000分,题干较长,见于附件,请详细阅读,注意本题提交的zip压缩包里得包含result.png和代码文件)

解题思路:

本题是要对带有隐水印的图片进行攻击,使得隐水印无法被正常提取。根据题干可知可以对图片进行裁剪、压缩、改变亮度、加掩码块、加噪音……,但一一尝试过后发现效果均不佳,最后想到可以在原先的水印上叠加水印,只要叠加够多就可以使得原水印无法被提取。

Payload.py

from blind_watermark import WaterMark # pip install blind-watermark# Blind WaterMark,图片盲水印,https://github.com/guofei9987/blind_watermarkbwm1 = WaterMark(password_img=1, password_wm=1)bwm1.read_img('../input.png')wm = '这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!这是一串没有意义的字符!!!'bwm1.read_wm(wm, mode='str')bwm1.embed('../result.png')

最后结果

原图

攻击后图片

得分