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

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.lqws.cn/news/79903.html

相关文章:

  • 基于ubuntu和树莓派环境对游戏进行移植
  • eBay关键词搜索API开发指南
  • Matlab绘图
  • Baklib云内容中台的核心是什么?
  • 100V离线语音通断器
  • 【Zephyr 系列 3】多线程与调度机制:让你的 MCU 同时干多件事
  • 【笔记】Windows 下载并安装 ChromeDriver
  • Unity 限制物体在Bounds 包围盒控制移动
  • 二、Kubernetes 环境搭建
  • java反序列化: Transformer链技术剖析
  • 《多状态DP:状态设计与状态转移方程速成指南》​
  • Google 发布的全新导航库:Jetpack Navigation 3
  • 【深度学习新浪潮】以Dify为例的大模型平台的对比分析
  • 【算法】分支限界
  • Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)
  • 《Pytorch深度学习实践》ch3-反向传播
  • 数字化转型全场景安全解析:从产品到管理的防线构建与实施要点
  • 自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架
  • 用wireshark抓包分析学习USB协议
  • 04powerbi-度量值-筛选引擎CALCULATE()
  • 吴恩达MCP课程(5):research_server_prompt_resource.py
  • 光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)
  • HTML 等价字符引用:系统化记忆指南
  • 网络攻防技术五:网络扫描技术
  • Linux中的mysql逻辑备份与恢复
  • 二叉树的层序遍历与完全二叉树判断
  • HarmonyOS鸿蒙Taro跨端框架
  • 已有的前端项目打包到tauri运行(windows)
  • AI智能体|扣子(Coze)搭建【合同/文档审查】工作流
  • SpringBoot手动实现流式输出方案整理以及SSE规范输出详解