记录Python中一次有趣的解密实验

1. 引言

在这篇文章中,我们来一起尝试在Ubuntu 20.04上解密受密码保护的python 3.4字节编译文件。这次实验的原始文件来自于crackme4,你可以通过这个链接进行获取。
给的提示如下:
在这里插入图片描述
也就是说,如果我们得到正确的密码后,程序会打印出OK。

好嘛,闲话少说,我们直接开始吧!

2. 获取文件信息

首先,我们将其下载在我们的ubuntu上,不妨我们先来查看该文件的基本信息吧。输入命令如下:

$ ls -l

结果如下:

-rw-rw-r-- 1 vagrant vagrant   348 Mar 16 20:58 crackme4

观察上述输出,我们可以获取以下内容:下载的crackme4文件没有可执行权限,不能直接被执行(至少以当前形式)。因此,我们的下一个任务是弄清楚crackme4 的文件类型。
我们可以通过运行以下命令来做到这一点:

$ file crackme4

得到输出如下:

crackme4: python 3.4 byte-compiled

上述输出中提供的信息表明,crackme4文件是一个经过编译的Python 3.4后生成的字节码文件。这意味着原始Python代码已被编译为字节码,字节码是Python解释器可以执行的代码的较低级别表示。

在这里插入图片描述

3. Uncompyle6 的使用

截至目前,我们已经知道该文件为python编译后的字节码,接着我们可以尝试将字节码反编译回源代码。这里强烈推荐使用uncomply6这样的工具可以用来完成这项任务。安装完uncompile6后,我们可以对crackme4文件进行反编译,如下:

$ uncompyle6 crackme4 > crackme4.py

输出结果如下:

# file crackme4
# path crackme4 must point to a Python source that can be compiled, or Python bytecode (.pyc, .pyo)

上述输出表明,即使我们已经知道crackme4是一个python 3.4的字节码文件,但是它也没有适当的扩展名(.pyc或.pyo)进行反编译。好嘛,那我们来对其进行重命名后再来尝试。

$ sudo cp crackme4 crackme4.pyc
$ uncompyle6 crackme4.pyc > crackme4.py

该命令应将反编译的代码写入当前目录中名为crackme4.py的文件中。我们查看该python文件中的内容如下:

# uncompyle6 version 3.9.0
# Python bytecode version base 3.4 (3310)
# Decompiled from: Python 3.8.10 (default, Nov 14 2022, 12:59:47)
# [GCC 9.4.0]
# Embedded file name: 100-crackme.py
# Compiled at: 2017-01-06 00:44:37
# Size of source mod 2**32: 195 bytes
pwd = input('Password: ')
ok = 'Zen of Python'
ok = ok + ' C'
ok = ok[1:3] + ok[3] + ok[14] + ok[3] + ok[7:9] + ok[:6][::-1]
if pwd == ok:
    print('OK')
else:
    print('KO')
# okay decompiling crackme4.pyc

我们来观察下上述输出的一些基本信息,注意上述脚本中的注释信息,总结如下:

  1. 第一行表明了使用uncompyle6 的版本号
  2. 第二行表明了编译该脚本所使用的Python bytecode 的版本号
  3. 第三第四行表明了编译该脚本的PythonGCC版本信息
  4. 第五第六行表明了该脚本的原始文件名和编译日期
  5. 第七行表明了原始脚本所占字节数
  6. 最后一行表明我们使用uncompyle6 成功的将其转化成了python文件

Wow, 成就感越来越强烈啦。。。

在这里插入图片描述

4. 更进一步

接着我们来分析上述的python源代码,我们可以解读出密码从Zen of Python的原始字符串发生了如下变化:

  • 密码被分配给一个名为ok的变量。
  • 字符C被添加到Python的字符串结尾,此时Zen of Python将会被转化为Zen of Python C
  • 最后密码被一顿操作,得到最终的形式en C Pyfo neZ

我们可以手动将上述代码拷贝到crackme4_automated.py文件,执行后得到相应的密码:

#!/usr/bin/python3
ok = 'Zen of Python'
ok = ok + ' C'
ok = ok[1:3] + ok[3] + ok[14] + ok[3] + ok[7:9] + ok[:6][::-1]
print(ok)

输出如下:

en C Pyfo neZ

5. 验证

经过跋山涉水,我们获得了密码为en C Pyfo neZ , 接着我们对其做最后的验证,执行命令如下:

vagrant@ubuntu-focal:~/0x17.c$ python3 crackme4.py
Password: en C Pyfo neZ
OK
vagrant@ubuntu-focal:~/0x17.c$

提示我们输入密码,我们将得到的字符串进行输入后,终于得到了我们最终的OK输出。
搞定,吃饭去啦~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sgzqc/article/details/129633770