目录

  1. 1. 前言
  2. 2. 知识点
  3. 3. 题目
  4. 4. 思路
    1. 4.1. 知识补充
      1. 4.1.1. python3 range()函数
    2. 4.2. 操作
  5. 5. 总结

LOADING

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

要不挂个梯子试试?(x

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

RE初探索0x06

2023/4/9 Reverse python 爆破
  |     |   总文章阅读量:

前言

NSS上的[SWPUCTF 2021 新生赛]非常简单的逻辑题

知识点

python

爆破

题目

下载附件得到python源码

flag = 'xxxxxxxxxxxxxxxxxxxxx'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):
    s1 = ord(flag[i])//17
    s2 = ord(flag[i])%17
    result += s[(s1+i)%34]+s[-(s2+i+1)%34]
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

for循环中,

执行次数为flag的长度

s1是对flag的ASCll值取整得到的

s2是对flag的ASCll值取余得到的

result由一个需要s1,s2的加密算法得到

思路

知识补充

python3 range()函数

返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表

for number in range(1, 6, 2):#开始值,结束值,步长(负数时从结束值生成序列)
    print(number)
#1
#3
#5

操作

因为result的获取需要同时对s1s2进行运算,所以这里博主选择通过遍历字符的方式对flag进行爆破

那么就要再套一层for循环用于遍历每个字符,即for j in range(255)

注意这里是将爆破出来的tempresult按位进行比较,而且加密算法中的+是拼接字符的意思,所以第一层的for循环步长需为2

加密算法不变,但是由于i的序列变化,所以这里需要再使用一个num参数,在判断成功语句结尾使值+1

编写python脚本如下

flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
temp = ''
num = 0
for i in range(0, len(result), 2):
    for j in range(255):
        s1 = j // 17
        s2 = j % 17
        temp = s[(s1 + num) % 34] + s[-(s2 + num + 1) % 34]
        if (temp == result[i:i + 2]):
            flag += chr(j)  
            num += 1
print(flag)

这里还有大佬的非爆破解法一并贴上,好像是对模的逆运算(?

flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for i in range(0,len(result),2):
    s1 = s.index(result[i]) - i//2
    s2 = 34 - s.index(result[i+1]) -i//2 -1
    flag += chr(s1*17+s2)
print(flag)

总结

年轻人的第一次爆破(