1、Easy RSA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#题目所给代码
from math import gcd
from random import randint
import gmpy2
import libnum
from Crypto.Util.number import getPrime

def encrypt(c):
p = getPrime(8)
q = getPrime(8)
e = randint(0, p * q)
while gcd(e, (p - 1) * (q - 1)) != 1:
e = int(next_prime(e))
return e, p, q, pow(ord(c), e, p * q)

if __name__ == '__main__':
print(list(map(encrypt, flag)))
# [(12433, 149, 197, 104), (8147, 131, 167, 6633), (10687, 211, 197, 35594), (19681, 131, 211, 15710), (33577, 251, 211, 38798), (30241, 157, 251, 35973), (293, 211, 157, 31548), (26459, 179, 149, 4778), (27479, 149, 223, 32728), (9029, 223, 137, 20696), (4649, 149, 151, 13418), (11783, 223, 251, 14239), (13537, 179, 137, 11702), (3835, 167, 139, 20051), (30983, 149, 227, 23928), (17581, 157, 131, 5855), (35381, 223, 179, 37774), (2357, 151, 223, 1849), (22649, 211, 229, 7348), (1151, 179, 223, 17982), (8431, 251, 163, 30226), (38501, 193, 211, 30559), (14549, 211, 151, 21143), (24781, 239, 241, 45604), (8051, 179, 131, 7994), (863, 181, 131, 11493), (1117, 239, 157, 12579), (7561, 149, 199, 8960), (19813, 239, 229, 53463), (4943, 131, 157, 14606), (29077, 191, 181, 33446), (18583, 211, 163, 31800), (30643, 173, 191, 27293), (11617, 223, 251, 13448), (19051, 191, 151, 21676), (18367, 179, 157, 14139), (18861, 149, 191, 5139), (9581, 211, 193, 25595)]

map(func, seq1[, seq2,…])
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
Python函数编程中的map()函数是将func作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。如果func为None,作用同zip()。

1
2
3
4
5
6
7
8
9
10
11
import gmpy2
x=[(12433, 149, 197, 104), (8147, 131, 167, 6633), (10687, 211, 197, 35594), (19681, 131, 211, 15710), (33577, 251, 211, 38798), (30241, 157, 251, 35973), (293, 211, 157, 31548), (26459, 179, 149, 4778), (27479, 149, 223, 32728), (9029, 223, 137, 20696), (4649, 149, 151, 13418), (11783, 223, 251, 14239), (13537, 179, 137, 11702), (3835, 167, 139, 20051), (30983, 149, 227, 23928), (17581, 157, 131, 5855), (35381, 223, 179, 37774), (2357, 151, 223, 1849), (22649, 211, 229, 7348), (1151, 179, 223, 17982), (8431, 251, 163, 30226), (38501, 193, 211, 30559), (14549, 211, 151, 21143), (24781, 239, 241, 45604), (8051, 179, 131, 7994), (863, 181, 131, 11493), (1117, 239, 157, 12579), (7561, 149, 199, 8960), (19813, 239, 229, 53463), (4943, 131, 157, 14606), (29077, 191, 181, 33446), (18583, 211, 163, 31800), (30643, 173, 191, 27293), (11617, 223, 251, 13448), (19051, 191, 151, 21676), (18367, 179, 157, 14139), (18861, 149, 191, 5139), (9581, 211, 193, 25595)]
for i in x:
e=i[0]
p=i[1]
q=i[2]
m=i[3]
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
c=pow(m,d,p*q)
print(c,end=' ')

得到104 103 97 109 101 123 76 48 48 107 115 95 108 49 107 101 95 121 48 117 39 118 101 95 109 97 115 116 101 114 101 100 95 82 83 52 33 125
推测是Ascii码
在这里插入图片描述
得到flag


2、蛛蛛…嘿嘿♥我的蛛蛛在这里插入图片描述

在这里插入图片描述
查看源码,会有一个url按钮是通往下一关的,关卡很多,加上题目提示spider,编写爬虫程序
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import requests
from lxml import etree
if __name__=="__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62'
}
url = 'https://hgame-spider.vidar.club/99c9a3a283'
response = requests.get(url=url, headers=headers)
page_text = response.text
tree = etree.HTML(page_text)
r = tree.xpath('//a/@href')
x=url
def ifHas(list):
for i in list:
if i!='':
return i
return None

while(ifHas(r)!=None):
url='https://hgame-spider.vidar.club/dc947845b2'+ifHas(r)
response = requests.get(url=url, headers=headers)
page_text = response.text
tree = etree.HTML(page_text)
r = tree.xpath('//a/@href')
x=url
print(x)

运行,拿到最后一个url
在这里插入图片描述
在这里插入图片描述
那就找一找
在这里插入图片描述
找到了


3、好康的流量

