题目仅给了一段文本,内容如下:
BCEHACEIBDEIBDEHBDEHADEIACEGACFIBDFHACEGBCEHBCFIBDEGBDEGADFGBDEHBDEGBDFHBCEGACFIBCFGADEIADEIADFH
放进CyberChef后没有解决,也没有被decode.fr识别出来。放进文本中开始传统的密码分析。仔细看可以发现这一串字符串是四个四个为一组的。以前面的为例子,可以分组为:
BCEH
ACEI
BDEI
BDEH
BDEH
ADEI
ACEG
第一位是A或B,第二位是C或D,第三位是E或F,第四位是H或I或G。如果自由排列,最终的组合种类就是他们的乘积就是24。这个数字很靠近26个字母,猜想可能就是26位字母但是去除了其中两个字母。带着这些信息在Google上搜索,经过一段时间查找找到了一篇论文。这篇文章讲了一种特殊的加密方式叫做“Toy Cipher”。而这种加密方式所用的密文和上面的字符串排列基本相同。
我们直接对照上面的表进行翻译,可以得到原文为一串字符串。
LDVUUCMEXMLQSSFUSXKEOCCG
但是这个并不是答案,回到题目描述,发现有一句话一开始读不懂,“一表人才,二表倒立”。现在来看这个二表倒立应该是个提示,提示我们需要把上面论文中的第二个对照表倒过来,比如M - ACEG换成Y - ACEG,以此类推。
转换后的对照表:
Y → ACEG Q → ADEG I → BCEG E → BDEG
X → ACEH P → ADEH G → BCEH T → BDEH
W → ACEI O → ADEI F → BCEI H → BDEI
V → ACFG N → ADFG C → BCFG D → BDFG
U → ACFH L → ADFH B → BCFH A → BDFH
S → ACFI K → ADFI R → BCFI M → BDFI
按照这个新的转换表对原来的字符串进行翻译,得到。
GWHTTOYSAYGREENTEAISCOOL
其中GWHT是羊城杯的缩写,故答案为。
flag{TOYSAYGREENTEAISCOOL}
类型 | 加密算法 |
---|---|
工具 | 无 |
Flag | flag{TOYSAYGREENTEAISCOOL} |
这道题目少了一个关键提示,原题是有以下提示的:
一长一短:F
两短:0
两长:1
去掉这个提示做题会变的有点超纲。题目文件是个wav音频文件,放进Audacity中查看,放大后发现该音频是由多个相同的段组成的,我们查看频谱图可以更加直观的看到这一段的特征。
把这部分特征结合上面的提示,可以翻译为
FFFFFFFF0001短
这里答案就出来了,去掉最后一个短信号,前面的“FFFFFFFF0001”就是flag的内容。
类型 | 音频隐写 |
---|---|
工具 | Audacity |
Flag | flag{FFFFFFFF0001} |
之前做过完全一样做法的题目,但是忘记具体哪道题目了。。下载题目提供的pcap日志文件,用wireshark打开,内容并不多,但是追踪TCP流没有发现任何有意义的信息。这里就想到可能信息不是写在传递的数据内容而是在前面的帧信息或者协议信息内。这里就是每个流的id不一样。
可以用tshark提取出所有的id。
tshark -r attachment.pcap -T fields -e ip.id > ids.txt
然后把输出放入Notepad++,每一行只保留最后两位再全部排列到一起。
4069483c2c7b2a3b6f55702f696d2251506c6079522a69657d4e4b3b2e4421587529623a4a5b526a2b364b4b4d37504069483c2c7b2a3b6f55702f696d2251506c607952
放入CyberChef进行转换,发现原文好像经过了多次编码,放进decode.fr进行识别发现是base91。解码后得到答案。
类型 | 日志分析、字符编码 |
---|---|
工具 | wireshark(tshark)、Notepad++、CyberChef、decode.fr |
Flag | flag{wMt84iS06mCbbfuOfuVXCZ8MSsAFN1GA} |
题目文件没有任何后缀,只能先用notepad++打开看是否可读出文件内容。
可以看到,前面的半部分像是base64,可惜CyberChef解码后什么也没有;后半部分有点像是pyc文件内容。我们把前面三行base64内容剪切掉,把剩余内容保存到一个pyc文件中,然后上传在线反编译工具,得到一个python代码。
这是一个简单的加密算法,因为其中主要是用异或进行加密,解密的过程和加密相同,再异或一次就能得到原文。这里的密文应该是前面删掉的像是base64的字符串。可以写一个简单脚本来解密。
import base64
def decrypt(key, cipher):
plain = ''
for i in range(len(cipher)):
plain += chr(ord(key[i % len(key)]) ^ ord(cipher[i]))
return plain
cipher_b64 = "KTswVQk1OgQrOgUVODAKFikZJAUuKzwPCTUxMQE1Kxc8NxYYPjcgQwY7OxMhCzFDLyYFGBYjKwkXMDALAScZEycyJgooOigHEAoSDT42IEcBLCcdDiUxBi8mBRgoLBUKPgowBR04P1QnJj0cLyYFGBYjJBs5JywFL1wjHhkbMkI8KhoWFjAWXH55"
key = 'LordCasser'
cipher_bytes = base64.b64decode(cipher_b64)
cipher_text = cipher_bytes.decode('latin-1') # 使用latin-1编码来保持字节数据
plain_text = decrypt(key, cipher_text)
print(plain_text)
解密后得到另外一串base64编码,放进CyberChef中解码后得到一段文字。
其中提到了一个词“st3g05auru5”,换成全英文字母就是“stegosaurus”,我们之前遇到过同名称的题目,就是一种pyc文件的隐写。需要用到这个项目进行解密。(https://github.com/AngelKitty/stegosaurus)
类型 | 字符编码、pyc隐写 |
---|---|
工具 | CyberChef、反编译工具、stegosaurus |
Flag | flag{Z3r0_fin411y_d34d} |
题目文件是个“密码.wav”的音频文件,听了一下是拨号按键声音,在线找“DTMF Decoder”就能找到工具能够直接读取原电话号码,这里我用的是(https://dtmf.netlify.app/)。
得到一串电话号码,这道题就结束了,但该号码并不能作为flag上交。
186842216009
看了其它师傅的wp,这里需要把电话发给天璇merak公众号,然后公众号会自动给flag。但这个公众号好像很久没有维护了,发送过去也没有任何响应,可能是时间太久的原因,这道题知道是考DTMF就行了。
类型 | DTMF |
---|---|
工具 | DTMF在线解码 |
Flag | flag{Oh!!!!!_Y0u_f1nd_my_secret} |
wireshark打开题目文件,是个含有大量USB记录的日志文件,轻车熟路了,用脚本跑出隐写的键盘敲击过程。
这里记录了一串vim的敲击命令记录,最终我敲击复原后的原文是这样
Tthe flaag is ctf{[MY_FAVOURITTE_EDITOR_IS_VIM}
这里的flag并不准确,还需要删掉开头的“[”符号和中间一个T字母。尝试两三遍也能得到答案。(后面发现可能是这个工具不太准确,有个别符号比如空格、换行等没有显示出来,所以实际操作后会和原操作有出入)
类型 | 日志分析、USB键盘敲击恢复 |
---|---|
工具 | wireshark、CTF-Usb_Keyboard_Parser |
Flag | flag{MY_FAVOURITE_EDITOR_IS_VIM} |
一开始以为是字频或者隐写在行间距中,但发现都没有特殊信息,行间距也正常。查了一下文本内容,发现是个电影的剧本,原文在这里(https://imsdb.com/transcripts/Stargate-SG1-Children-Of-The-Gods.html)。这里用一个在线工具来比较有没有不同,结果发现题目在原有基础上加了一些字母,找到这些字母连在一起就是flag。
watevr{icantspeel_tiny.cc/2qtdez}
类型 | 文本比较 |
---|---|
工具 | 在线对比工具 |
Flag | flag{icantspeel_tiny.cc/2qtdez} |
题目文件包含一个文本内容和一个压缩包,文本内容如下。
You're part of a company security team and the admin has recently enabled interception on the company filtering proxy.
The admin is pretty confident when it comes to its domain whitelist.
He gave you a capture to review. Time to prove him wrong.
压缩包中有一个sslkey.log和一个pcap日志文件,前者应该是用于解密HTTPS流量的。用wireshark打开pcap日志。“编辑” - “首选项”,协议选择TLS,设置sslkey.log文件的路径,然后全局应用。
现在看就可以看到解密后的流量了,但流量依然不少,所以通过导出HTTP文件查看具体请求了拿些东西,发现其中大部分流量在请求一个“searchbyimage”的接口。
随便取一条日志,去掉URL编码后得到以下请求。
searchbyimage?image_url=http://requestbin.net/r/zk2s2ezk?id=82290383-7480-487c-b78b-77ac769c56cd&kcahsni=9ef773fe97f56554a3b4&encoded_image=&image_content=&filename=&hl=fr
这里有个参数不知道什么意思,“kcahsni”,比赛标题是“INSHack”,刚好是比赛名称的逆序,所以这个参数应该是需要关注的点,并且这个参数的值有点像是十六进制。这里就先把所有这个参数的值取出来,并没有很多就直接手工取出了。
kcahsni=9ef773fe97f56554a3b4
kcahsni=26cd07e1f71df3dcee9f
kcahsni=1eaf89725ab93968fc52
kcahsni=f03c0a7d653539616433
kcahsni=66333861303164636130
kcahsni=30663937353965366432
kcahsni=30353331373634326335
kcahsni=34323166636461643033
kcahsni=34656265373037376332
kcahsni=62646464343732627b41
kcahsni=534e490b3295c3d06c24
kcahsni=f2a8c7e8936667dbf7fe
kcahsni=ce28456a0fd24ac21ec6
kcahsni=a12e3efe4b
把这些字符串全部接在一起,放进CyberChef进行转换,发现得到了一个逆序的flag,最后在逆序一次处理就能得到flag了。
9ef773fe97f56554a3b426cd07e1f71df3dcee9f1eaf89725ab93968fc52f03c0a7d653539616433663338613031646361303066393735396536643230353331373634326335343231666364616430333465626537303737633262646464343732627b41534e490b3295c3d06c24f2a8c7e8936667dbf7fece28456a0fd24ac21ec6a12e3efe4b
类型 | 日志分析、字符编码 |
---|---|
工具 | wireshark、CyberChef |
Flag | flag{b274dddb2c7707ebe430dadcf1245c246713502d6e9579f00acd10a83f3da95e} |
题目文件内包含了三个名称为日记的zip压缩文件。
先看日记1,一个文本和一张图片,文本是某个日记,没什么用处,直接看图,放进随波逐流工具发现被改了宽高,工具恢复原图,得到一个密码。
日记2解压缩需要密码,密码就是上面得到的zip_pwd,解压后得到三个文件。
先看wav音频文件,发现是LSB隐写,需要用SilentEye工具进行解密,得到另外一个密码
这个test文件没有用处,我还是读了一下日记,大概是说失恋了要去东南亚当程序员,然后想逃出来的故事,这个test文件也只是随手写的。
打开日记3压缩包,里面有一个源码文件和另外一个日记。这次的日记稍微有点用了,内容如下,既然说了不是明文,那很可能是通过行间距、tab、空格、或者其它不可见符号等进行隐写。而且前面两个题目分别是图片隐写和音频隐写,就剩下文本隐写了,文本隐写常见的就几个。
为了确认上面的隐写方式,我们随便打开一个c语言文件,可以明显看到全部不可见都是由tab和空格组成的。
但是这么多程序,即便是用脚本输出所有tab和空格也不现实,所以还是要找到关键的隐写字段。最终在malloc\arena.c
文件中发现了这样一段符号。
因为这里的空格和tab交叉使用完全没有任何意义,所以猜想可能所有的隐写都是写在“}”符号后面的,通过这个我们就可以编写一个脚本了。
import pathlib
import base64
def find_files(path):
return list(pathlib.Path(path).rglob('*'))
def important_files(path):
files = []
for file in find_files(path):
try:
if ' \t \t' in file.read_text(encoding='utf-8'):
print(file)
files.append(file)
except:
continue
return files
def decode_flag(files):
binary = ''
for file in files:
for line in file.read_text().splitlines():
if '}' in line:
data = line.split('}')[-1]
if '\t' in data and not data.replace('\t', '').replace(' ', ''):
binary += data.replace('\t', '1').replace(' ', '0')
flag = bytes.fromhex(hex(int(binary, 2))[2:]).decode()
print(flag)
if __name__ == "__main__":
path = ".\source_code"
files = important_files(path)
decode_flag(files)
把脚本放到和“source_code”同目录下,运行得到flag。
类型 | 图片隐写、音频隐写、文本隐写 |
---|---|
工具 | 随波逐流工具、SilentEye、脚本工具 |
Flag | flag{code_steganography_1s_funny!} |
这道题不太建议做,有点太小众了。题目提供的文件是某个游戏文件。
查了一下发现这是我的世界MC的地图,对于我这样从小晕3D的人来说,MC一次没玩过,也不想为了这个下载游戏,有关这道题目的思路请移步这个视频。这道题需要特定版本的MC打开,通过判断地图光线明暗规律转换为二进制,最后对二进制进行MD5加密,只能说小众到姥姥家了。直接给出答案,不想做可以跳过。
类型 | 签到题(?这要真是签到估计不少人骂 |
---|---|
工具 | MC游戏 |
Flag | flag{8F108D05D23041B5866F9CB2FF109661} |
题目文件是两张二维码,分别是key1和key2,key1扫码没有得到什么信息。
key2是个缺少了定位点的二维码,在ppt内通过复制裁剪的方式复原后发现依然扫不了码。
因为两个二维码的规格相同(同一行的块数量相同),尝试用StegSolve进行合并。其中异或(XOR)的结果可以进行扫码,得到flag。下图右边为两图异或结果。
类型 | 签到题 |
---|---|
工具 | StegSolve、qr_research |
Flag | flag{x0r_1m4ge_w1ll_g0t_fl4ggg_3394e4ecbb53} |
这道题有很多前面题目的影子,下载题目文件,内含三个文件。
secret暂时不知道是什么类型文件,尝试用trid进行识别结果什么也没识别到,要么是这种文件类型很少用,要么是文件被人工修改了。先看上面两个文本。由于文本文件经常通过不可见字符进行隐写,我一般都用Notepad++打开文本。maybehint文件没有什么特别内容,但提示了可能藏在txt中。
但是lookatme文本中明显有一串空格和tab组成的隐写字段(打开“视图” - “显示符号” - “显示空格和制表符”)。这个字段要么是转换为01的二进制,要么转换为摩斯密码。上面一段字符串暂时不知道是什么。
这里就是摩斯密码,空格为点,tab为线,得到
.- ..- - --- -.- . -.--
翻译得到AUTOKEY,那就是autokey cipher,可以用这个在线工具自动爆破密码。一开始爆破得不到原文,是因为设置的密钥不够长,这里设置长度为15后得到答案。
我选择自动空格设置,让我能更快定位到正确原文,但实际应该没有空格,原文应该是。
congratulationsonfindingmysecretnowiwillgiveyouthepassworditisiamthepasswd
这句话给出一个密码“iamthepasswd”。暂时不知道做什么用处。继续看secret文件,发现用strings工具打印字符串中出现了一行可读字符串。
在010editor中打开并删除这一段文字,但是发现保存后的文件依然无法被正常识别。
经过一段时间检查,发现解压后的文件流中存在NTFS隐藏数据流。用NtfsStreamEditor2扫描解压后的路径,发现maybehint文本上还存在一个隐藏数据out.txt。
=wwZlZ=8W=cndwljcdcG8wdj8W8Z8dZllGjZc=8lWjnlWd8WwZ5j=l8ccWZcZGjd5ZwZ5WZ8d=Zcwjwl5Gnn=WdwcwlnWd5lGnZWlnnwdnjnw8ndnc58d5cndl=njZl=WddjwWWwZllj5c5jGwZnZ5W=cZljdwd8c=85ndGGljcl5ccwd=W=l8w=5lwWn8WnwnWlGZwdcnGGl5G=8W==cnnWZnWjZ=wWcGwZcWc8ncWW=5jnWwcZl8W=8cdwWldlnwW5ddwlnlwncWlcwGZddj5djZWc5jcWdn5jdjwnj85GWGjnjwGd=jZGj5j==jwjlw8dlwWj5Wjn5n8dwwdjZlc5lZwdWldZlnGwl85cWnjd=WcWlwj8WGdlGncnZWGGd5ZncW5d55nW5wl=Wj8jGWnWj8jwZ=ZwWZ88nWG5nn5WlWnGdWw5Zn8jdl=nGcnll8WncZjnGn=dlwn5W8wlWjlnl5ccnGWGnnnc58WnjlGnG55Zwdn5cZdjdZZ5WljG5G5wcldd=Wlc8Z=8nGj=jWd8w8Wd=w8nccc8wZdjcnGdljZnnj5ww8885=lcWW8W8j5dG8jZZwG55GjnwZ=W5Z8G5ZlGc5ZZncZ5cd8j85GW5nj=WWncn55Gj5nj5nwnW58jG8GcnjZdWcl8wj8n=cj=8l8cn5jjcjn8lldn=Gjw8=cjcdWWjGddZljdjdZnG8djnZccZldlWllw5ZZ8wj5Gn==5w8Z=j55n=ZZ5wdww8lndwd8Wlj8WGjnl=nncZ=W8ZZWZnjjlwWGZZlZc5c==d8Zl855wZn=W=w8wWjZ85cGc==5Z8ccjdw5GnZWnGjcdGGnZ5wwwWGG5d=W5ldjwGZZdZwdG5cGGnZGlGc=W5ccWZ8=cGljdGcdld=8cj8jwn=lj88ZZ5jn5lcZ=Gdw=Zl58WZZl5ccwccwG5d5w8Z5wllj5ddnn=5=w8588WwGj=l5G55dWG8cl=GcjWwlwG=lWWnZ=dZG85Gcjc5=wnw=j==Gndnddjwn5c=c5W5wwdWlG5nWZwnGw8=lcWldcwnG5Wcjj=cWlGZc8Gn58ZWjZ85ljlncZj5cc=dZWGjd=d8ncZ8www55=cw=GWZn5ZZlnWld=cWcnclWlZG5djGW=cl8=ZG8cZwwc8wl=88W5ZwZ=jwZGGlcWcWnZZ5Zj5w5ZdZclZZWnccGw==cG8W8ZWlc8wcZ555Z85ljWG5jZ=8=wllWjWjlZc5lG8cwWlnjlGlW=l5=n=lGwnjGGjGdwj85ddW5ZwZ=ddjWldj=cjljjGwndZjWWZGcdWcZW5cdldj8WZjGljlWncZ5=8jnZWjl8wjZG5Zwlcl5dd
这个无序的字符串没有任何加密特征,也不是已知编码,尝试用工具进行字母字频统计,得到一个base64编码。
Z: 126
W: 123
5: 120
j: 119
c: 118
n: 117
l: 115
w: 112
d: 104
G: 101
8: 100
=: 90
ZW5jcnlwdG8=
通过CyberChef进行解码得到“encrypto”。这是一个专门用于文件加密的工具,这是官网地址。(https://macpaw.com/encrypto
)
下载工具并把之前更改的secret文件后缀加上“.crypto”就可以解密了,密码是之前得到的小写密码字符串。
解密后得到一张彩虹图片。
之前遇到过一个题目和这个很相似,但是当时是竖着的,解法就是每一行黄色都有细小的颜色差别,找到十六进制表示的RGB颜色再去除开头,拼接在一起就是答案。这里用PS软件可以查看所有颜色的十六进制表示,这张图最终每行黄色提取出来如下。
ffff70
ffff40
ffff73
ffff73
ffff57
ffff64
去掉前面相同部分连在一起就是。
704073735764
得到某个密码。继续分析图片,把图片放入随波逐流工具,工具显示尾部存在其它字符串,这里是504b开头,明显是个zip压缩文件。通过CyberChef转换保存,得到一个加密的压缩文件。
用上面得到的密码“p@ssWd”进行解压缩,得到一个docx文本文件。
这个字符串中有几个大写字母,全部提取出来是“ALPHUCK”,去掉这几个大写字母得到一串密文,放入在线Alphuck解密工具得到flag。
eeeeeeeeeepaeaeeeaeeeeeeeaeeeeeeeeeeccccisaaaaeejeeeeeejiiiiiiiiiiijeeeeeejeeeeeeeeeeeeeeeeeeeejcceeeeeeeeeeeeeeeeeeejaaiiiiiiijcciiiiiiiiiijaaijiiiiiiiiiiiiiiiiiiiijeeeeeeeeeeeeeeeeeeeeeeejcceeeeeeeeeeeejaaiiiijeeeeeeejceeeeeeeeeeeeeeeeeeeeeeeeejceeeeeeeeeeeeeeeeejaeeeeeejciiiiiiiiiiiiiiiiiiijaeeeejceeeeeeeeeeeeeeeeeejajciiiiiiiiiiiiiiiiiiijaaiiiijiijeeeeeeeeeeejcciiiiiiiiiiiiiiijaaij
类型 | 文本隐写、Ntfs隐藏流、图片隐写、字符编码、加密算法 |
---|---|
工具 | decode.fr、CyberChef、随波逐流工具、Encrypto、NtfsStreamEditor2、字频统计工具、010editor等 |
Flag | flag{1t's_v3ry_De1iCi0us~!} |
最近发现出现了很多难题,12题全部压缩在一篇内往往需要很长时间更新,后续可能会缩短一篇的题量,但增加一些详细的步骤。如果是非常复杂的题目可能会单独一篇专门讲解。
感谢支持!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。