NSSCTF刷题笔记re1——[SWPUCTF 2021 新生赛]简简单单的逻辑

首先下载附件,可以看到内容是一串python代码

flag = 'xxxxxxxxxxxxxxxxxx'
list = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
result = ''
for i in range(len(list)):
    key = (list[i]>>4)+((list[i] & 0xf)<<4)
    result += str(hex(ord(flag[i])^key))[2:].zfill(2)
print(result)
# result=bcfba4d0038d48bd4b00f82796d393dfec

分析一下代码多度干了什么

1.定义了一个list列表里面的内容是数字,看到这种范围的数字一般都是ascii码值

2.做了个循环,把表中的每一个数字,右移四位再加上补位后在左移四位

        这波操作就有点让人摸不着头脑了

        写个代码自己测试一下,是怎么个事儿!

简单看看怎么把242变回47

只需要简简单单的替换就可以了,甚至不需要逆运算

用计算器看一下基本原理是什么

第一个数,47的二进制是00101111,>>4就是向右移4位,那么久变成了10转换成十进制就是2

第二个数,0xf的二进制是1111,&运算符就是两个二进制作比较,全为1的则1

        00101111

        00001111

最后的结果就为二进制1111转换成十进制就是15

那么15再向左移4位,结果为11110000转换成十进制就是240

240再加上2就是242

过程明白了,但是原理还不清楚,这可能就是数学方面的知识了

3.第三步首先将真实的flag与刚才运算的数字就行了异或预算,并转换成16进制,再把16进制转换成字符串。那么[2:]的作用就是去掉前面的0x保留内容,zfill是用于填充0的函数,当字符串不满2个的时候,在前面填充一个0

那么代码解读完毕,编写逆向的代码

写完发现,第二步不需要逆向,不过了解下过程也是蛮重要的,这种移位的题目出现还是很多的

result="bcfba4d0038d48bd4b00f82796d393dfec"
result_plus = []
flag=""

list = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]

for i in range(0,len(result),2):
	result_plus.append(int(result[i]+result[i+1],16))
	#首先要对result进行处理,重新转换成16进制,并且以数组的形式存放

for i in range(0,len(list)):
	key = (list[i]>>4)+((list[i] & 0xf)<<4)
	flag+=chr(key^result_plus[i])
	#异或运算

print(flag)

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值