bad_python

攻防世界 (xctf.org.cn)

前戏

下载文件,解压完成后是这个

一个pyc文件

这里要用到python的反编译

要用到的工具有两个

1.python自带的uncompyle6

2.pycdc文件——比uncompyle6强大一点

我们一个一个来尝试一下

uncompyle6:

我是直接在pycharm里面终端用的

把文件放在这个目录下

你需要先安装

然后输入这个命令(在cmd里面也行)

一般来说就OK了

但是这道题考点是进一步的

这是运行了,但是运行出错

最后得到的这个py文件是0kb的,什么都没有

至于后续,我先讲另一种方法,比较常用的

pycdc:

首先你要去下载一个pycdc文件(52上面有)

这样输入,你就会得到一个py文件,名字叫做1.py

但是是0kb

修改文件头

这个MAGIC是指pyc的文件头是坏的

pyc的文件头,我用010editor给大家打开看一下

蓝色标记这部分就是pyc文件的文件头

它包含的信息包括:

前四个字节——版本信息,比如python的3.6,3.8等

中间8个字节——不用管,修改时间而已,对我们来说没有

后面四个字节——包含大小信息和校验码(我也不确定,反正有用)

一般这种错误就是因为这个文件的文件头信息被修改了,我们需要去修复,也就是将文件头修复正确中间我们最重要的一步就是找到他是什么版本的pyc文件,不同版本的文件头不同

我们先给出答案,这道题的版本是3.6,我们可以从两个地方看出来

一:文件名字

还记得最开始文件名那么长的字符吗,你是不是就下意识忽略了,我们在回过头看一下(当时我也没看出来)

3.6版本

二:文件头

这个33 0D 就是3.6版本的文件名开头,他只是修改了后面的部分

然后下面就是我们找到正确的3.6版本的文件头是怎样的了

我是直接百度的,当然厉害的就是自己用3.6版本的python写一个pyc文件,放在010里面去看

橘黄色的就是改的

现在跑出来的py文件就有3KB了

后面就算正常的IDA静态分析了

IDA分析

因为这是个py文件,我们可以直接放入python中去看,他也只有3KB,代码不是很多,就不麻烦IDA了,你要放在IDA里面去看也行

# Source Generated with Decompyle++
# File: 1.pyc (Python 3.6)from ctypes import *
from Crypto.Util.number import bytes_to_long
from Crypto.Util.number import long_to_bytesdef encrypt(v, k):v0 = c_uint32(v[0])v1 = c_uint32(v[1])sum1 = c_uint32(0)delta = 195935983for i in range(32):v0.value += (v1.value << 4 ^ v1.value >> 7) + v1.value ^ sum1.value + k[sum1.value & 3]sum1.value += deltav1.value += (v0.value << 4 ^ v0.value >> 7) + v0.value ^ sum1.value + k[sum1.value >> 9 & 3]return (v0.value, v1.value)if __name__ == '__main__':flag = input('please input your flag:')k = [255,187,51,68]if len(flag) != 32:print('wrong!')exit(-1)a = []for i in range(0, 32, 8):v1 = bytes_to_long(bytes(flag[i:i + 4], 'ascii'))v2 = bytes_to_long(bytes(flag[i + 4:i + 8], 'ascii'))a += encrypt([v1,v2], k)enc = [0xEEC7D402L,0x99E9363FL,0x853BDE61L,558171287,0x908F94B0L,1715140098,986348143,1948615354]for i in range(8):if enc[i] != a[i]:print('wrong!')exit(-1)print('flag is flag{%s}' % flag)

就是这么个事

直接开干吧

这段代码可能新手比较懵逼

这个<<4,就是在二进制表示下,把整个数往左边移动4位,就也是变大了2的四次方大

这个>>7就是右移7次,就是表现2的七次方小,向下取整

然后这个&3就是在二进制层面按位与

3是11,8是11000

1000

0011

相同位置如果都是1,那么得到1,不同为0

