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