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

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'

方法1:爆破

flagg=''
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
num=0
for i in range(0,len(result),2):
    for j in range(255):  #(32,127)也行
        if s[(j//17+num)%34] == result[i] and s[-(j%17+num+1)%34]==result[i+1]:
            print(chr(j),end="")
            num=num+1

运行结果:

NSSCTF{Fake_RERE_QAQ} 

方法2:分析

#     s1 = ord(flag[i])//17
#     s2 = ord(flag[i])%17

这里可以看出s1,s2都是对flag进行操作,flag都是可见字符,所以ascii范围在[32-126]之间

#     result += s[(s1+i)%34]+s[-(s2+i+1)%34]
# print(result)

flagg=''
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

result的结果和计算方法已知,可以轻松得到flag的长度为len(result)/2即21,所以i的取值为[0,20],所以s1最大值为126//17+20==27,此时有如下结论:

(s1+i)%34就等价于s1+i
-(s2+i+1)%34就等价于34-(s2+i+i) 

后续我们就可以通过result以及s的值算出s1和s2,而s1*17+s2就是flag[i]的ascii,最后整理一下得到flag

flagg=''
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
num=0
for i in range(0,len(result),2):
    a1=s.index(result[i])  #a1==s1+num
    a2=s.index(result[i+1]) #a2==34-(s2+1+num)
    flag_tmp=(a1-num)*17+(33-num-a2)
    flagg=flagg+chr(flag_tmp)
    num=num+1

print(flagg)

#运行结果
#NSSCTF{Fake_RERE_QAQ}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值