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

下载附件后看到源码

# flag = 'xxxxxxxxxxxxxxxxxxxxx'   
# s = 'wesyvbniazxchjko1973652048@$+-&*<>'
# result = ''
# for i in range(len(flag)):       # 循环的次数是flag的长度
#     s1 = ord(flag[i])//17        # 计算s1
#     s2 = ord(flag[i])%17         # 计算s2
#     result += s[(s1+i)%34] + s[-(s2+i+1)%34]   # 这是字符的链接,循环一次得到的是两个字符
# print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

解释先关函数和运算符......:

flag = "xxxxxxxxxxxxxxxxxxxx"   (这21个x是占位符,等于告诉了我们flag长度是21)

s = 'wesyvbniazxchjko1973652048@$+-&*<>' (这是加密表,就和base64的加密表一样)

result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i' (这是加密后的flag)

len()函数:返回字符串、列表、字典、元组等长度

ord()函数:是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了 Python 定义范围,则会引发一个 TypeError 的异常

python运算符

range() 函数:  range函数说白了就是产生一组列表,这个列表是一个可迭代对象

所以 for index in range(0,10):才能开始循环

加密过程:

 加密结果:


result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

方法一:直接爆破

就是去猜flag,把可能的flag(字符)拿去加密过程加密,之后把加密的结果和result对比如果相同这就是flag

exp如下:

flag = " "
result = "v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i"
s = "wesyvbniazxchjko1973652048@$+-&*<>"
for i in range(len(result) // 2):           # 循环次数其实就是flag的长度(21)
    for j in range(32, 127):  # Aiscll码可打印字符的范围,因为flag是一串字符,里面的字符是在Aiscll表上的
        s1 = j // 17
        s2 = j % 17
        if result[2 * i] == s[(s1 + i) % 34] and result[2 * i + 1] == s[-(s2 + i + 1) % 34]:
            flag += chr(j)
print(flag)

方法二:直接求解

result += s[(s1+i)%34]+s[-(s2+i+1)%34]  这里的“ + ”是起连接字符的作用

第一次循环,当i等于1时   [(s1+i)%34]   等于[(      )%34]

[-(s2+i+1)%34] 都代表的是S的位数

暂时写道这里有空再写(*^_^*)

 NSSCTF{Fake_RERE_QAQ}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值