记录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
我们来观察下上述输出的一些基本信息,注意上述脚本中的注释信息,总结如下:
- 第一行表明了使用
uncompyle6
的版本号 - 第二行表明了编译该脚本所使用的
Python bytecode
的版本号 - 第三第四行表明了编译该脚本的
Python
和GCC
版本信息 - 第五第六行表明了该脚本的原始文件名和编译日期
- 第七行表明了原始脚本所占字节数
- 最后一行表明我们使用
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
输出。
搞定,吃饭去啦~
记录Python中一次有趣的解密实验相关推荐
- Python中几个有趣的函数
众所周知,python功能强大.语法灵活,这些得益于其丰富而强大的库.除了众多第三方库和方法函数,python自带的很多函数也非常有趣,用起来称得上优雅. 很多人学习python,不知道从何学起. 很 ...
- 【干货】Python中几个有趣的函数
01 一用而过:lambda 很多语言都有匿名函数,python的匿名函数写作lambda,当需要实现一定功能而又不想"大张旗鼓"的def一个函数时,lambda就是最优的选择. ...
- 记录python中itertools中product()函数用法
product用于对多个可迭代对象中的逐个元素的笛卡尔坐标乘积,这里解释一下,所谓的笛卡尔乘积其实就是类似于(x,y)坐标的这种组合,只不过名字高大上一些.可以理解成是求取多个可迭代对象的排列组合. ...
- python中 r是什么意思_python中\r的意义及用法
\r的意义 \r 表示将光标的位置回退到本行的开头位置 \b表示将光标的位置回退一位 在python里print会默认进行换行,可以通过修改参数让其不换行 (1) python2中可以在print语句 ...
- python中with是什么意思,Python中With的用法
在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...
- 关于Python中字典的赋值
在研究一段源码中,发现字典赋值时,使用双等号,可以将前面字典的值赋给后面的字典.源码如下: contents = {} mtl = contents["a"] = {} mtl[& ...
- python中readlines_python中read() readline()以及readlines()区别
该篇文章主要是记录python中操作文件的三个函数read(),readline()以及readlines()之间的区别. 首先先给出结论:.read() 每次读取整个文件,它通常将读取到底文件内容放 ...
- python中read() readline()以及readlines()对比(转)
该篇文章主要是记录python中操作文件的三个函数read(),readline()以及readlines()之间的区别. 首先先给出结论: .read() 每次读取整个文件,它通常将读取到底文件内容 ...
- python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...
最新文章
- 完全基于Transformer的目标检测器,ICLR匿名论文实现视觉、检测统一
- Application Loader:上传卡在App Store正在通过iTunes Store鉴定
- 线性表【项目 - 求集合并集C语言】
- 八部委宰割C类电商 消费者必遭殃
- if-else嵌套太深?教你一个新手都能掌握的设计模式搞定!
- php radius类,PHP Radius Search
- 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)
- kotlin 类构造函数_Kotlin类– Kotlin构造函数
- 设计模式-建造者模式(Builder Pattern)
- python自定义标识符_《Python 3程序开发指南(第2版•修订版)》——第2章 数据类型 2.1 标识符与关键字...
- 微信堆木头html5小游戏源码
- 完全卸载Oracle方法(超详细)
- java时间的格式化_java如何给时间格式化
- 团队协作工具-版本控制软件SVN、Git、码云
- 对_stdcall 的理解 (转)
- [AHK]定时运行脚本
- QT中QFile读写txt乱码问题|Windows10
- 腾讯云直播产品系列(一):标准直播POC实践
- TCP/IP协议——TCP协议
- The Relationship Cure