得到的结果就是

0000

对应这段代码我很懵逼

然后我去实验了下

825307441

然后把1111又换成了aaaa,也是一串数字

得到了这个数字,然后感觉就是把4个字符串转换成为了一个数字,感觉和base64作用差不多

就是把每个字符的ASCII码提出来,然后通过一些算法组合在一起

这里我采用的就是暴力的方法的,硬跑

加上这个直接全部遍历一遍

(抄一个吧,不想写了)

我是废物

enc = [63912563639333235,63912563820295007,63912563319981409,63912564160552784,63912564260890672,63912564074962770,63912563086615890,63912564159242032]
flag = bytearray(32)
for i in range(8):flag[4 * i] = (enc[i] >> 24) & 0xFFFFFFFF & 0xFFflag[4 * i + 1] = (enc[i] >> 16) & 0xFFFFFFFF & 0xFFflag[4 * i + 2] = (enc[i] >> 8) & 0xFFFFFFFF & 0xFFflag[4 * i + 3] = (enc[i] & 0xFFFFFFFF & 0xFF)print(flag)
#bytearray(b'Th1s_1s_A_Easy_Pyth0n__R3veRse_0')

看不懂为啥这样就OK了,我是废物!~

但是废物也要下班拉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写

Stm32 CubeIDE对RTC的日期、时间读写&#xff0c;后备存储的读写&#xff0c;一折腾又是好多的问题&#xff0c;现在梳理一下&#xff0c;后面的不要过多踩坑了。 用STM32CubeIDE生成代码 这里有时间和日期的设置&#xff0c;在代码中也会生成相应的代码&#xff0c;首次设置后…

Spark读写Doris数据

1 准备Spark环境 创建maven工程,编写pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocati…

文字识别(OCR)专题——基于NCNN轻量级PaddleOCRv4模型C++推理

前言 PaddleOCR 提供了基于深度学习的文本检测、识别和方向检测等功能。其主要推荐的 PP-OCR 算法在国内外的企业开发者中得到广泛应用。在短短的几年时间里&#xff0c;PP-OCR 的累计 Star 数已经超过了32.2k&#xff0c;常常出现在 GitHub Trending 和 Paperswithcode 的日榜…

第二节JavaScript 语法、语句、注释、变量、数据类型等

一、JavaScript语法 1、JavaScript字面量 数字&#xff08;Number&#xff09;字面量&#xff1a;可以是整数或者是小数、或者是科学计数。 如&#xff1a;3.14 、1001 、123e5 字符串&#xff08;String&#xff09;字面量&#xff1a;可以使用单引号或双引号。 例如&…

Linux:/dev/mapper/centos-root 100%问题

思路1 切换到 / 目录下&#xff0c;看下是哪个目录占用的比较大 cd / du -h -x --max-depth1 思路2 直接查找大文件&#xff0c;查找大于100m的文件&#xff0c;可以根据实际情况&#xff0c;适当调整查找的文件大小 find / -type f -size 100M 思路3 使用lsof命令查看是否有占…

