nssctf第二题[SWPUCTF 2021 新生赛]简简单单的逻辑

article/2025/7/5 21:01:43

在这里插入图片描述
这是题目,下载后得到一个python文件,打开
在这里插入图片描述
解读代码:

for i in range(len(list)):key = (list[i]>>4)+((list[i] & 0xf)<<4)result += str(hex(ord(flag[i])^key))[2:].zfill(2)

list[i]>>4:从列表中取数字同时高4位向右位移4位;
(list[i] & 0xf):取数字进行保留低四位;因为0xf转换为二进制是0000 1111,与之按位与就会只保留低四位;
((list[i] & 0xf)<<4):保留低4位后向左位移4位;
(list[i]>>4)+((list[i] & 0xf)<<4):高四位右移,低四位左移,故相当于高低4位调换位置;
(flag[i])^key):flag字符串的对应字符与高低四位调换后的值进行异或操作;
(ord(flag[i])^key):将异或后的值转换为ascll码值;

ord() 是 Python 内置函数,用于将单个 Unicode 字符转换为对应的整数值(Unicode 码点)。这个函数是字符串处理和编码转换的基础工具。
函数定义
python
运行
ord(c)参数:c 是一个长度为 1 的字符串(单个 Unicode 字符)
返回值:对应的 Unicode 码点整数值
核心功能
字符转整数:将单个字符转换为对应的数字表示
ASCII 转换:对 ASCII 字符,返回对应的 ASCII 码值(0-127)
Unicode 支持:支持所有 Unicode 字符(0-0x10FFFF

hex(ord(flag[i])^key):将转换后的ascll码值转换为16进制;
str(hex(ord(flag[i])^key)):将该16进制的ascll码值转换为字符串;
str(hex(ord(flag[i])^key))[2:]:去除16进制字符串开头的0x得到纯16进制ascll码值;
str(hex(ord(flag[i])^key))[2:].zfill(2):在字符串左侧补0;

zfill() 是 Python 字符串对象的内置方法,用于在字符串左侧填充指定数量的零('0'),使字符串达到指定的宽度。这在需要格式化数字、日期或创建固定宽度字符串时非常有用。
方法定义
python
运行
string.zfill(width)参数:width 是目标字符串的总长度
返回值:左侧用零填充后的新字符串
核心功能
左侧补零:在字符串左侧填充 '0',直到达到指定宽度
保留符号:如果字符串以 '+''-' 开头,符号会保留在最左侧`在这里插入代码片`
不截断:如果原字符串长度已超过或等于指定宽度,则返回原字符串

result += str(hex(ord(flag[i])^key))[2:].zfill(2):赋值给result变量并拼接。

接下来写逆向脚本:

result='bcfba4d0038d48bd4b00f82796d393dfec'
keys = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
flag=''
hex_pairs = [result[i:i+2] for i in range(0, len(result), 2)]for i in range(len(keys)):# 对列表元素进行相同的位运算(高低4位交换)key = (keys[i] >> 4) + ((keys[i] & 0xf) << 4)# 将十六进制字符串转回整数hex_value = int(hex_pairs[i], 16)# 异或操作char_code = hex_value ^ key# 转换为字符并拼接flag += chr(char_code)print("解密后的flag:", flag)

运行得到:在这里插入图片描述
提交:
在这里插入图片描述

逆向代码解析:首先回顾一下原代码的加密逻辑,
1.将list中的数字高低四位调换位置,所以解密时key应该也进行这个操作:
key = (keys[i] >> 4) + ((keys[i] & 0xf) << 4)

2.把flag中的字符转换为16进制,所以需要先按两个字节进行分割,再转换回10进制的ascll码值:
hex_pairs = [result[i:i+2] for i in range(0, len(result), 2)]
hex_value = int(hex_pairs[i], 16)

3.把falg中的字符与key进行异或操作,所以逆向代码中,result的值再次异或即可得到flag的ascll码值
char_code = hex_value ^ key

4.转换为字符并拼接:flag += chr(char_code)

chr() 是 Python 的内置函数,用于将整数转换为对应的 Unicode 字符。它与 ord() 函数互为逆操作,形成字符和数字之间的双向转换桥梁。
函数定义
python
运行
chr(i)参数:i 是一个范围在 01,114,111(即 0x10FFFF)之间的整数
返回值:对应的 Unicode 字符
核心功能
整数转字符:将 Unicode 码点转换为对应的字符
ASCII 支持:对 ASCII 范围内的值(0-127),返回对应的 ASCII 字符
全 Unicode 支持:支持所有合法的 Unicode 字符(包括非 ASCII 字符、表情符号等)

完结撒花


http://www.hkcw.cn/article/MCslEJUKeR.shtml

相关文章

linux驱动 - 5: simple usb device驱动

参考第2节, 准备好编译环境并实现hello.ko: linux驱动 - 2: helloworld.ko_linux 驱动开发 hello world ko-CSDN博客 下面在hello模块的基础上, 添加代码, 实现一个usb设备驱动的最小骨架. #include <linux/init.h> #include <linux/module.h> #include <lin…

某电子计数跳绳的一次修复经历

引子 这阵子开始锻炼身体&#xff0c;感觉投入成本低的&#xff0c;就是跳绳了&#xff0c;所以从20块钱的竹节跳起&#xff0c;随着100、1000、2000、3000个数的加码&#xff0c;还是需要一个电子计数会更好些&#xff0c;不用心中默数了。 这样在某宝上购入一个电子自动计数&…

【设计模式-3.5】结构型——装饰器模式

说明&#xff1a;本文介绍结构型设计模式之一的装饰器模式 定义 装饰器模式&#xff08;Decorator Pattern&#xff09;也叫作包装器模式&#xff08;Wrapper Pattern&#xff09;&#xff0c;指再不改变原有对象的基础上&#xff0c;动态地给一个对象添加一些额外的职责。就…

交换机、路由器配置

四、交换机配置 1、以太网MAC地址 以太网地址用来识别一个以太网上的某个单独的设备或一组设备。 2、Ethernet II帧格式 3、交换机工作原理 初始状态 MAC地址学习&#xff08;源MAC&#xff09; 广播未知数据帧 接收方回应&#xff0c;交换机再次学习MAC地址 交换机实现单播…

业务系统-AI 智能导航设计-系统设计篇(上)

引言 在数字化转型加速推进的当下&#xff0c;企业业务系统正朝着复杂化、集成化方向快速发展。据 Gartner 调研数据显示&#xff0c;超过 68% 的企业业务系统因功能模块激增导致员工平均操作失误率上升 23%&#xff0c;传统菜单式导航与标准化培训模式已难以应对 "功能爆…

如何把电脑桌面设置在D盘?

一、桌面路径默认设置在C盘的问题 桌面路径默认设置在C盘的问题&#xff1a;如果你习惯于将重要文件存放在桌面上&#xff0c;那么在系统崩溃时&#xff0c;这些文件可能会遭受损失&#xff0c;因为只有重装系统才能解决问题。为了避免这种情况&#xff0c;你可以考虑将桌面路…

Mysql水平分表(基于Mycat)及常用分片规则

参考资料: 参考视频 参考博客 视频资料:链接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取码: aag3 Mysql分库分表(基于Mycat)的基本部署 MySQL垂直分库(基于MyCat) 概述: 本例是在垂直分库的基础上,又作的水平分库,参照前文也可以单独拿出来做水平分…

「Java教案」算术运算符与表达式

课程目标 1&#xff0e;知识目标 能够区分Java运算符的种类&#xff0c;例如&#xff0c;算术、赋值、关系、逻辑、位运算等。能够区分Java各类运算符的功能和使用场景。能够根据表达式的构成和计算规则&#xff0c;写出正确的表达式。能够根据运算符优先级与结合性&#xff…

普中STM32F103ZET6开发攻略(二)

接上文&#xff1a;普中STM32F103ZET6开发攻略&#xff08;一&#xff09;-CSDN博客 各位看官老爷们&#xff0c;点击关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 目录 接上文&#xff1a;普中…

FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别

FPGA仿真中阻塞赋值和非阻塞赋值的区别 单独仿真小模块对但将小模块加入整个工程仿真不对就有可能是没有注意到仿真中阻塞赋值和非阻塞赋值的区别 目录 前言 一、简介 二、设计实例 三、仿真实例 1、仿真用非阻塞赋值 2、仿真用阻塞赋值 总结 前言 网上很多人介绍verilo…

蓝云APP:云端存储,便捷管理

在数字化时代&#xff0c;数据的存储和管理变得尤为重要。无论是个人用户还是企业用户&#xff0c;都面临着海量数据的存储需求。蓝云APP正是这样一款为用户提供便捷、安全、高效的云存储服务的应用程序。它不仅提供了一种方便快捷的方式来管理和存储数据&#xff0c;还通过多种…

基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等

基于FPGA的VGA显示文字和数字 前言一、VGA显示参数二、字模生成三、代码分析1.vga_char顶层2.vga_ctrl驱动文件3.vga_pic数据准备文件 总结 前言 结合正点原子以及野火的基础例程&#xff0c;理解了VGA本身基本协议&#xff0c;VGA本身显示像素为640*480&#xff0c;因此注意生…

低能硼注入的粒子控制 Axcelis Purion高电流离子注入机近晶圆环境中的石墨衬垫

低能硼注入的粒子控制 Axcelis Purion高电流离子注入机近晶圆环境中的石墨衬垫

自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架

英文标题&#xff1a;Adaptive Flow Scheduling for Teleoperation: A Communication and Control Co-Optimization Framework over Time-Sensitive Networks 中文标题&#xff1a;自适应流量调度用于遥操作&#xff1a;面向时间敏感网络的通信与控制协同优化框架 作者信息 …

PCIe-Error Detection(一)

下表为PCIe协议中给出的错误&#xff1a; 一、可纠正错误&#xff08;Correctable Errors&#xff0c;8种&#xff09;​​ ​​检错机制​​ ​​错误名称​​​​检测层级​​​​触发条件​​​​Receiver Error​​Physical接收端均衡器&#xff08;EQ&#xff09;监测到…

记忆解码 | 从神经机制到记忆逻辑的科学探索

注&#xff1a;本文为“记忆解码”相关文章合辑。 略作重排&#xff0c;未作探究。 要做的事情全忘了&#xff1f;这 2 种方法能拯救你的记忆力 环球科学 2024 年 07 月 29 日 22:00 北京 图片来源&#xff1a;Pixabay 作者 | Sarah Raskin 译者 | 郑添惺 审校 | clefable 你…

100V离线语音通断器

客户要求&#xff0c;需要能支持宽范围的离线语音通断器&#xff0c;具体需要能支持输入电压为100V左右直流。 找方案&#xff0c;重新做板&#xff0c;终于满足了客户需求&#xff0c;外壳为之前三路离线语音通断器&#xff0c;输出无源。 感谢客户&#xff0c;让我们的产品…

【中国企业数字化转型之路】企业的资源投入与数字化转型的产出效益平衡探索(下篇:完结)

在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。这一转型过程不仅需要大量的技术、人才、管理和时间投入,更需要在投入与产出之间找到精准的平衡点,以确保转型的效益最大化。技术投入方面,企业需斥巨资引进云计算、大数据、人工智能等先进技术,构建高效智能的数字…

【算法设计与分析】实验——二维0-1背包问题(算法分析题:算法思路),独立任务最优调度问题(算法实现题:实验过程,描述,小结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 要求&#xff1a;3-…

6月2日星期一今日早报简报微语报早读

6月2日星期一&#xff0c;农历五月初七&#xff0c;早报#微语早读。 1、郑钦文晋级法网女单八强&#xff0c;刷新生涯法网最佳战绩&#xff1b; 2、中国汽车报&#xff1a;“价格战”是一场无休止的恶性循环&#xff0c;深陷其中者必将皆输&#xff1b; 3、四川成都市崇州市…