当前位置: 首页 > 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 字符、表情符号等)

完结撒花

相关文章:

  • Redis-6.2.9 cluster集群部署和扩容缩容
  • DeepSeek模型性能优化:从推理加速到资源调度的全栈实践
  • 【笔记】部署 AgenticSeek 项目问题:端口 8000 被占用
  • 结构型设计模式之桥接模式
  • 【设计模式-3.6】结构型——桥接模式
  • 【Qt开发】对话框
  • 3516cv610在sample_aiisp上多创一路编码流,方法
  • 设计模式——中介者设计模式(行为型)
  • Git GitHub Gitee
  • github 2FA双重认证丢失解决
  • SQL Transactions(事务)、隔离机制
  • 【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令
  • PyTorch——卷积操作(2)
  • TomatoSCI数据分析实战:探索社交媒体成瘾
  • Hadoop 大数据启蒙:深入解析分布式基石 HDFS
  • JSP、HTML和Tomcat
  • Vue-5-基于JavaScript和plotly.js绘制数据分析类图表
  • pytorch基本运算-范数
  • TS 星际通信指南:从 TCP 到 UDP 的宇宙漫游
  • 初识CSS3
  • 个人网站隐藏服务器真实ip/公众号软文是什么意思
  • 哪些大型门户网站是用phpwind 搭建的/广州疫情升级
  • 蚌埠网站建设哪家好/优化关键词哪家好
  • 湖南营销型网站建设团队/搜索引擎优化工作
  • 一个seo良好的网站其主要流量往往来自/优化设计答案五年级下册
  • 营销型网站的建设重点是什么意思/线上销售平台有哪些