在这里插入图片描述
一个pcap文件,丢入wireshark
[文件]->[导出对象]->[IMF]
至于为什么是IMF,是试出来的,只有IMF有一个可以导出对象
在这里插入图片描述
拿到了一张图片
在这里插入图片描述
在这里插入图片描述
丢入stegsolve,更改颜色通道
在这里插入图片描述
一张条形码
条形码在线解密网站
在这里插入图片描述
得到一般flag,另一半呢?


4、Tetris plus

在这里插入图片描述

在这里插入图片描述
玩到三千分会出现一个dialog“flag 貌似被藏起来了,再找找吧!”
要自己找
在这里插入图片描述
找到了base64加密的“flag 貌似被藏起来了,再找找吧!”
下面有一串jsfuck加密的字符串,解密
在这里插入图片描述
(我发现不同在线工具解密出来不一样,多试几次)
jsfuck解密
再次解密
在这里插入图片描述
得到flag


5、饭卡的uno

Iot物联网的题目,和硬件相关
在这里插入图片描述
打开附件
在这里插入图片描述
给Arduino上传HEX文件
好像是个外国人写的跟着题类似的wp


6、RSA Attack

1
2
3
4
5
6
7
8
9
10
11
12
13
import gmpy2
import libnum
e = 65537
n = 700612512827159827368074182577656505408114629807
c = 122622425510870177715177368049049966519567512708

#在线分解工具,分解n
p= 715800347513314032483037
q= 978782023871716954857211
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(libnum.n2s(int(m)))

7、RSA Attack2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#题目
import re
from math import ceil
from Crypto.Util.number import getPrime
from libnum import s2n
from secret import flag

flag_parts = list(map(s2n, re.findall(rf".{{,{ceil(len(flag) / 3)}}}", flag)))

print("# task1")
m = flag_parts[0]
e = 65537
p = getPrime(1024)
q = getPrime(1024)
r = getPrime(1024)
n1 = p * q
c1 = pow(m, e, n1)
n2 = r * q
c2 = pow(m, e, n2)
print("e =", e)
print("n1 =", n1)
print("c1 =", c1)
print("n2 =", n2)
print("c2 =", c2)

print("# task2")
m = flag_parts[1]
e = 7
p = getPrime(1024)
q = getPrime(1024)
n = p * q
c = pow(m, e, n)
print("e =", e)
print("n =", n)
print("c =", c)

print("# task3")
m = flag_parts[2]
p = getPrime(1024)
q = getPrime(1024)
n = p * q
e1 = getPrime(32)
e2 = getPrime(32)
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
print("n =", n)
print("e1 =", e1)
print("c1 =", c1)
print("e2 =", e2)
print("c2 =", c2)

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#task1 N不互素(共享素数)
import libnum
import gmpy2

e = 65537
n1 =
c1 =
n2 =
c2 =

#求最大公约数
q=gmpy2.gcd(n1,n2)
p1=n1//q

phi_n=(q-1)*(p1-1)
#求逆元d
d1=libnum.invmod(e,phi_n)
m=pow(c1,d1,n1)
print(m)
#数字转字节,转字符串
print(libnum.n2s(int(m)).decode())

低加密指数广播攻击指路脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#task2 低加密指数广播攻击
import libnum
from gmpy2 import invert, gcd, iroot

def op(x):
res = 1
for i in x:
res *= i
return res

def CRT(m, a):
assert (len(m) == len(a))
M = op(m)
sum = 0
for m, a in zip(m, a):
Mi = M // m
ti = invert(Mi, m)
sum += a * ti * Mi
return sum % M
def GCRT(m, a):
assert (len(m) == len(a))
curm, cura = m[0], a[0]
for m, a in zip(m[1:], a[1:]):
d = gcd(curm, m)
c = a - cura
assert (c % d == 0)
K = c // d * invert(curm // d, m // d)
cura += curm * K
curm = curm * m // d
return cura % curm

e = 7
n = []
c = []
m = CRT(n, c)
m1 = iroot(m, e) # 开e次方
print(m1)
print(libnum.n2s(int(m1[0])))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#task3  共模攻击脚本
import gmpy2
from Crypto.Util.number import *
#数字n、c1、c2都太长了,我直接去了
n=
e1= 2519901323
e2= 3676335737
c1=
c2=
gcd, s, t = gmpy2.gcdext(e1, e2)
#广义欧几里得求出s,t gcdext返回值为e1,e2最大公因数和s、t。 s*e1+t*e2=(e1,e2)

#s和t中必然有一位负数,将其变为正数,要使等式仍然成立,取逆元
if s < 0:
s = -s
c1 = gmpy2.invert(c1, n)
if t < 0:
t = -t
c2 = gmpy2.invert(c2, n)
plain = gmpy2.powmod(c1, s, n) * gmpy2.powmod(c2, t, n) % n
print(long_to_bytes(plain))

8、