Excaliflag
一张图片,winhex打开没什么发现,分值不高,应该属于常见的图片隐写题目。如果对于图片的格式有详细的了解,应该很容易就能够知道了属于最低有效位(LSB)隐写,下面是通过photoshop来处理得到的flag.

签到题
Base64、栅栏、凯撒;可以直接通过在线网站解密了,在这里使用python来求解(纯属练习练习下代码)
import base64 # base64解密 def b64Decode(): s="Z2dRQGdRMWZxaDBvaHRqcHRfc3d7Z2ZoZ3MjfQ==" temp=str(base64.b64decode(s),encoding = "utf-8") return temp # 栅栏密码 def zhalan(s): #确定可能的栏数 s_len = len(s) field=[] for i in range(2,s_len): if(s_len%i==0): field.append(i) mingwen="" for j in field: k=int(s_len/j) for a in range(j): for m in range(k): mingwen=mingwen+s[a] a=a+j # 分割字符串 n=0 list=[] for i in range(int(len(mingwen)/s_len)): list.append(mingwen[n:n+s_len]) n=n+s_len return list # 凯撒密码 # coding:utf-8 def kaisa(args): for j in range(26): for i in range(len(args)): if(ord(args[i])<65 or ord(args[i])>122): print(args[i],end="") elif(ord(args[i])>90 and ord(args[i])<97): print(args[i],end="") else: temp=ord(args[i])+j if(ord(args[i])>=97): if(temp>122): print(chr(temp-26),end="") else: print(chr(temp),end="") else: if(temp>90): print(chr(temp-26),end="") else: print(chr(temp),end="") print() #编程能力和算法都太菜了,写的有些复杂了 if __name__ == '__main__': s = b64Decode() args=zhalan(s) print(args) for i in args: kaisa(i)
Avatar
就知道下outguess
outguess -r 1.jpg out
得到:We should blow up the bridge at midnight
What-is-this
得到两张图片通过StegSolve
异或得到:

Training-Stegano-1

easycap
追踪TCP流得到:FLAG:385b87afc8671dee07550290d16a8071
Get-the-key.txt
通过file
命令查看了下文件类型:Linux rev 1.0 ext2 filesystem data (mounted or unclean), UUID=0b92a753-7ec9-4b20-8c0b-79c1fa140869
通过mout挂载:
mount -o loop /root/forensic100 /root/mnt/misc

更具标题需要查找key.txt
grep -r key.txt # 匹配到二进制文件 1
1: gzip compressed data, was "key.txt", last modified: Wed Oct 1 06:00:52 2014, from Unix, original size 30
gunzip < 1 # SECCON{@]NL7n+-s75FrET]vU=7Z}
embarrass
直接Ctrl+F查找一波就有了

肥宅快乐题
题目描述:
真正的快乐的游戏题,打通就给flag哦,与肥宅快乐水搭配更佳。 Flash游戏,通关后,注意与NPC的对话哦;)
下载是一个swf文件, 百度得知:SWF是一种基于矢量的Flash动画文件, SWF格式文件广泛用于创建吸引人的应用程序,它们包含丰富的视频、声音、图形和动画。

打通关游戏或者通过potplayer定位到57帧
小小的PDF
binwalk分析下发现存在三张图片

直接通过foremost工具提取就得到flag再第三张图片里面
Test-flag-please-ignore
十六进制

glance-50
把每一帧提取出来拼接就可以了
# 图片拼接 import PIL.Image as Image import os, sys Temp=Image.open('Frame0.jpg') w,h=Temp.size toImage = Image.new('RGB', (w*201, h)) for y in range(201): fname = "Frame%d.jpg" %y fromImage = Image.open(fname) toImage.paste(fromImage, (y * w, 0)) toImage.save('mage.jpg')

4-2
古典替换密码,通过 https://quipqiup.com/ 网站跑一下得到:
In cryptography a substitution cipher is a ?ethod of encoding by which units of plaintext are replaced with ciphertext If you know the way of encoding u will get the flag which is classical-cipher_is_not_security_hs
misc1
d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd
hex编码,解码后不是可见字符的范围,然后模128之后,得到flag
s='d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd' flag="" for i in range(len(s)/2): flag+=chr(int(s[:2],16)%128) s=s[2:] print flag
hit-the-core
通过strings
命令,发现一个疑似字符串
cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc{bnjrKwgk83kgd43j85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}
然后可以得出规律:
cvqA
eqacL
tqazE
igwiX
obxrC
rtuiT
zahfF
reqc{bnjrKwgk83kgd43j85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}
那么通过python每个四个字符提取就得到了最后的flag:
s='cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc{bnjrKwgk83kgd43j85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}' flag='' for i in range(3,len(s),5): flag+=s[i] print(flag)
Cephalopod
搜索关键字符串发现一个flag.png文件,导出来即得到了flag:

