目录

  1. 1. 前言
  2. 2. 知识点
  3. 3. 题目
  4. 4. 思路
    1. 4.1. 知识补充
      1. 4.1.1. >>,<<,&
      2. 4.1.2. ord
      3. 4.1.3. hex
      4. 4.1.4. zfill
    2. 4.2. 操作
  5. 5. 总结

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

RE初探索0x01

2023/4/5 Reverse
  |     |   总文章阅读量:

前言

从此篇博客开始记录博主从零开始的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就是flagkey异或的结果

思路

知识补充

>>,<<,&

位运算符,把数字看作二进制来进行计算

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}

总结

用于入门逆向的异或操作,真不错(