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

给了一个py脚本,先看到源码分析部分:

大概逻辑,就是我依次读我的flag值,s1进行除的运算,s2进行余,然后读s拼成最后的结果。

并且要注意的是针对这里的result += s[(s1+i)%34]+s[-(s2+i+1)%34]这一步,其实实现的是字符上的拼接而不是直接的数值相加,相当于s1构成结果的第一位,s2构成结果的第二位

而我们的除数和余数可以共同构成我们的一个数,所以flag的每一位=s1*17+s2

所以这里最后有两种解题的思路:第一种是顺着解,直接逆向运算;第二种就是顺着我们的脚本直接爆破。

首先是第一种方法:看到源码:

flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):
    s1 = ord(flag[i])//17
  #数值和17的除数
    s2 = ord(flag[i])%17
  #数值和17的余数(注意这里肯定是一个0-9的数字)
    result += s[(s1+i)%34]+s[-(s2+i+1)%34]
  #这里是字符的拼接
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

这里我们顺着这个逻辑来一下result第一位是v对应s中4(从0开始),也就是说(s1+i)%34=4,所以s1=4,第二位23,所以s2=10

最终我们对应的flag第一位:4*17+10=78,就是N(所以这里对我们的s2有一层负数的校验在里面)

这里对应的exp:

flag = ' '
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for i in range(21):
    a1 = s.find(result[i*2])
  #找索引
    s1= a1 - i
  #逆向算s1
    a2 = s.find(result[i*2+1])
  #找索引
    s2 = 34 - a2 -i -1
  #逆向算s2
    if s2 < 0:
        s2 = s2+34
    else:
        flag += chr(s1*17 + s2)
      #得到还原flag的每一位
print(flag)

第二种解法纯爆破,我觉得没啥意思就不留了,大概就是写好然后遍历结果相等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值