内部赛密码3-avbv编码(Easy)

admin 2022年1月5日23:14:51评论140 views字数 1885阅读6分17秒阅读模式

>

This site is best viewed in a modern browser with JavaScript enabled.

### id="flarum-content">

内部赛密码3-avbv编码(Easy)

ThTsOd

首先,这个解法并不完美,存在nc连接时间长,参数需要符合特定条件等问题,仅供参考。
预期解是仿照https://www.zhihu.com/question/381784377上的做法,然后发现出题人都仿照不来,太菜了。

根据题目里的信息for i in range(58):以及连上去测试的结果,发现这是正常Base58的编码。
先写出解密函数

shift=[8,7,6,5,4,3]
def dec(x,tr,add,xor):
    r=0
    for i in range(6):
        r+=tr[x[shift[i]]]*58**i
    return (r-add)^xor

收集数据

 datanum=0x200000
 import time
nett1=time.time()
from pwn import *
r=remote("127.0.0.1",9999)
i=0
bv=[]
try:
    while(i<datanum):
        r.sendline("1")
        r.recvuntil(":\n")
        r.sendline(hex(i))
        bv.append(r.recvline().strip())
        i+=1
    r.close()
    nett2=time.time()
    print(nett2-nett1)
    f=open('ctf.txt','a+')
    for i in range(len(bv)):
        f.write(bv[i]+'\n')
    f.close()
except EOFError:
    f=open('ctf.txt','a+')
    for i in range(len(bv)):
        f.write(bv[i]+'\n')
    f.close()
    print("EOF!")
    print(len(bv))
    exit(1)

按照知乎上解法
接下来找了一些 av 号 x,满足 x 和 x+1 对应 bv 号的第 11 位不同。设异或的数为 X,那么

bv=[]
f=open('crypto3hint(0x200000).txt')
for i in range(datanum):
    bv.append(f.readline().strip())
f.close()

diff=[]
for i in range(0,datanum-1):
    if(bv[i][7]!=bv[i+1][7]):
        diff.append(i)

#print(diff)
def check(x,k):
    return ((k^x)//(58)!=(k^(x+1))//(58))
b=0

ti1=time.time()
for a in range(0,58):
    print(2**25*a%58)
    b=0
    while(b<2**25):
        if(all(check(x,2**25*a+b) for x in diff)):
            print(2**25*a%58,b,2**25*a+b)
            ti2=time.time()
            print(ti2-ti1)
        b+=1

会得出以下结果

(0, 12688674, 12688674)
(0, 12688675, 12688675)
(38, 4088540, 473850588)
(38, 4088541, 473850589)
(38, 29465890, 499227938)
(38, 29465891, 499227939)
(18, 20865756, 960389852)
(18, 20865757, 960389853)

取第一组数据,得到码表

from pwn import *
r=remote("127.0.0.1",9999)
i=0
X=12688674
cv=''
while(i<58):
    r.sendline("1")
    r.recvuntil(":\n")
    r.sendline(hex(i^X))
    cv+=r.recvline().strip()[-1]
    i+=1
r.close()

print(str(cv))

zwupFBnosbUYvMa1Tc9DH7GJe2XrQA3kV4CE8iZjfRqNtgLdP5hxKmW6yS
设xor参数12688674,add参数为0,此时加密0得到的对应数字可知,为1556662768
计算(1556662768-add) ^ 12688674 == 0得到add为1543974094
xor为c19d22,add为5c072cce,码表为zwupFBnosbUYvMa1Tc9DH7GJe2XrQA3kV4CE8iZjfRqNtgLdP5hxKmW6yS
验证后得到flag


  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月5日23:14:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   内部赛密码3-avbv编码(Easy)http://cn-sec.com/archives/720145.html

发表评论

匿名网友 填写信息