题目为一张png图片
foremost分离得到一个docx文件和一个加密压缩包
docx文件分离可得flag.xml
打开flag.xml,一片空白,全选后发现有东西,应该是隐藏文字,复制下来用sublime打开
把点和横杠记录下来
.--..--..--.--...--....-.--..---.----.--..--..-...---.....--......--.--...--...-..--......--.-.-.--..--...-.--.-.--..-.-.--...--..--.-....--..--..-.--.-
以0为点1为横杠转化成01字符串,再做处理,可得前半部分flag
#coding:utf-8
s = '.--..--..--.--...--....-.--..---.----.--..--..-...---.....--......--.--...--...-..--......--.-.-.--..--...-.--.-.--..-.-.--...--..--.-....--..--..-.--.-'
k = ''
for i in s:
if i == '.':
k += '0'
else:
k+='1'
a = ''
b = [102,108,97,103,123,50,56,48,54,49,48,53,102,45,101,99,52,51,45]
for j in range(19):
a += chr(b[j])
print a
#flag{2806105f-ec43-
b数组是由01字符串转化而得,舍去了尾部的一些字符
至此,前半部分完成
再看压缩包,需要密码
打开docx文件,可以看到一堆base64字符串,是base64隐写,从网上获得解码代码
#coding:utf-8
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def solve_stego():
with open('123456.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
print diff
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
print goflag(bin_str)
def goflag(bin_str):
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
return res_str
if __name__ == '__main__':
solve_stego()
得到一堆字符串
由压缩包注释可知密码为I4mtHek3y@
在线反编译leaf.pyc可得
#! /usr/bin/env python 3.6 (3379)
#coding=utf-8
# Compiled at: 2019-09-04 01:49:32
#Powered by BugScaner
#http://tools.bugscaner.com/
#如果觉得不错,请分享给你朋友使用吧!
from numpy import *
from random import random
import turtle as t
t.reset()
x = array([[0.5], [0.5]])
p = [0.85, 0.92, 0.99, 1.0]
A1 = array([[0.85, 0.04],
[
-0.04, 0.85]])
b1 = array([[0], [1.6]])
A2 = array([[0.2, -0.26],
[
0.23, 0.22]])
b2 = array([[0], [1.6]])
A3 = array([[-0.15, 0.28],
[
0.26, 0.24]])
b3 = array([[0], [0.44]])
A4 = array([[0, 0],
[
0, 0.16]])
cnt = 1
while True:
cnt += 1
if cnt == 2000:
break
r = random()
if r < p[0]:
x = dot(A1, x) + b1
else:
if r < p[1]:
x = dot(A2, x) + b2
else:
if r < p[2]:
x = dot(A3, x) + b3
else:
x = dot(A4, x)
t.color('green')
t.color('green')
t.up()
t.goto(x[0][0] * 50, x[1][0] * 40 - 240)
t.down()
t.dot()
hint = 'I am not the reverse'
在kali下用stegosaurus解密可得后半部分flag