细心的大象
https://share.weiyun.com/9287be0a629971ac53d97f39727eee18
解压得到一张大象图片,查看属性看到:
base64解码得到:
MSDS456ASD123zz
不知道是干什么用的,先留着。
然后用binwalk分析一下这张图片,发现里面藏着一个rar文件:
使用dd命令分离:
dd if=1.jpg of=1.rar skip=5005118 bs=1
//if:输入文件名 of:输出文件名 skip:跳过块的数量 bs:设置块的大小
分离得到的rar文件解压需要密码,填入刚才得到的字符串,解压得到另外一个图片:
linux下打开发现crc校验错误,使用winhex修改高度值:
得到flag:
爆照(08067CTF)
flag格式 flag{xxx_xxx_xxx}
https://ctf.bugku.com/files/fa88c409b367aa9243313a85d138d183/8.jpg
直接binwalk,得到一个gif和8个文件,逐个分析,发现有三个文件有问题:
打开88,就能看到一个二维码,识别得到bilibili.
将888改名为jpg文件,属性里有一段base64,解码得到silisili。
使用binwalk -e分离8888,得到一个zip里面有一张二维码,扫码得到panama。
结合题目给的flag格式,得到flag{bilibili_silisili_panama}。
猫片(安恒)
hint:LSB BGR NTFS
https://ctf.bugku.com/files/9f1bebac6b8282da716720cc99f35bed/png
将图片下载下来,放到stagsolve里,发现red plane 0、blue plane 0和green plane 0的上部都出现特别的东西:
结合提示的LSB和BGR,使用data extract,选中如下选项:
导出后要用16进制编辑器删除PNG文件头前面4位无用字节,得到一张半个二维码的图片,再修改文件的高度和宽度一样:
就可以得到一张二维...诶?越看越不对劲...
将它XOR后才是一张二维码:
扫描得到一个链接:
打开链接下载后是一个rar文件,解压后发现只有一行字:
仔细检查后发现文件只有63B,但却占了4KB,结合提示的NTFS,并上网查阅得知是NTFS交换数据流隐藏了文件。使用ntfsstreamseditor.exe检查并导出可得到一个.pyc文件:
可以使用在线pyc反编译工具或者在本地使用uncompyle库在反编译:
pip install uncompyle
uncompyle6 flag.pyc > flag.py
得到flag.py:
import base64
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))
return ciphertext[::-1]
ciphertext = [
'96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112', '64', '97', '88', '80', '82', '137', '90', '109', '99', '112']
得到了密文和加密算法,那就写个解密算法吧:
import base64
def decode(ciphertext):
flag = ''
ciphertext = ciphertext[::-1]
for i in range(len(ciphertext)):
c = int(ciphertext[i])
if i % 2 == 0:
c -= 10
else:
c += 10
flag += chr(c ^ i)
return flag
if __name__ == "__main__":
ciphertext = [
'96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112', '64', '97', '88', '80', '82', '137', '90', '109', '99', '112']
print(decode(ciphertext))
多彩
https://ctf.bugku.com/files/9c1e769e2799f5b79ddadbdf49ac274b/lipstick.png
这种题对于我们这种钢铁直男来说完全没有头绪,直接搜writeup...
使用stagsolve查看图片发现有几个plane的顶部有东西,同时发现了关键字“YSL”:
使用data extract分离并保存为zip,并使用winrar自带的修复功能修复一下,或者winhex手动修复:
得到一个zip,里面有个flag.txt文件,但需要解压密码。
使用取色工具对原图片所有颜色进行取色:
'BC0B28','D04179','D47A6F','C2696F','EB8262', 'CF1A77','C0083E','BC0B28','BC0B28','D13274', '6A1319','BC0B28','BC0B28','D4121D','D75B59', 'DD8885','CE0A4A','D4121D','7E453A','D75B59', 'DD8885'
在下面网站里找到相应的颜色,并取得色号。写个 python:
import requests
import re
import libnum
url = r'https://www.yslbeautyus.com/on/demandware.store/Sites-ysl-us-Site/en_US/Product-Variation?pid=194YSL'
color_list = [
'BC0B28', 'D04179', 'D47A6F', 'C2696F', 'EB8262', 'CF1A77', 'C0083E',
'BC0B28', 'BC0B28', 'D13274', '6A1319', 'BC0B28', 'BC0B28', 'D4121D',
'D75B59', 'DD8885', 'CE0A4A', 'D4121D', '7E453A', 'D75B59', 'DD8885'
]
dic = {}
flag = ''
text = requests.get(url).text
## print(text)
reg = r'background-color: #([0-9A-F]{6})" title="([0-9]*?) '
req = re.findall(reg, text)
for color, num in req:
dic[color] = int(num.lstrip('0'))
## print(dic)
for i in color_list:
if (i in dic):
flag += bin(dic[i]).lstrip('0b')
else:
flag += ('"' + i + '"')
print(flag)
## print(libnum.b2s(flag))
尴尬的是,我做题的时候,ysl有几个颜色的口红下架了。。。直接看别人解出来的密码:白学家
解压zip即可:
旋转跳跃
熟悉的声音中貌似又隐藏着啥,key:syclovergeek
https://ctf.bugku.com/files/5ca9828f72fd613ea0699d89074d642b/sycgeek-mp3_2.zip
直接使用mp3stego分离:
MP3StegoDecode.exe -X -P syclovergeek sycgeek-mp3.mp3
普通的二维码
来源:XJNU
https://ctf.bugku.com/files/5e480ecb178711e82bc847a208e15b32/misc80.zip
下载图片放到二维码编辑器里查看,得到一句没什么用的话:
拿到winhex里看到最后面有一些特别的数字,都是0-7
想到是一堆八进制数,数字共126个,应该是两个一组或三个一组,经尝试是三个一组,写个python批量转一下:
def trans8to10(n):
return int('0o'+str(n),8)
s = '146154141147173110141166145137171060125137120171137163143162151160164137117164143137124157137124145156137101163143151151041175'
## print(len(s))
## 126
flag = ''
i = 0
while i < 126:
o = int(s[i:i+3])
flag += chr(num_trans.trans8to10(o))
i += 3
print(flag)
乌云邀请码
https://ctf.bugku.com/files/69fed30501c47ddd56250587d359e7d9/misc50.zip
放到stegsolve里发现redplane0、blueplane0、greenplane0中左上角有东西,提取数据:
神秘的文件
解压后里面有个加了密的flag.zip和logo.png,flag.zip里也有个logo.png,猜测是压缩包明文攻击,将logo.png压缩成zip,使用ARCHPR进行明文暴破:
得到一个doc,打开删掉图片看到:
提交发现果然不是真的flag,使用binwalk -e分离doc,在docProps里发现flag.txt,打开看到一段base64,解码得到:
论剑
剑客
十年磨一剑,霜刃未曾试。今日把示君,谁有不平事。
https://ctf.bugku.com/files/934db0621d88bd8b16049c1b795c6a1a/lunjian.jpg
用010editor打开看到中间有一段二进制数据:
转成ascii码:
修改图片高度:
看到:
发现有一段类似7z文件头,修改:
分离后解压发现需要密码,输入刚才转码得到的字符串,得到第二张lunjian.jpg,修改图片高度:
得到:
两张图片对比可得到:
提交但不对,把大括号里的转码为ascii,得到:
图穷匕见
https://ctf.bugku.com/files/f6697e1f904a0c30b56f72fcf0023434/paintpaintpaint.jpg
010editor打开发现很多16进制字符:
转为ascii码发现是很多坐标:
想到可能是二维码。写个 python处理:
from PIL import Image
import re
with open("1.txt") as f:
s = f.read().strip("\n").split("\n")
img = Image.new("RGB", (272, 272))
for coord in s:
x, y = re.findall(r"\d+", coord)
img.putpixel([int(x), int(y)], (255, 255, 255))
img.show()
convert
https://ctf.bugku.com/files/de3b517a9b83b2d35f1a8751e9b80c08/1.txt
打开文件看到很多二进制字符,先写个python转一下:
def trans2to16(n):
return hex(int('0b'+str(n),2))
with open('1.txt', 'r')as f:
s = f.read()
s = trans2to16(s)
print(s)
把得到的hex粘进010editor:
看到rar标志,另存为rar文件,解压,看到图片详细信息里有一段base64:
ZmxhZ3swMWEyNWVhM2ZkNjM0OWM2ZTYzNWExZDAxOTZlNzVmYn0=
转一下即可。
听首音乐
听首音乐放松放松吧~
下载地址:链接: http://pan.baidu.com/s/1gfvezBl 密码: y6gh
使用audacity打开,上面一行放大之后是摩斯电码:
逐个记录下来:
..... -... -.-. ----. ..--- ..... -.... ....- ----. -.-. -... ----- .---- ---.. ---.. ..-. ..... ..--- . -.... .---- --... -.. --... ----- ----. ..--- ----. .---- ----. .---- -.-.
放到在线解密工具里解密即可,注意提交的时候要把小写字母改成大写。
好多数值
flag格式 flag{}
https://ctf.bugku.com/files/093d4073de2c7bfac7466fd166c5d990/1.txt
打开txt看到很多rgb数值,直接分解行数61366=2*61*503,猜想图片是横向显示flag,即像素为宽503,高122,然后 python生成图片即可。脚本如下:
while 1:
n = int(input('请输入一个整数:'))
print('%d='%n,end='')
while n>1:
for i in range(2,n+1):
if n%i==0:
n=int(n/i)
if n==1:
print('%d'%i,end='')
else:
print('%d*'%i,end='')
break
print()
from PIL import Image
import re
x = 503 #x坐标 通过对txt里的行数进行整数分解
y = 122 #y坐标 x*y = 行数
im = Image.new("RGB",(x,y))#创建图片
file = open('rgb.txt') #打开rbg值文件
#通过一个个rgb点生成图片
for i in range(0,x):
for j in range(0,y):
line = file.readline()#获取一行
rgb = line.split(",")#分离rgb
im.putpixel((i,j),(int(rgb[0]),int(rgb[1]),int(rgb[2])))#rgb转化为像素
im.show()
很普通的数独(ISCCCTF)
https://ctf.bugku.com/files/2678e3fdabcb61c0ae67719c27732497/zip
通过看writeup学习了一波...压缩包里的25张图片里有数字的格子代表黑块,没数字的格子代表空白,可以拼成一个二维码。其中1,5,21三张代表定位符的图片故意放错位置,将他们重命名为5,21,1就可以了。
先得到01数字表:
111111101010101000101000001111110000101111111
100000101100111101010011101100011001001000001
101110101110011111010011111101000101001011101
101110101101100010001010000011110001101011101
101110100011100100001111101111111011101011101
100000101100100000011000100001110100001000001
111111101010101010101010101010101011101111111
000000000011001101001000110100110011100000000
110011100100100001111111100100101000000101111
101001001011111111101110101011110101101001100
100000111100100100000110001101001101010001010
001100010011010001010011000100000010110010000
010110101010001111110100011101001110101101111
100011000100011100111011101101100101101110001
001100110100000000010010000111100101101011010
101000001011010111110011011111101001110100011
110111110111011001101100010100001110000100000
110101000010101000011101101101110101101001100
010011111110001011111010001000011011101101100
011001011001010101100011110101001100001010010
010111111111101011111111101101101111111111100
011110001100000100001000101000100100100011110
111110101110011100111010110100110100101010010
110010001011101011101000111100000011100010000
101011111011100111101111111100001010111110010
110100011000111000100111101101111101000100010
111101111110001001000011010110001111110111110
011001010101000110010100010001000101101010001
011101110101101101100100001101101000111101001
110110001001101100010101101111110100101100110
000011100111000000000100001010101111100010010
111010010011110011101110010100001011111010010
101001100010111111110100000100001010101010100
000010011001001101110101001111100101111101101
000010111101110001101011000001000101110100110
011110011010100010100000011011000001110010000
100110100100001101111111101100101110111110011
000000001111110101101000101011100100100011010
111111100011111011011010101101110011101011110
100000101110101101101000111110010001100010001
101110101011100001111111101101001000111111011
101110100110111101101000001001101100011101101
101110100000011101100001101010110010010010001
100000101011001011111011001011000011010110000
111111101010101001111011110101101110000101101
再使用脚本转成图片:
from PIL import Image
x = 45
y = 45
with open('1.txt', 'r')as f:
lines = f.readlines()
img = Image.new("RGB", (x, y))
for j in range(y):
for i in range(x):
if lines[j][i] == '0':
img.putpixel([i, j], (0, 0, 0))
else:
img.putpixel([i, j], (255, 255, 255))
img.save("1.jpg")
扫描得到一段base64,多次解码得到flag。
PEN_AND_APPLE
狗师傅平日里比较害羞,但是又想追女神,于是他隐藏了一段信息在这段自拍中,这句话是他最想对女神说的话:) 你能找到信息,并帮助狗师傅表白成功么:) 视屏在这儿:)
https://ctf.bugku.com/files/2192f6a3bb1978887b4941a286727b56/test.mp4
NTFS交换数据流,使用ntfsstreamseditor.exe或AlternateStreamView.exe扫描并分离,或者使用dos命令:
//隐藏方法:
type flag.png>pen_and_apple.mp4
//查看方法:
dir /r
color
你见过彩虹吗?
使用stegsolve查看七张图片,发现各个0图层里都包含字母,七张图片分别是“make”,“m”,"e","t","a","l","l",拼起来就是make me tall,暗指将图片纵向拉长。
于是使用010editor修改所有图片高度为580,逐个打开发现下面均有20个黑白不一的方块。
将黑记为1,白记为0:
11111111010111101111
11111011111110111111
00001100101010110001
01001010010000001101
11010011011101010111
10011011011010110110
00111001101101111101
联想到每一竖列组成7位二进制数,于是写个脚本批量处理,并将得到的二进制数转Ascii码:
with open('1.txt', 'r')as f:
f = f.read().split('\n')
flag = ''
for i in range(len(f[0])):
s = ''
for j in range(len(f)):
s += f[j][i]
n = int(s, 2)
flag += chr(n)
print(flag)
怀疑人生
https://ctf.bugku.com/files/8d61ff10962c756f9b1d8cd048e9f3c6/zip
解压出来一个压缩包两张图片,第一个压缩包解压提示有密码,查看16进制也不是伪加密,尝试暴力破解,得到解压密码。
解压得到一串base64:
base64解码:
在unicode解码:
可以看出是flag的一部分。再看第二张图片,查看16进制看到文件里还包含压缩包,binwalk -e分离得到一串brainfuck串,解码得到:
本以为这样就结束了,查看大佬writeup知道这是一段base58。base58常用于比特币的钱包地址,相比较base64去掉了数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。找个在线解码工具解码:
最后一张图片直接扫码识别:
直接将三段合起来即为flag:
红绿灯
https://ctf.bugku.com/files/65beb9db8419bd99c0d97068959d2b3e/Traffic_Light.gif
打开gif,看到共有1168帧,大部分是红灯或绿灯,每亮八次灯出现一次黄灯,猜想红灯和绿灯分别代表0或1,黄灯作为一个字节的分割。随后注意到前几个黄灯之后总是先绿灯,而可Ascii打印字符只到127,基本可以确定绿灯代表0,红灯代表1。写个脚本跑一下:
from PIL import Image
im_save = './gif/'
im = Image.open('Traffic_Light.gif')
try:
#tell()取当前帧号;seek()取当前帧图片
im.save(im_save + "{}.png".format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save(im_save + "{}.png".format(im.tell()))
except:
pass
flag = ''
s = ''
for i in range(1168):
image = Image.open(im_save + str(i) + ".png")
## print(image.getpixel((114,54))) #红灯位置,251为亮
## print(image.getpixel((114,144))) #绿灯位置,186为亮
if image.getpixel((114,54)) == 251:
s += '1'
elif image.getpixel((114,144)) == 186:
s += '0'
if len(s) == 8:
s = chr(int(s, 2))
flag += s
s =''
print(flag)
不简单的压缩包
https://ctf.bugku.com/files/e5a937a3985f5264a723bcbd0e062b0f/zip
解压密码是0,foremost分离出第二个压缩包,但也有密码。之后一顿操作没搞出来...等解出来再补充吧...
一枝独秀
翻过四个栅栏即可得到flag
https://ctf.bugku.com/files/21d4804c0a7e2e7e5a3faa31467efa3a/zip
跑出了压缩包密码12345678,打开看到有123个图片,其中第81个图片体积和其他图片不一样,然后就没有然后了...还是太菜
评论