黄河流域公安院校网络空间安全技能挑战赛 QAQ 题解

news2024/11/18 3:34:48

目录

一.获取pyc文件

二.反编译出.py源码

三.程序逻辑

1.第一个限制条件

2.第二段

3.第三段


这题是对python打包成的可执行程序逆向

如果对如何反编译.pyc和.py文件有疑问可以参考:

Python逆向基本操作步骤——以杭电新生赛hgame week2 reverse stream(python3.10逆向)为例

一.获取pyc文件

在qaq.exe所在目录打开cmd使用命令:python pyinstxtractor.py qaq.exe

成功后会输出一个_extracted文件夹

在文件夹内找到qaq.pyc和struct.pyc这两个文件

 用winhex或者其他软件打开,查看16进制下的信息,前两行是magic head,这里qaq.pyc和struct.pyc文件的前两行相同,所以不需要修复

二.反编译出.py源码

在qaq.pyc文件所在目录打开cmd,使用命令: pycdc.exe qaq.pyc,成功输出源码

en = [
    3,
    37,
    72,
    11,
    6,
    132]
output = [
    105,
    97,
    23,
    78,
    121,
    48,
    108,
    65,
    99,
    52,
    181,
    177,
    98,
    53,
    67,
    29,
    41,
    120,
    60,
    101,
    51,
    103,
    105,
    109,
    121,
    50]
print('welcome to SDPCSEC2023')
flag = input('please input your flag:')
str = flag
a = len(str)    #flag长度>=37
if a < 37:
    print('lenth wrong!')
    exit(0)             #前四个字符的限制条件
if ord(str[0]) + 2023 * ord(str[1]) + 2023 * ord(str[2]) + 2023 * ord(str[3]) == 623186:    #第一个限制条件
    print('good!continue')
else:
    print('bye~')
    exit(0)

# f}Mj bjk2x1Jg2e516a8f0an7a5éí1z
x = []
k = 5           #中间26个,所以flag[4]需要爆破
for i in range(13): #0到12
    b = ord(str[k])     #第六个字符,8,10,12
    c = ord(str[k + 1]) #第七个字符,9,11,13
    a11 = c ^ en[i % 6]
    a22 = b ^ en[i % 6]
    x.append(a11)   #先添加奇数下标对应字符
    x.append(a22)   #每次循环添加两个字符
    k += 2
if x == output:
    print('good!continue')
else:
    print('oh,you are wrong!')
    exit(0)
l = len(str)
v1 = ord(str[l - 7])    #倒数第七个
v2 = ord(str[l - 6])
v3 = ord(str[l - 5])
v4 = ord(str[l - 4])
v5 = ord(str[l - 3])
v6 = ord(str[l - 2])    #倒数第二个
#aef_75
if v1 * 3 + v2 * 2 + v3 * 5 == 1003 and v1 * 4 + v2 * 7 + v3 * 9 == 2013 and v1 + v2 * 8 + v3 * 2 == 1109 and v1 * 3 + v5 * 2 + v6 * 5 == 671 and v4 * 4 + v5 * 7 + v6 * 9 == 1252 and v4 + v5 * 8 + v6 * 2 == 644:
    print('you get the right flag!')

三.程序逻辑

1.第一个限制条件

if ord(str[0]) + 2023 * ord(str[1]) + 2023 * ord(str[2]) + 2023 * ord(str[3]) == 623186:

当时很奇怪的是只有对前四个字符这一条限制条件,这一条方程组如果爆破的话会有很多组解

而且对第五个字符并没有任何操作,后续突然明白前五个字符和最后一个字符是 flag{} 

2.第二段

这段代码的作用是对flag[]下标为5到30的共26个字符进行加密,仔细看是简单的异或操作

x = []
k = 5           #中间26个,所以flag[4]需要爆破
for i in range(13): #0到12
    b = ord(str[k])     #第六个字符,8,10,12
    c = ord(str[k + 1]) #第七个字符,9,11,13
    a11 = c ^ en[i % 6]
    a22 = b ^ en[i % 6]
    x.append(a11)   #先添加奇数下标对应字符
    x.append(a22)   #每次循环添加两个字符
    k += 2
if x == output:

脚本:

out = [
    105,
    97,
    23,
    78,
    121,
    48,
    108,
    65,
    99,
    52,
    181,
    177,
    98,
    53,
    67,
    29,
    41,
    120,
    60,
    101,
    51,
    103,
    105,
    109,
    121,
    50]

