NepNep Winter-CAMP
1.GIF图片隐写
提示此文件为gif图片,用010editor打开,发现文件头不对,
应为47 49 46 38
,添加文件头,保存,得到GIF图片,GIF图片中有“password is ·········”格式闪过
用stegslove工具打开,analyse->frame browser,查看每一帧,frame 3-8:
字母重叠的图片,再用stegsolve工具单独打开,切换通道查看,
得到一些字母和数字:Y2F0Y2hfd GhlX2R5bm FtaWNfZm xhZ19pc19 xdW10ZV9z aW1wbGU=
,
观察特点,为base64编码,解码得catch_the_dynamic_flag_is_qumte_simple
,则flag为:flag{catch_the_dynamic_flag_is_qumte_simple},提交,发现flag错误,翻译下flag内容,wt?将qumte换成quite。
2.音频频谱隐写
得到一个ohh.wav文件,使用Audacity工具打开,Audacity工具使用
点击倒三角标识,切换频谱图,找到flag
按住ctrl,滚动鼠标滑轮,放大图片,查看flag:fbctf{This_1s_a_massage}
3.流量分析(一)
直接查找flag无果,发现这是FTP的流量包,追踪一下tcp流,用户test,密码test
则flag信息可能存在于ftp传输数据中,搜索ftp-data,追踪一下tcp流,发现曾执行郭过ls命令,flag可能存在于txt或者png文件中
搜索flag.txt,并逐个追踪tcp流,发现可疑字符串,猜测是base64编码,拿去解码
假的。。。。。。
再搜索一下universe.png文件,追踪一下tcp流,
猜测可能想将flag信息藏在图片中
发现传输过png文件,复制原始数据,用010editor打开,保存为png文件,
使用了各种方法,无果,转向流量分析,查找ftp-data,搜索其它可能传输的数据,
发现又保存了一个png文件,再追踪一下tcp流,得到该文件的原始数据,同上操作,得到一张看上去与前一张没区别的图片,试着使用stegsolve工具
发现flag:flag{Plate_err_klaus_Mail_Life}
4.zip口令爆破
使用zip口令爆破工具,得到解压密码1658967
,得到flag
5.LSB音频隐写
使用Silenteye 工具,decode,得到flag
6.音频波形隐写
用Audacity工具打开,发现音频开头又一段可疑的波形图,猜测是高位代表1,低位代表0,然后二进制转ASCII码
则表示的字符串为:110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101
总共是105位,应该是每7位转,
得到flag
7.pyc反编译
反编译得到 : #python2
#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
print 'Your input1 is your flag~'
l = len(input1)
code = []
for i in range(l):
num = ((ord(input1[i]) + i) % 128 + 128) % 128
code += chr(num)
for i in range(l - 1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
print code
code = [
'\x0b',
'\x0e',
'\t',
'\x15',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
re得
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
flag = ''
for i in range(len(code) - 2,-1,-1):
code[i] = chr(ord(code[i]) ^ ord(code[i + 1]))
for i in range(len(code)):
code[i] = chr((ord(code[i])-i)%128)
flag+=code[i]
print flag
运行得flag
提交,flag错误,wt?多次尝试,将GWHT
换成flag
即可
8.MP3 隐写
附件无法播放,用010打开,
发现是jpg文件头,修改扩展名,得到一张图片
并且在末尾发现藏有zip文件,复制到kali,使用binwalk命令,得到一个加密的压缩包
然后根据图片提示使用Mp3stego工具,下载,用法见该工具文件中的readme.txt,
将得到的图片放入Decode.exe所在的文件夹中,当前目录输入cmd回车,输入命令
谷歌翻译:Gourd Little King Kong
,没用。。。。
在网上查了查,试了一下,发现是Gourd Small Diamond
解压密码
解压,得到flag
输入flag,提示错误,经过多次尝试,wt?,梅开二度。。。flag为flag{MSTSEC_DINGANN_KEY_IS_GSD}
9.Affine_task
附件py:
from string import digits, ascii_lowercase
from secret import numbers, A, B
assert min([i in digits for i in numbers])
flag = "flag{"+"".join([ascii_lowercase[int(i)] for i in numbers])+"}"
assert numbers == "".join([str(ascii_lowercase.find(i)) for i in flag[5:-1]])
Ciphertext = ""
for i in flag:
if i not in ascii_lowercase:
Ciphertext += i
else:
Ciphertext += ascii_lowercase[(ascii_lowercase.find(i)*A+B) % 26]
print("Ciphertext =", Ciphertext)
# Ciphertext = vjsg{dckvzksr}
exp:
from Crypto.Util.number import *
from string import ascii_lowercase
table = ascii_lowercase
Ciphertext = "vjsg{dckvzksr}"
MOD = len(table)
def crack():
for a in range(MOD):
for b in range(MOD):
if (a*table.find("f")+b) % MOD == table.find(Ciphertext[0]):
if (a*table.find("l")+b) % MOD == table.find(Ciphertext[1]):
if (a*table.find("a")+b) % MOD == table.find(Ciphertext[2]):
if (a*table.find("g")+b) % MOD == table.find(Ciphertext[3]):
print("a, b = {}, {}".format(a, b))
return (a, b)
flag = ""
A, B = crack()
for i in Ciphertext:
if i not in table:
flag += i
else:
flag += table[inverse(A, MOD)*(table.find(i)-B) % MOD]
print(flag)
print("".join([str(ascii_lowercase.find(i)) for i in flag[5:-1]]))
10.明文攻击
附件为一个zip压缩包,里面是加密的两个文件,flag.doc和readme.txt
明文攻击介绍
根据提示,再创建一个readme.txt文件,将提示内容粘贴保存,保证加密的和创建的readme.txt文件的CRC32值和文件大小相同,然后以zip压缩
然后使用ARCHPR工具进行明文攻击,
点击下方保存,得到一个zip3_decrypted.zip
文件,里面即是已解密的文件,
打开flag.doc,是小说片段,其中藏在flag
11.python脚本使用(一)
附件为一张图片,名为misc.jpg
根据提示,应该是用python脚本解决图片隐写
使用binwalk命令分析一下,发现zlib压缩
并在生成的extracted文件夹中发现一堆总共625位二进制字符串,emm…25*25=625,
将这些二进制字符串使用python脚本转图片
from PIL import Image
MAX = 25
pic = Image.new("RGB",(MAX, MAX))
str = "得到的二进制数字"
i=0
for y in range (0,MAX):
for x in range (0,MAX):
if(str[i] == '1'):
pic.putpixel([x,y],(0, 0, 0))
else:
pic.putpixel([x,y],(255,255,255))
i = i+1
pic.show()
pic.save("flag.png")
得到一张二维码,解码得flag
或者用010找到zlib压缩部分,文件头78 9C
使用zlib解压脚本:
import zlib
s = '''
78 9C 5D 91 01 12 80 40 08 02 BF 04 FF FF 5C 75
29 4B 55 37 73 8A 21 A2 7D 1E 49 CF D1 7D B3 93
7A 92 E7 E6 03 88 0A 6D 48 51 00 90 1F B0 41 01
53 35 0D E8 31 12 EA 2D 51 C5 4C E2 E5 85 B1 5A
2F C7 8E 88 72 F5 1C 6F C1 88 18 82 F9 3D 37 2D
EF 78 E6 65 B0 C3 6C 52 96 22 A0 A4 55 88 13 88
33 A1 70 A2 07 1D DC D1 82 19 DB 8C 0D 46 5D 8B
69 89 71 96 45 ED 9C 11 C3 6A E3 AB DA EF CF C0
AC F0 23 E7 7C 17 C7 89 76 67 D9 CF A5 A8 00 00
00 00 49 45 4E 44 AE 42 60 82
'''
s = s.replace(' ','').replace('\n','')
b = bytes.fromhex(s)
flag = zlib.decompress(b)
print(flag)
同样得到一堆二进制字符串
12.数字水印隐写
用010打开,点击模板尾,发现还藏有无文件头的png文件
可以直接用010新建文件,将隐藏的png文件数据复制到新建文件中,并添加上png文件头,89 50 4E 47 0D 0A 1A 0A 00 00 00 0D
,保存
使用BlindWaterMark工具,将两张图片复制到该工具下,并在当前目录cmd回车,输入命令python3 bwmforpy3.py decode half.png 123.png 333.png
,然后什么事也没发生,不知道是什么原因,难道是python库的版本不对????
无果。。。。
这题解题思路可参见南京大学:数字水印隐写writeup
13.流量分析(二)-hard?????
14.流量分析(三)?????
15.内存取证(一)
解题思路见内存取证
16.python脚本使用(二)?????
17.流量分析-hard???????
18.内存取证(二)????????