因为不知道题目的名字,所以只能用附件的名称来命名(ps:哈哈哈),作为取证菜鸡只能慢慢学取证了。
链接:https://pan.baidu.com/s/1eCTxufX9KC1WNHbEEF7wSA
提取码:ki9z
random.seed()
seed()没有参数时,每次生成的随机数是不一样的,而当seed()有参数时,每次生成的随机数是一样的,同时选择不同的参数生成的随机数也不一样
random.getrandbits(8)
返回一个八位大小的随机整数。
定义了一个随机数的种子之后,那么random.getrandbits获得的随机数就是固定的
random.seed('5fba44bfdd012bed894920549c673264')
os.environ
查看的是环境变量
PIL的convert
volatility -f imagin.vmem imageinfo
volatility -f imagin.vmem --profile=Win7SP1x64 iehistory
在iehistory发现了东西
使用filescan命令,查看他们的PID
volatility -f imagin.vmem --profile=Win7SP1x64 filescan | grep -E 'png|out.py'
volatility -f imagin.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000003e9b29f0 -D ./
import os
import random
from Crypto.Util import number
from PIL import Image
env = os.environ
sed = env['cd1b9deda998c9104566329dc812c849']
random.seed(sed)
flag = open('flag','r').read()
key = number.long_to_bytes(random.getrandbits(len(flag)*8))
res = []
for i in range(len(flag)):
res.append(flag.encode()[i]^key[i])
res = bytes(res)
assert(len(res)==38)
c = bin(number.bytes_to_long(res))[2:]
assert(len(c)==304)
back = Image.open('1.png').convert('L')
a,b = back.size
c_p = Image.new('L',(a,b))
for y in range(b):
for x in range(a):
if x+a*y <len(c):
if c[x+a*y] == '1':
c_p.putpixel((x,y),back.getpixel((x,y)) if back.getpixel((x,y))%2 == 1 else back.getpixel((x,y))+1)
else:
c_p.putpixel((x,y),back.getpixel((x,y)) if back.getpixel((x,y))%2 == 0 else back.getpixel((x,y))-1)
else:
c_p.putpixel((x,y),back.getpixel((x,y)))
c_p.convert('RGB').save('c.png')
发现是利用了python对flag进行了一些处理,把数据处理之后写进了图片里。那就需要把脚本逆一下了。
然后发现脚本使用了os.environ,那就需要通过取证获得这个数据
volatility -f imagin.vmem --profile=Win7SP1x64 envars
5fba44bfdd012bed894920549c673264
然后就可以根据加密的脚本写解密了(ps:代码能力比较菜只能根据师傅的脚本抄一下)
import random
from PIL import Image
from Crypto.Util import number
import os
env = os.environ
random.seed('5fba44bfdd012bed894920549c673264')
img = Image.open('c.png').convert('L')
a,b = img.size
# print(a,b)
c = ['']*304
# print(len(c))
for y in range(b):
for x in range(a):
if x + a*y <len(c):
if img.getpixel((x,y))%2 == 1:
c[x+a*y] = '1'
else:
c[x+a*y] = '0'
# print(c)
key = number.long_to_bytes(random.getrandbits(38*8))
print(key)
str_c = ''.join(c)
str_c = int(str_c,2)
str_c = number.long_to_bytes(str_c)
# print(str_c)
flag = []
for i in range(38):
flag.append(chr(str_c[i]^key[i]))
print(''.join(flag))
flag{7f958aaef5f88ebf67f8ecc89c7c271b}