en = [
    3,
    37,
    72,
    11,
    6,
    132]

k=0
s=""
for i in range(13):
    a11=out[k]
    a22=out[k+1]
    b=a22^en[i%6]
    c=a11^en[i%6]
    s+=chr(b)
    s+=chr(c)
    k+=2
print(s)

得到中间26个字符:bjk2x1Jg2e516a8f0an7a5éí1z

3.第三段

这段是对倒数第七个到倒数第二个共6个字符进行限制,这里给了6个判断式也就是6组方程组,所以可以解出这6个字符

不过值得一提的是,题目有点问题: 第四个判断条件 v1 * 3 + v5 * 2 + v6 * 5 == 671 是有问题的,询问过出题人得知v1应该改成v4(这里已经修改过了)

l = len(str)
v1 = ord(str[l - 7])    #倒数第七个
v2 = ord(str[l - 6])
v3 = ord(str[l - 5])
v4 = ord(str[l - 4])
v5 = ord(str[l - 3])
v6 = ord(str[l - 2])    #倒数第二个
#aef_75
if v1 * 3 + v2 * 2 + v3 * 5 == 1003 and v1 * 4 + v2 * 7 + v3 * 9 == 2013 and v1 + v2 * 8 + v3 * 2 == 1109 and v4 * 3 + v5 * 2 + v6 * 5 == 671 and v4 * 4 + v5 * 7 + v6 * 9 == 1252 and v4 + v5 * 8 + v6 * 2 == 644:
    print('you get the right flag!')

系数矩阵:

3 2 5 0 0 0 |1003
4 7 9 0 0 0 |2013
1 8 2 0 0 0 |1109
0 0 0 3 2 5 |671
0 0 0 4 7 9 |1252
0 0 0 1 8 2 |644

在线解方程:

这六个字符是:aeff73

所以最后的flag是:flag{bjk2x1Jg2e516a8f0an7a5éí1zaeff73}

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

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

相关文章

IOC(概念和原理)

文章目录1. IOC容器概念2. IOC底层原理3. IOC&#xff08;接口&#xff09;4. IOC操作Bean管理&#xff08;概念&#xff09;5. IOC操作Bean管理&#xff08;基于xml方式&#xff09;5.1 基于xml创建对象5.2 基于xml方式注入属性5.2.1 DI&#xff1a;依赖注入&#xff0c;就是注…

Unable to find a valid cuDNN algorithm to run convolution

Unable to find a valid cuDNN algorithm to run convolution 今天在复习HumanNerf的时候发现了这个报错&#xff0c; import torch print(torch.cuda.is_available()) 使用上面的代码发现GPU是可以用的&#xff0c;可自己的torch版本对应。 后面继续看帖子&#xff0c;总结有…

【C++】30h速成C++从入门到精通(STL介绍、string类)

STL简介什么是STLSTL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本&…

2D图像处理:九点标定_上(机械手轴线与法兰轴线重合)(附源码)

