当前位置: 首页 > article >正文

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

在这里插入图片描述
这是题目,下载后得到一个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.lryc.cn/news/2397353.html

相关文章:

  • 《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡
  • 【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
  • Python_day43
  • STM32CubeDAC及DMA配置
  • SQL快速入门【转自牛客网】
  • 行业案例 | OPPO借助Azure AI Speech国际服务实现音频文件智能转录
  • 基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)
  • spring-boot接入websocket教程以及常见问题解决
  • 迈向分布式智能:解析MCP到A2A的通信范式迁移
  • 深度学习|pytorch基本运算-hadamard积、点积和矩阵乘法
  • FFmpeg移植教程(linux平台)
  • Mybatis:灵活掌控SQL艺术
  • 2025.05.28【Choropleth】群体进化学专用图:区域数据可视化
  • Java设计模式详解:策略模式(Strategy Pattern)
  • 【春秋云镜】CVE-2022-26965 靶场writeup
  • 爬虫的几种方式(使用什么技术来进行一个爬取数据)
  • XML 编码:结构化数据的基石
  • nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb
  • JSP、HTML和Tomcat
  • (1)pytest简介和环境准备
  • Git 入门学习教程
  • 构建高性能风控指标系统
  • openfeignFeign 客户端禁用 SSL
  • DeepSeek 赋能自动驾驶仿真测试:解锁高效精准新范式
  • 晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册
  • 实验一:PyTorch基本操作实验
  • 可视化大屏通用模板Axure原型设计案例
  • 通配符(Wildcard)与正则表达式(Regular Expression)的关系及区别
  • 历年山东大学计算机保研上机真题
  • Java处理动态的属性:字段不固定、需要动态扩展的 JSON 数据结构