怀疑人生
拿到一个名字为zip的文件,将其命名为1.zip,解压后得到了如下图所示的一个文件夹
对于第一个ctf1.zip,尝试去解压,发现要用密码。没有找到相关的提示,考虑直接用爆破。得到密码为:password
解压后得到一串字符:
XHU2Nlx1NmNcdTYxXHU2N1x1N2JcdTY4XHU2MVx1NjNcdTZiXHU2NVx1NzI=
base64解码后为:
\u66\u6c\u61\u67\u7b\u68\u61\u63\u6b\u65\u72
这是一个unicode编码无疑了,再去解码:
得到了:flag{hacker
先放在这儿。
然后去看ctf2.jpg。用十六进制查看器去看图,发现了结束部分是一个zip文件。
ZIP的文件头为:50480304 尾是:504B
直接将图片改为.zip的压缩文件,解压后得到了下面的东西:
… … …! ?!!.? … … …? .?!.? …! .?.. … …
…!?! !.?.. … … …?.? !.?.. … … … … !.?.. …
… .!!! .!!! !!! ??? .?!.? !!! !!! !!! .?.. …! ?!!.?
!!! !?.?! .!!! !!! !!! .!!!. ?.. … … .!!! .?.. …
… .?.?! .?!.? .
这是Ook!编码,在线去解码(网址: https://www.splitbrain.org/services/ook)
得到了一个字符串,这是一个base58编码的,没有找到一个好用的在线解码,用python实现解码:
__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
__b58base = len(__b58chars)
def b58encode(v):
""" encode v, which is a string of bytes, to base58.
"""
long_value = int(v.encode("hex_codec"), 16)
result = ''
while long_value >= __b58base:
div, mod = divmod(long_value, __b58base)
result = __b58chars[mod] + result
long_value = div
result = __b58chars[long_value] + result
# Bitcoin does a little leading-zero-compression:
# leading 0-bytes in the input become leading-1s
nPad = 0
for c in v:
if c == '\0':
nPad += 1
else:
break
return (__b58chars[0] * nPad) + result
def b58decode(v):
""" decode v into a string of len bytes
"""
long_value = 0L
for (i, c) in enumerate(v[::-1]):
long_value += __b58chars.find(c) * (__b58base ** i)
result = ''
while long_value >= 256:
div, mod = divmod(long_value, 256)
result = chr(mod) + result
long_value = div
result = chr(long_value) + result
nPad = 0
for c in v:
if c == __b58chars[0]:
nPad += 1
else:
break
result = chr(0) * nPad + result
return result
if __name__ == "__main__":
print b58decode("3oD54e")
解码结果为:misc
最后一张图片,看着像二维码,直接用工具去解码:
得到了12580}
。得到flag{hackermisc12580}
红绿灯
拿到图片后发现是一个gif的动图。用StegSolve打开。Analyse ->Frame Browser。可以看到一共有1168帧。
观察前几帧发现大部分是红绿交替,每出现8次红绿就出现一次黄。前一个周期为 green red red green green green red red green. yellow。把green 看成0,red 看成1,yellow看成间隔。那么可以表示为 66h。代表ascii中的f。可以把所有变化的二进制写出来(当然会有些繁琐)。也可以写一个python脚本去跑出来。
from PIL import Image
savepath='D:\\gif\\'
im=Image.open('D:\\Traffic_Light.gif')
try:
im.save(savepath+'light{0}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save(savepath+'light{0}.png'.format(im.tell()))
except:
pass
flag=""
for i in range(1168):
image=Image.open(savepath+'light'+str(i)+'.png')
if image.getpixel((115,55))==251:
flag+=str(1)
elif image.getpixel((115,145))==186:
flag+=str(0)
flag= hex(int(flag,2))[2:-1].decode('hex')
print flag
结果如图:
flag{Pl34s3_p4y_4tt3nt10n_t0_tr4ff1c_s4f3ty_wh3n_y0u_4r3_0uts1d3}
细心的大象
下载文件,是一个叫1.jpg.zip的压缩文件。解压后得到了一张1.png的图片。右键,属性,查看一下详细信息,得到一串字符串。
TVNEUzQ1NkFTRDEyM3p6
应该是密码吧,先放在这里。去看一下图片1.jpg。用十六进制查看器去看一下图片的数据流。
可以看到在jpg文件尾部FF D9后面有一个rar文件头表示:52 61 72 21,应该是在图片中隐藏了一个压缩包。放到kali中分析一下
用foremost命令分离一下。得到了一个rar压缩包,打开要密码,输入一下上面得到的密码。密码错误!用base64解一下上面得到的字符串,再输入过去,正确!得到了一张png的图片,好像见过吧**
用十六进制工具打开,找到控制png图片的长度和高度字段(在字符IHDR后8个字节,前4个字节控制宽度,后4个字节控制高度。去修改后四个字节,修改宽度可能出错).
这儿将420改成500,保存后再看一下图片
得到flag.