时隔许久详细的复现一下~

这个题目也挺有意思的,刺激学了一遍pyc233

题目提供了一份opcode.txt、elf二进制程序a和一个密文cipher.txt

opcode打开来可以发现是pyc的解析

虽然有code,但是试着用python解析了一下发现有点复杂

读opcode是不可能的,这辈子都不可能的
本来读起来就麻烦,缺少符号信息就更恐怖了,更别说还有lambda和join等等骚方法了

思路转为根据一些关键词来搜索,试图找到该文件的生成方法和逆转换方法。毕竟只要能得到pyc就能通过uncompyle的工具还原出源码

搜了一下找到了几乎完全一样的脚本

然后拿一个正常的pyc打了一份解析出来,对照发现除了code的disassembly以外什么都不缺,这也就意味着根据上述信息是可以还原出pyc的

根据pyc的解析和解析来反填写pyc

比赛的时候是手动搞的,懒得写脚本操作了,本来都不熟悉再出什么bug调起来更慢2333

pyc整体是4字节版本标识+4字节时间戳+一个PyCodeObject。PyCodeObject的内部由若干成员组成。
每个成员的第一个字节是类型标识,然后四个字节表示长度,接着依次列举内部的各个成员

类型标识如下

#define TYPE_NULL               '0'
#define TYPE_NONE               'N'
#define TYPE_FALSE              'F'
#define TYPE_TRUE               'T'
#define TYPE_STOPITER           'S'
#define TYPE_ELLIPSIS           '.'
#define TYPE_INT                'i'
#define TYPE_INT64              'I'
#define TYPE_FLOAT              'f'
#define TYPE_BINARY_FLOAT       'g'
#define TYPE_COMPLEX            'x'
#define TYPE_BINARY_COMPLEX     'y'
#define TYPE_LONG               'l'
#define TYPE_STRING             's'
#define TYPE_INTERNED           't'
#define TYPE_STRINGREF          'R'
#define TYPE_TUPLE              '('
#define TYPE_LIST               '['
#define TYPE_DICT               '{'
#define TYPE_CODE               'c'
#define TYPE_UNICODE            'u'
#define TYPE_UNKNOWN            '?'
#define TYPE_SET                '<'
#define TYPE_FROZENSET          '>'

PyCodeObject的类型标识符是’c’,即0x63

接下来依次是4个参数,argcount, nlocals, stacksize, flags,每个参数4字节小端序表示

然后是co_code,即opcode的字节流,作为一个string保存。类型标识符为’s’,即0x73
string显然需要len来标识接下来的读取范围,因此4字节表示len,后面len个字节就是bytes啦

