[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'

这道题 看大家都是通过一个 爆破的方式来做的

我第一次没想到这个要咋整 看了wp发现 爆破确实ok

这里解释一下命令

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]


先查看加密的方法 

首先根据flag的长度 获取i

然后 将 flag的i位 分别 // 和 % 一个地板除 一个取余数

然后result的取证 是两个 s 字符串相加 

并且 第一个 s 是通过 (s1+i)%34 第二个 s 是通过-(s2+i+1)%34 两个获得 s的位数

分析完这个后 我们思考一下如何爆破

s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
flag = ''
for i in range(len(result)//2):
    for j in range(33,125):
        s1 = j//17
        s2 = j%17
        a=(s1+i)%34
        b=-(s2+i+1)%34
        if (result[2 * i] == s[a] and result[2 * i + 1] == s[b]):
            flag += chr(j)
            break
    print(flag)

我们来解释一下

首先 len()//2 的原因是 result= s[x]+s[y]

所以是2倍长 我们需要//2

其次for i in range(32,128)是在ascii a-z1-9进行爆破

s1 s2 我们通过爆破的方式确定

然后a b 就是s的位数

最后通过 result 进行比对 [2*i ] 也是因为其中存在2位

这里就知道了 因为是2个2个加的 所以我们比对 也需要 *2

如果第一位和第二位都和 result一样 那么这个时候 取的flag[i] 也就符合flag的值了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值