前言
从此篇博客开始记录博主从零开始的re生活,因为博主主业是web,所以这次打算用不同的记录方式来学习re,以记录做题过程的形式来学习
那么就以NSS上的[SWPUCTF 2021] 新生赛简简单单的逻辑作为起步吧
知识点
python
异或
题目
下载题目附件得到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
key
为异或要用到的密钥(?
那么list
就为key生成需引用的列表
result
就是flag与key异或的结果
思路
知识补充
>>,<<,&
位运算符,把数字看作二进制来进行计算
ord
以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值
ord('a')
#97
是 chr()
函数(对于8位的ASCII字符串)或 unichr()
函数(对于Unicode对象)的配对函数
hex
生成16进制字符串带0x前缀
因此需要[2:]
进行截取
异或与其相配对的是int
zfill
返回指定长度的字符串,原字符串右对齐,前面填充0
大致作用应该是补足位数为2位
操作
利用附件信息直接编写脚本得到flag
result = 'bcfba4d0038d48bd4b00f82796d393dfec'
list = [
47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25
]
flag = ''
for i in range(len(list)):
key = (list[i] >> 4) + ((list[i] & 0xf) << 4)
flag += chr(int(result[2 * i:2 * i + 2], 16) ^ key)
print(flag)
#NSSCTF{EZEZ_RERE}
据说还可以暴力破解,这里直接贴别的大佬的脚本
list = [47, 138, 127, 57, 117, 188, 51, 143, 17, 84, 42, 135, 76, 105, 28, 169, 25]
result = [‘bc’,‘fb’,‘a4’,‘d0’,‘03’,‘8d’,‘48’,‘bd’,‘4b’,‘00’,‘f8’,‘27’,‘96’,‘d3’,‘93’,‘df’,‘ec’]
for i in range(len(list)):
key = (list[i]>>4)+((list[i] & 0xf)<<4)
print(chr(int(result[i], 16) ^ key))
#flag:NSSCTF{EZEZ_RERE}
总结
用于入门逆向的异或操作,真不错(