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

先看题目
image

附件.py
image

点击查看代码
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的ASCII值取整并赋给s1,对flag的ASCII值取余并赋给s2,在进行一个加密算法赋给result

需要逆向分析解出flag
那就先在一定范围的ASCII值中,取整取余,分别赋给s1,s2
再定义一个函数命名为res,让其等于加密算法,此时的加密算法i已经不能再用i表示,替换成num
再写一个if判断,res与result的两两分组的值是否相等

ASCII的最大值为255

源码
image

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

此处有个奇怪的地方,就是在对i//17的后面加#注释,会报错
image
删除#注释能成功运行
image

flag:NSSCTF{Fake_RERE_QAQ}

参考:https://www.cnblogs.com/1ucky/p/16036396.html

posted @ 2022-11-13 16:47  Zer0o  阅读(479)  评论(1)    收藏  举报