pure_color
借助工具StegSolve:

(之后尝试不用工具,自己写个脚本试试看)
2-1
png文件,发现文件头不对,修改后依旧无法打开,binwalk也没发现什么东西。然后发现宽度被修改为了0,那么很明显通过CRC爆破出宽度了

import struct import binascii import os m = open("1.png","rb").read() for i in range(1024): c = m[12:16] + struct.pack('>i', i) + m[20:29] crc = binascii.crc32(c) & 0xffffffff if crc == 0x932f8a6b: print(hex(i))
这里直接贴的师傅的代码:https://blog.csdn.net/zz_Caleb/article/details/89927673
(之后再好好研究下关于CRC的问题)

János-the-Ripper
爆破即可
神奇的Modbus
搜索字符串得到的是:sctf{Easy_Mdbus},但是得改成sctf{Easy_Modbus}提交
2017_Dating_in_Singapore
题目描述
01081522291516170310172431-050607132027262728-0102030209162330-02091623020310090910172423-02010814222930-0605041118252627-0203040310172431-0102030108152229151617-04050604111825181920-0108152229303124171003-261912052028211407-04051213192625
脑洞······🙄🙄🙄

4-1
从png文件中提取出压缩文件,得到一个tips.txt
和day2's secret.zip
tips.txt内容
Although two days doing the same things, but day2 has a secret than day1
-。-
day2's secret.zip
两张png文件,图像内容一样,文件大小不一样,猜想盲水印
github上找一个: https://github.com/chishaxie/BlindWaterMark
can_has_stdio?
txt文件,查看内容明显可知Brainfuck编码,地址: https://www.splitbrain.org/services/ook
5-1
没见过,没有思路,不知是啥,遂查看Writeup
了解到xortool
: A tool to analyze multi-byte xor cipher
地址: https://github.com/hellman/xortool

其中-l
就是指定密钥长度,-c
表示出现频率最高的字符。这个需要根据经验,比如文本内容一般是空格20
(十六进制),二进制文件一般是00
(十六进制)

猜测key为:GoodLuckToYou
import os flag = "" key = "GoodLuckToYou" with open ("1",'rb') as f: c = f.read() for i,c in enumerate(c): flag += chr(ord(c) ^ ord(key[i % len(key)])) print flag
MISCall
file
命令查看发现是个bzip2压缩文件,解压出来发现有一个flag.txt
文件和一个.git
文件夹,考察git相关命令,可🥦🐓我还没有去学习使用过git
,所以只能够···
常用命令:https://www.jianshu.com/p/93318220cdce

可以看到flag.txt
文件被修改过,新增了一个s.py文件然后删除了

适合作为桌面
解压出来一张png图片,通过StegSolve
分析得到一张二维码:

扫码得到一串应该时十六进制字符串,通过winhex新建文件保存


通过file
命令得知时python2.7
编译后的文件,直接修改文件后缀名为.pyc
,通过在线网站或者是uncompyle反编译得到python文件
def flag(): str = [102, 108, 97, 103, 123, 51, 56, 97, 53, 55, 48, 51, 50, 48, 56, 53, 52, 52, 49, 101, 55, 125] flag = '' for i in str: flag += chr(i) print flag
3-1
通过file命令最终得到一个pcap文件,搜索关键字符串发现一个rar的文件,导出来之后的rar文件是加密的,显然不是简单的爆破,继续寻找有用信息

可以得知1
就是导出来的rar文件,2
是一段字符串,3
是一段python代码
# coding:utf-8 from Crypto import Random from Crypto.Cipher import AES import sys import base64 IV = 'QWERTYUIOPASDFGH' def decrypt(encrypted): aes = AES.new(IV, AES.MODE_CBC, IV) return aes.decrypt(encrypted) def encrypt(message): length = 16 count = len(message) padding = length - (count % length) message = message + '\0' * padding aes = AES.new(IV, AES.MODE_CBC, IV) return aes.encrypt(message) str = 'this is a test' example = encrypt(str) print(decrypt(example))
那么直接通过给出的代码解密即可:
from Crypto import Random from Crypto.Cipher import AES import sys import base64 IV = 'QWERTYUIOPASDFGH'.encode("utf8") def decrypt(encrypted): aes = AES.new(IV, AES.MODE_CBC, IV) return aes.decrypt(encrypted) print(decrypt(base64.b64decode("19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo=")))
得到密码解密即可得到flag了
b'passwd={No_One_Can_Decrypt_Me}\x00\x00'
Banmabanma