springboot(ssm房屋租赁系统 在线租房平台Java(codeLW)

springboot(ssm房屋租赁系统 在线租房平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09…

【算法】算法题-20231205

这里写目录标题 一、LCS 01. 下载插件二、已知一个由数字组成的列表&#xff0c;请将列表中的所有0移到右侧三、实现一个trim()函数&#xff0c;去除字符串首尾的空格&#xff08;不能使用strip()方法&#xff09; 一、LCS 01. 下载插件 简单 小扣打算给自己的 VS code 安装使…

FileIUtils 最佳实践

import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class FileIUtils {删除文件夹及文件夹下的所有文件 public static void deleteDirAndFiles(String path) throws Exception {File fil…

全球与中国仿制药市场:增长趋势、竞争格局与前景展望

仿制药是指在剂型、功效、给药方法、品质、性能特征、用途等方面与原厂药相似并已获得原厂药上市许可的药品。仿制药的价格低于品牌药。糖尿病、癌症和心血管疾病等慢性疾病的快速成长推动了仿制药市场的成长。此外&#xff0c;仿制药的实惠价格以及最新产品的批准和推出也有助…

ViVo小游戏对接sdk

1.安装环境&#xff1a; 电脑环境&#xff1a;adb环境和oppo一样&#xff0c;npm环境和oppo一样 升级npm&#xff1a; npm install -g npm 清除npm缓存&#xff1a;npm cache clean -f 安装vivo初始化小游戏的工具&#xff1a; npm install -g vivo-minigame/cli 解决办法&…

前端知识笔记(三十四)———HBuilder的下载与使用(详细步骤)

一、HBuilder IDE的下载 HBuilder下载官网地址&#xff1a; 在地址栏中直接输入https://www.dcloud.io 或者直接点击下面的链接 DCloud - HBuilder、HBuilderX、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 进入官网&#x…

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后&#xff0c;各大平台软件常常会邀请用户在口味&#xff0c;配送速度等多个方面给与评分。在 element-ui 组件中&#xff0c;已经有相应的 Rate 组件&#xff0c;但是已有组件…

手搭手浅学状态管理VueX

https://vuex.vuejs.org/zh/guide/ 每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store”基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同&#xff1a; Vuex 的状态存储是响应式的。当 Vu…

Oracle(2-9) Oracle Recovery Manager Overview and Configuration

文章目录 一、基础知识1、User Backup VS RMAN2、Restoring &Recovering DB 还原&恢复数据库3、Recovery Manager Features 管理恢复功能4、RMAN Components RMAN组件5、Repository1: Control File 存储库1:控制文件6、Channel Allocation 通道道分配7、Media Manageme…

举例C#使用特性排除某些类成员不参与XML序列化和反序列化

在C#中&#xff0c;可以使用 [XmlIgnore] 特性来排除某些类成员不参与XML序列化和反序列化。这个特性告诉XML序列化器忽略被标记的成员。 以下是一个使用 [XmlIgnore] 特性的示例&#xff1a; using System; using System.IO; using System.Xml.Serialization;public class P…

[Azure]azure磁盘加密(Windows/Linux) ADE(Azure Disk Encryption)

Azure 磁盘加密用于保护数据&#xff0c;对于Windows使用BitLocker对磁盘进行加密&#xff0c;同时与Key Vault集成&#xff0c;控制和管理Key和Secret。 本文利用Potal对磁盘进行加密 注&#xff1a;Azure DIsk Encryption 可能会导致VM重启&#xff0c;对VM造成影响&#xff…

Linux下安装MySQL 5.7

1、下载安装包 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2、安装MySQL包 yum -y install mysql57-community-release-el7-10.noarch.rpm 3、安装MySQL yum -y install mysql-community-server 如果出现下图失败情形&#xff0c;则…

基于Docker构建Python开发环境

1. Dockerfile dockerfile所在目录结构 FROM python:3.8 WORKDIR /leo RUN apt-get install -y wget RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai >/etc/timezone # ssh免密登录 COPY id_rsa.pub /leo RUN mkdir ~/.s…

JavaScript的注意事项(纯文字,无代码)

以下是关于JavaScript的注意事项&#xff1a; #始终使用分号 JavaScript是一门解释性的语言&#xff0c;因此在编写代码时&#xff0c;使用分号可以防止程序在运行时出现问题。在一个语句末尾加上分号可以告诉解释器&#xff0c;该语句已经结束&#xff0c;可以继续执行下一条…

[ROS2] --- ROS2安装

ROS2安装到Ubuntu2204系统中&#xff0c;安装步骤如下&#xff1a; 1 设置编码 $ sudo apt update && sudo apt install locales $ sudo locale-gen en_US en_US.UTF-8 $ sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 $ export LANGen_US.UTF-82 添加源 $…