再往后是consts常量,它是一个tuple。类型标识符为’(‘,0x28。后面4字节表示tuple的len,即元素个数。然后是依次放置各个元素,通常情况下最大PyCodeObject的consts里还会有PyCodeObject,是一个递归的过程。依次向内解析即可。除此以外还会有None(只需要类型标识符’N’即可,无长度无内容)、Int(类型标识符‘I’+4字节值)、String(如前所述,类型标识符’s’+len+content)等等

consts之后是names、varnames、freevars、cellvars四个tuple,空的tuple长度为0即可,否则字符串照样展开就行

然后是filename和name两个string、firstlineno这个四字节表示的常量(不需要类型标识和长度)以及最后一个string,lnotab

全部输入以后通过marshal即可装载,uncompyle系工具就可以成功将其反编译了

明天写个自动化的工具来递归还原~

得到py后发现其将key转为hex后直接通过cdll.LoadLibrary调用函数……所以我折腾这么半天就是为了得到它是把key转hex的结论?!

逆向二进制程序,发现其中的加密方法比较眼熟,其实就是RC4

流密码没什么攻击方法,只能爆破密钥了

根据*号长度猜测key是8位,从最简单的纯数字入手
多线程爆破,启动!

单线程爆了很久都没反应,多线程倒是秒出(:з」∠)运气真好

180626 逆向-SUCTF(Python大法好)相关推荐

  1. swiper 滚回第一个数据_名企必备的数据分析基础技能:Python大法(一)

    现如今,大数据的发展越来越好,也越来越多的企业中大数据分析已经朝着更好的方向发展.也正是因为这个原因,数据分析行业的人才需求也变得火爆起来,尤其是数据分析.数据挖掘.数据科学家等高端人才,越来越稀缺. ...

  2. Python大法之告别脚本小子系列——信息资产收集类脚本编写附源码

    关注头条号,私信回复资料会有意外惊喜呦------最后一张照片有资料呦. 前言 在采集到URL之后,要做的就是对目标进行信息资产收集了,收集的越好,你挖到洞也就越多了............当然这一切 ...

  3. 腾讯爬虫python_【Python爬虫+js逆向】Python爬取腾讯漫画!

    前一段假期期间,博主已经自学完了Python反爬虫的相关内容,面对各大网站的反爬机制也都有了一战之力.可惜因实战经验不足,所以总体来说还是一个字--菜.前两天,在学习并实战爬取了博主最爱看的腾讯动漫后 ...

  4. Python大法之从火车余票查询到打造抢Supreme神器

    本文作者:i春秋作家--阿甫哥哥 系列文章专辑:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=9 ...

  5. Python大法之抛 异常

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 我们来看下都有哪些异常: python标准异常 异常名称 描述 BaseE ...

  6. python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!

    Python 实在是一种让人上瘾的编程语言,简洁的语法+丰富的扩展包,几乎可以用 Python 做任何事情,唯一的黑点似乎就是「慢」,但是与高效的编译语言 C\C++ 互联以后,可以解决脚本语言运行速 ...

  7. python大法之二-一些基础(一)

    个人独立博客出处:http://www.xbman.cn/ 出处:http://www.xbman.cn/article/3 Python是一种解释性计算机编程语言.采用缩进式语法,写起来的感觉有点像 ...

  8. Python大法之告别脚本小子系列—各类URL采集器编写

    本文作者:i春秋签约作家--阿甫哥哥 系列文章专辑:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid ...

  9. b站搬运直播,监测,下载,上传皆由程序完成,Python大法好

    https://github.com/ForgQi/bilibiliupload  在chrome的headless环境下,FFmpeg处理视频流,模拟B站登录,验证登陆成功率还可以,视频分割,线程池 ...

最新文章

  1. leetcode 235. 二叉搜索树的最近公共祖先
  2. 二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树
  3. Android Glide 加载圆形图片(绝对实用)
  4. P1068 分数线划定
  5. __proto__VS。 JavaScript原型
  6. java 社招 简历_招聘java简历模板
  7. 安装Office2010提示缺少MSXML版本6.10.1129.0的解决方法
  8. 吃鸡游戏计算机配置,三款畅玩“吃鸡”游戏电脑配置推荐
  9. Windows键盘鼠标模拟按键类型
  10. android双卡切换流量代码,双卡双待手机流量怎么切换 方法有哪些【图文】
  11. 信息学奥赛(NOIP/CSP-J/S)学习全目录
  12. 计算一班总分 使用的计算机公式是,班级总分统计excle!excle如图所示,怎样按照班级字段,将每班的数学语文英语分数分别求和汇总?...
  13. 腾讯云技术认证考试综述 腾讯云技术认证题库
  14. Java学习 之 画图板 立方体
  15. 网络打印机怎么和计算机连接不上,网络打印机无法连接怎么办?网络打印机设置步骤...
  16. CentOS7 安装cellranger-4.0.0
  17. 【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(一、编译连接前准备)
  18. 分享《生死狙击2》的大场景草渲染
  19. conda中的CUDA和自己安装的CUDA的区别
  20. FileZilla的安装及使用

热门文章

  1. R语言基本统计分析——抽样
  2. 苹果iOS13.2闷杀后台程序,你游戏APP或游戏有中招?PerfDog狗可以帮提前检测
  3. C# .net微软OAuth身份验证在EWS中的应用
  4. SpringBoot(38) 整合 MongoDB
  5. ZOJ3775:?(_o)!
  6. 计算机窗口的跳转列表,win7[开始]菜单和任务栏最近打开的项目(跳转列表)
  7. 这是谁写的代码,给我站出来,保证不打死你!
  8. 点与平面的距离特征_艾孜尔江撰
  9. 陈亮能否成为继阿甘、老王之后,另一个美团灵魂人物?
  10. 化学结构格式SDF的认识