我们的秘密是绿色的
需要用到一个OurSecret的软件,然后密码在图片中:0405111218192526

得到一个try.zip
文件,发现是加密的,提示是:你知道coffee的生日是多少么?那马就直接爆破吧,得到密码19950822,解压出来一个readme.txt
和一个flag.zip
文件,然后很明显的明文攻击,获取到下一个flag.zip
之后仍然是加密的,但没有提示,通过软件爆破发现是没有加密的,那应该就是zip伪加密了。

将第二个01 09改为00 09,就可以了,然后得到txt文件中的内容是:qddpqwnpcplen%prqwn_{_zz*d@gq}
更具flag{}的格式,应该是经过了栅栏加密,通过网站列举解密 https://www.ctftools.com/down/
解密得到:qwlr{ddneq_@dpnwzgpc%nzqqpp_*}
,显然这不是最后的flag,然后凯撒得到:flag{ssctf_@seclover%coffee_*}
simple_transfer
打开数据包可以看到很多的网络文件系统协议数据包(NFS),说明正在进行文件传输。通过追踪TCP流可以看到

这里的字符串%PDF-1.5
是PDF文件头,说传输了PDF文件,那么就是尝试恢复出PDF文件,但是似乎没有这么容易的整出来还能够正常打开(或许只是我太🥦了),所以就只能通过foremost直接分离数据包看看了,结果是可以的

Just-No-One
不会,看过WriteUp后,还真是不会,放弃~
warmup
解压出来,首先熟悉的套路,明文攻击,成功解压,然后还是熟悉的套路,图像内容一样,大小不一样的两张PNG图片,盲水印。

Erik-Baleog-and-Olaf
通过Stegsolve分离可以发现一张二维码,但是这个二维码有点难搞,就反复的找到合适的通过photoshop调整能够扫出来flag
Reverse-it
打开发现不知道什么格式,但是看到文件的末尾结合题目
原始文件:

jpg文件:

没错,反转,直接上python
def read_content(): data = [] with open("re","rb") as f: #循环读取一张图片,一次性读取1024个字节 while True: con = f.read(1) if con == b"": break data.append(con[0]) return data[::-1] def write_content(data): flag = [] for i in data: temp = bin(i).replace('0b', '').zfill(8) flag.append(eval("0b"+temp[4:8]+temp[0:4])) with open("flag.jpg","wb") as fp: fp.write(bytes(flag))
得到的图片翻转一下就可以了
Py-Py-Py
反编译之后得到:
import sys, os, hashlib, time, base64 fllag = '9474yeUMWODKruX7OFzD9oekO28+EqYCZHrUjWNm92NSU+eYXOPsRPEFrNMs7J+4qautoqOrvq28pLU=' def crypto(string, op='encode', public_key='ddd', expirytime=0): ckey_lenth = 4 public_key = public_key and public_key or '' key = hashlib.md5(public_key).hexdigest() keya = hashlib.md5(key[0:16]).hexdigest() keyb = hashlib.md5(key[16:32]).hexdigest() keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or '' cryptkey = keya + hashlib.md5(keya + keyc).hexdigest() key_lenth = len(cryptkey) string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string string_lenth = len(string) result = '' box = list(range(256)) randkey = [] for i in xrange(255): randkey.append(ord(cryptkey[(i % key_lenth)])) for i in xrange(255): j = 0 j = (j + box[i] + randkey[i]) % 256 tmp = box[i] box[i] = box[j] box[j] = tmp for i in xrange(string_lenth): a = j = 0 a = (a + 1) % 256 j = (j + box[a]) % 256 tmp = box[a] box[a] = box[j] box[j] = tmp result += chr(ord(string[i]) ^ box[((box[a] + box[j]) % 256)]) if op == 'decode': if result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0: if result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16]: pass return result[26:] else: return else: return keyc + base64.b64encode(result) if __name__ == '__main__': while True: flag = raw_input('Please input your flag:') if flag == crypto(fllag, 'decode'): print('Success') break else: continue