半个月没有落笔了。又到开学季,老油条们又在教新生了。题目很多,本想过于简单就不提交了,可以总是想起去年,到最后总是忘掉哪个作了哪个没作,也挺乱的。这回一共有7周呢,而且有的比赛题目居然不按周排序。
Base每周结束后都会放官方WP,能拿自己的跟官方的借鉴一下也好。每周结束后会更新。
week1
ez_math/mid_math
import numpy as np
from Crypto.Util.number import *a, b, c, d = [getPrime(128) for _ in range(4)]
point1 = a * d
point2 = b * c
matrix2 = [[0, a, b], [0, c, d]]flag = b"flag{test_flag}"
flag = bytes_to_long(flag)def randomArray():upper = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]low = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]for i in range(3):for j in range(i+1, 3):upper[i][j] = getPrime(128)low[j][i] = getPrime(128)result = np.array(upper) @ np.array(low)return resultA = np.array([[flag, 0, 0]] + matrix2)
B = randomArray()
C = randomArray()
MAT = C @ A @ B
也算是作出来了,一看WP,居然没想到行列式。官方是这样的 因为B=Bupper*Blow 所以|B|=|Bupper|*|Blow|=1所以|MAT|=|A|*|B|=|A|=flag*(ad-bc)=flag*(hint1-hint2) 两题一样,因为mid_math的左边也是1
long_to_bytes(det(matrix(MAT))//(ponit1-point2))
我用了个麻烦的办法,主要是考虑到这些素数长度区别很大,所以可以一个个求出来。(第1个可以直接gcd,这里说第2个)
5个矩阵相乘,先把因子都列出来,写到线上得一整张。
'''|1 u1 u2| |1 0 0| |f 0 0|
u = |0 1 u3| l = |l1 1 0| A = |0 a b| |0 0 1| |l2 l3 1| |0 c d| C*B*A = CB*Au*Al == M
(CB*Au)*Al == M
|a11 a12 a13| |1 0 0| |a11+a12*l1+a13*l2 a12+a13*l3 a13|
|a21 a22 a23|*|l1 1 0| = |a21+a22*l1+a23*l2 a22+a23*l3 a23|
|a31 a32 a33| |l2 l3 1| |... ... a33|
'''
他们规模都一样,都是128位,所以M[0,1]/M[0,2]约为l3由于l3是质数,小爆破一下得到素数即可。一般修正0或1就行。这样一个个把l求出来,就得5个的积就能少一个,然后再求个u,就回到第1题,用gcd就能求flag。
本来这个方法不大好,但考虑到还有下周。总不能下周也用det吧。
babypack
from Crypto.Util.number import *
import random
flag=b'BaseCTF{}'
m=bytes_to_long(flag)
bin_m=bin(m)[2:]
length=len(bin_m)a=[1]
sum=1
for i in range(length-1):temp=random.randint(2*sum+1,4*sum)sum=sum+tempa.append(temp)a=a[::-1]
c=0
for i in range(length):if bin_m[i]=='1':c=c+a[i]
print("a=",a)
print("c=",c)
超增序列,从大到小够减就加‘1’减掉,不够次就加‘0’
from output import *b=''
for i in a:if c>=i:c-=i b+='1'else:b+='0'print(len(b))
b = '0'+b
print(''.join([chr(int(b[i:i+8],2)) for i in range(0,len(b),8)]))
#BaseCTF{2c4b0c15-3bee-4e4a-be6e-0f21e44bd4c9}
babyrsa
单因子
long_to_bytes(pow(c,invert(e,n-1),n))
十七倍
给的是m*17%256 下拉乘逆
bytes([i*invert(17,256)&0xff for i in enc])
helloCrypto
给了密钥的AES,直接解密
AES.new(key=long_to_bytes(key1),mode=AES.MODE_ECB).decrypt(c)
ez_rsa
给了(p+2)*(q+2),实际上是给了p+q,可以用z3求解,也可以直接用p+q来求真正的phi
phi=(p-1)(q-1)=n-(p+q)+1
你会算md5吗
给了一堆单字符的md5值,弄个字典,这典这东西比单字符爆破强,至少从编程的思想上更好
dic = [hashlib.md5(bytes([i])).hexdigest() for i in range(128)]
bytes([dic.index(i) for i in output])