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}
然后可以得出规律:
cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc{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