文章目录 1. 九点标定2. 九点标定流程2.1 机械手轴线与法兰轴线重合代码实现1. 九点标定 在2D视觉抓取项目中,如果想要让机械手准确的抓取到工件,前提是需要知道机械手应该移动到哪里(位姿)。而移动到哪里(位姿)的获取就需要对相机和机械手进行标定。因此,九点标定(2D视…

ESP32设备驱动-MAX6675冷端补偿K热电偶数字转换器

MAX6675冷端补偿K热电偶数字转换器 1、MAX6675介绍 MAX6675执行冷端补偿并将来自K型热电偶的信号数字化。 数据以 12 位分辨率、SPI™ 兼容的只读格式输出。 该转换器可将温度解析为 0.25C,读数高达 +1024C,并且在 0C 至 +700C 的温度范围内具有 8 LSB 的热电偶精度。 MAX…

力扣旋转字符串

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍字符串旋转,左旋,右旋即旋转结果. 金句分享: ✨好好干&…

如何通过Java将Word转换为PDF

Word是我们日常编辑文档内容时十分常用的一种文档格式。但相比之下&#xff0c;PDF文档的格式、布局更为固定&#xff0c;不易被更改。在保存或传输较为重要的文档内容时&#xff0c;PDF文档格式也时很多人的不二选择。很多时候我们都会遇到需要将Word转换为PDF的情况。下面我就…

放弃node-sass,启用sass

在下载一个新项目时运行&#xff1a;npm run install 发现报错 npm uninstall 异常 Error: Could not find any Visual Studio installation to use 或是 ------------------------- You need to install the latest version of Visual Studio npm ERR! gyp ERR! find VS incl…

嵌入式Linux(二十四)系统烧写

将uboot&#xff0c;linux kernel&#xff0c;.dtb&#xff0c;rootfs烧写到板子上的EMMC上&#xff0c;避免断网导致不能运行。 1. MfgTool工具介绍 一路解压之后&#xff0c;得到以下两项&#xff1a; ①Profiles文件夹&#xff1a;后续烧写文件放到这个文件夹。  其中关注…

宝塔+docker+jenkins部署vue项目(保姆级教程)

1.使用宝塔安装docker 在软件商城安装Docker管理器 2.使用docker下载jenkins镜像 使用命令行 docker pull jenkins/jenkins:lts //lts表示支持版本较长3.创建并且挂载jenkins目录并赋值 jenkins_home为我创建的目录 可以修改任意目录 mkdir -p /jenkins_home cho…

pytest测试框架——allure报告

文章目录一、allure的介绍二、allure的运行方式三、allure报告的生成方式一、在线报告、会直接打开默认浏览器展示当前报告方式二、静态资源文件报告&#xff08;带index.html、css、js等文件&#xff09;&#xff0c;需要将报告布置到web服务器上。四、allure中装饰器1、实现给…

【LeetCode每日一题:982. 按位与为零的三元组+从递归超时到记忆化搜索】

题目描述 给你一个整数数组 nums &#xff0c;返回其中 按位与三元组 的数目。 按位与三元组 是由下标 (i, j, k) 组成的三元组&#xff0c;并满足下述全部条件&#xff1a; 0 < i < nums.length 0 < j < nums.length 0 < k < nums.length nums[i] & …

Common API环境部署(保姆级教程,填充了很多坑)

Common API环境部署目录一、前言及结果展示二、Windows下安装docker1. 准备工作[1.1 Docker安装包](https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe)[1.2 Wsl2安装包](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.ms…

【数据结构】链式二叉树

前言 在前面我们学习了一些二叉树的基本知识&#xff0c;了解了它的结构以及一些性质&#xff0c;我们还用数组来模拟二叉树建立了堆&#xff0c;并学习了堆排序&#xff0c;可是数组结构的二叉树有很大的局限性&#xff0c;平常我们用的最多树结构的还是链式二叉树&#xff0c…

【自律】学习方案

自律来源 轶事 陆奇以精力旺盛著称&#xff0c;通常凌晨4点起床&#xff0c;先查邮件&#xff0c;然后在跑步机上跑4英里&#xff0c;边跑边听古典音乐或看新闻。早上5点至6点至办公室&#xff0c;利用这段时间不受别人干扰准备一天的工作&#xff0c;然后一直工作到晚上10点&a…

搜索引擎的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网的快速发展&#xff0c;网络上的数据也随着爆炸式地增长。如何最快速筛选出对我们有用的信息成了主要问题。搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息&#xff0c;在对信息进行组织和处理后&…

ks通过恶意低绩效来变相裁员(五)绩效申诉就是「小六自证吃了一碗凉粉」

目录 一、小六吃了一碗凉粉 二、给你差绩效 公司告诉你可以绩效申诉 1、公司的实际目的是啥 2、你一旦自证&#xff0c;就掉入了陷阱 三、谁主张谁举证——让公司证明它绩效考核的客观性和公平性 四、针对公司的流氓恶意绩效行为&#xff0c;还有其他招吗 五、当公司用各…

学习方法--找书,背书,利器

学习方法 前言&#xff1a; 1、所谓的技术/技能&#xff0c;可比作对一类书的学习&#xff0c;那么第一步&#xff0c;就是要找这方面的书本来学习&#xff0c;简称为“找书”&#xff0c;找书既是指资料&#xff0c;也是指经验总结等等&#xff0c;第二步&#xff0c;就是背下…

【基础算法】双指针---数组元素的目标和

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

CSS 基础:选择器、盒模型、布局

CSS&#xff08;Cascading Style Sheets&#xff09;是用于定义 HTML 或 XML 文档中的样式的一种语言。它可以控制网页的排版、字体、颜色、背景等多个方面&#xff0c;从而使网页呈现出美观的视觉效果和良好的用户体验。其中&#xff0c;选择器、盒模型和布局是 CSS 基础中的三…