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输出。
搞定,吃饭去啦~

记录Python中一次有趣的解密实验相关推荐

  1. Python中几个有趣的函数

    众所周知,python功能强大.语法灵活,这些得益于其丰富而强大的库.除了众多第三方库和方法函数,python自带的很多函数也非常有趣,用起来称得上优雅. 很多人学习python,不知道从何学起. 很 ...

  2. 【干货】Python中几个有趣的函数

    01 一用而过:lambda 很多语言都有匿名函数,python的匿名函数写作lambda,当需要实现一定功能而又不想"大张旗鼓"的def一个函数时,lambda就是最优的选择. ...

  3. 记录python中itertools中product()函数用法

    product用于对多个可迭代对象中的逐个元素的笛卡尔坐标乘积,这里解释一下,所谓的笛卡尔乘积其实就是类似于(x,y)坐标的这种组合,只不过名字高大上一些.可以理解成是求取多个可迭代对象的排列组合. ...

  4. python中 r是什么意思_python中\r的意义及用法

    \r的意义 \r 表示将光标的位置回退到本行的开头位置 \b表示将光标的位置回退一位 在python里print会默认进行换行,可以通过修改参数让其不换行 (1) python2中可以在print语句 ...

  5. python中with是什么意思,Python中With的用法

    在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...

  6. 关于Python中字典的赋值

    在研究一段源码中,发现字典赋值时,使用双等号,可以将前面字典的值赋给后面的字典.源码如下: contents = {} mtl = contents["a"] = {} mtl[& ...

  7. python中readlines_python中read() readline()以及readlines()区别

    该篇文章主要是记录python中操作文件的三个函数read(),readline()以及readlines()之间的区别. 首先先给出结论:.read() 每次读取整个文件,它通常将读取到底文件内容放 ...

  8. python中read() readline()以及readlines()对比(转)

    该篇文章主要是记录python中操作文件的三个函数read(),readline()以及readlines()之间的区别. 首先先给出结论: .read() 每次读取整个文件,它通常将读取到底文件内容 ...

  9. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

最新文章

  1. 完全基于Transformer的目标检测器,ICLR匿名论文实现视觉、检测统一
  2. Application Loader:上传卡在App Store正在通过iTunes Store鉴定
  3. 线性表【项目 - 求集合并集C语言】
  4. 八部委宰割C类电商 消费者必遭殃
  5. if-else嵌套太深?教你一个新手都能掌握的设计模式搞定!
  6. php radius类,PHP Radius Search
  7. 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)
  8. kotlin 类构造函数_Kotlin类– Kotlin构造函数
  9. 设计模式-建造者模式(Builder Pattern)
  10. python自定义标识符_《Python 3程序开发指南(第2版•修订版)》——第2章 数据类型 2.1 标识符与关键字...
  11. 微信堆木头html5小游戏源码
  12. 完全卸载Oracle方法(超详细)
  13. java时间的格式化_java如何给时间格式化
  14. 团队协作工具-版本控制软件SVN、Git、码云
  15. 对_stdcall 的理解 (转)
  16. [AHK]定时运行脚本
  17. QT中QFile读写txt乱码问题|Windows10
  18. 腾讯云直播产品系列(一):标准直播POC实践
  19. TCP/IP协议——TCP协议
  20. The Relationship Cure

热门文章

  1. 计算机毕业设计(21)java毕设作品之销售电子书小说阅读系统
  2. 程序员一定要感恩那个带你上道的人
  3. 软件神器推荐,轻巧简洁效率高,好不好用你说的算!
  4. 三大框架之spring框架+IoC控制反转、DI依赖注入
  5. 中国邮政领取Google AdSense 西联汇款表单填写样本(附图)
  6. iOS 什么时候调用dealloc
  7. IndexOf判断字符串是否存在
  8. python面试情景题_50道python笔试面试真题大集合
  9. 内网穿透之使用神卓互联V8.5.9客户端访问用友ERP系统
  10. xlwt设置单元格格式