imagin.vmem取证

前言

因为不知道题目的名字,所以只能用附件的名称来命名(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

imagin.vmem取证_第1张图片

volatility -f imagin.vmem --profile=Win7SP1x64 iehistory

在iehistory发现了东西
imagin.vmem取证_第2张图片使用filescan命令,查看他们的PID

volatility -f imagin.vmem --profile=Win7SP1x64 filescan | grep -E 'png|out.py'

imagin.vmem取证_第3张图片

volatility -f imagin.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000003e9b29f0   -D ./

使用dumpfiles将其导出来,得到imagin.vmem取证_第4张图片

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

imagin.vmem取证_第5张图片然后就得到了

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}

你可能感兴趣的:(misc,python)