Loading

2022ISCTF Crypto wp

ISCTF Crypto wp

1.这是什么古典玩意

题目:

The flag is: ISCTF{part1_part2_part3}
example:
part1:aaa
part2:bbb
part3:!@#
flag:ISCTF{aaa_bbb_!@#}

-------------------------------------challenge-------------------------------------
part1:SUpXSEtaS1ROQlFYRTJZPQ==

part2:5c 75 35 33 5c 75 36 35 5c 75 36 35 5c 75 36 44 5c 75 37 33 5c 75 35 33 5c 75 33 30

image

解题:

part1:先base64再base32

part2:先十六进制转字符串,再unicode解码

part3:猪圈密码,对照表是,cute

ISCTF{BlueShark_SeemsS0_cute}

2.呜呜呜我的md5脏了

题目:

g0at无意间发现了被打乱的flag:I{i?8Sms??Cd_1?T51??F_1?}
但是好像缺了不少东西,flag的md5值已经通过py交易得到了:88875458bdd87af5dd2e3c750e534741

解题:

栅栏密码,分为5栏时解密为:ISCTF{md5_is_11??1??8???}
题目已经告诉了md5值,直接hashcat一把唆
hashcat -a 3 -m 0 88875458bdd87af5dd2e3c750e534741 ISCTF{md5_is_11?d?d1?d?d8?d?d?d} 

ISCTF{md5_is_11451438324}

工具虽然方便,还是写个脚本

import hashlib
import itertools
import string
w=string.digits
for a,b,c,d,e,f,g in itertools.product(w,w,w,w,w,w,w):
  t = 'ISCTF{md5_is_11'+str(a)+str(b)+'1'+str(c)+str(d)+'8'+str(e)+str(f)+str(g)+'}'
  md5 = hashlib.md5(t.encode(encoding='UTF-8')).hexdigest()
  if md5[:32] == '88875458bdd87af5dd2e3c750e534741':
    print (t)

3.咦 这个密码 怎么怪怪的

题目:

JVAB6NR=
FCFOQCB=
JG6NSTP=
UPM4BGU=
GN3VKM==

栅栏密码

分为5栏时,进行base32解码得flag

ISCTF{@_3asy_BASE32!}

4.ezcry

题目:

from Crypto.Util.number import *
import gmpy2
from flag import flag
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
s = getPrime(128)
k = getPrime(128)
n = p * q
e = 65537
seek1 = p*s
seek2 = q*k
seek3 = s*k
c = pow(m,e,n)
print(n)
print(seek1)
print(seek2)
print(seek3)
print(c)
"""
17034526359906374675222899048129793386473729727961851733668266173715506273934226618903915327347680201386438684211280871430960401386916021458749533875225149368757915582850037170031336862864220965224712317292408675261654733853726119671544885158743864358155418727967683788352892259519172776767011253307992508658787036093010953540438865556151687132667690293590304094069132122821611257522409132491206241878258953750975043892338280574703622715614385904469190033441247428911800257097240824225432194243602777112774675510936575635571170740329720227162079500469956310746873132644419840611848333802207608652869080821316814006039
31064534580137722018723185060822560614595271317101024671103834301982025703308358280617670492170754990183711198694392500995348706299728134379707212369534471489902209545060592051514886997951859233729914969365008090709174580598044945031296428531946547802954873288796478626936584991410702713951383782424003825610226728036611739090258953115031673157531
24213197274140919663950771475506320265583015671558310318006684746019240494812396672068641326932339831508586851960432536051863105773343184877340119017546817780287117748145293115469964769795237573829418533841547969451268532899237529671580701722254679851009751345719473395857872899046537572034595080443184983155696803469587776652323407147950333716539
44155715757886274586781970607943060213741487009882893164192666734219021562031
6636871845889289821451339461667353441602430792099749101933216934629214305159040913567522609116395485018234259025910227221402350884391969711051377864656945164699379734982178962637190192088596776288873871651609167259167456816094141938735498585327839045360319836147041837569528592447701501104067430848582239927052031661696213986982946173792468753773505681630323945625892041031455025095934790620541499679023777086690062211807019645557781380979957862910047981754126193036968611612056475750787560328372643151874535031184052794483578557248028165948247504989100884012688908781349748818365779371062209169311607720595792421590
"""

解题:

from Crypto.Util.number import *
import primefac
n=17034526359906374675222899048129793386473729727961851733668266173715506273934226618903915327347680201386438684211280871430960401386916021458749533875225149368757915582850037170031336862864220965224712317292408675261654733853726119671544885158743864358155418727967683788352892259519172776767011253307992508658787036093010953540438865556151687132667690293590304094069132122821611257522409132491206241878258953750975043892338280574703622715614385904469190033441247428911800257097240824225432194243602777112774675510936575635571170740329720227162079500469956310746873132644419840611848333802207608652869080821316814006039
seek1=31064534580137722018723185060822560614595271317101024671103834301982025703308358280617670492170754990183711198694392500995348706299728134379707212369534471489902209545060592051514886997951859233729914969365008090709174580598044945031296428531946547802954873288796478626936584991410702713951383782424003825610226728036611739090258953115031673157531
seek2=24213197274140919663950771475506320265583015671558310318006684746019240494812396672068641326932339831508586851960432536051863105773343184877340119017546817780287117748145293115469964769795237573829418533841547969451268532899237529671580701722254679851009751345719473395857872899046537572034595080443184983155696803469587776652323407147950333716539
seek3=44155715757886274586781970607943060213741487009882893164192666734219021562031
c=6636871845889289821451339461667353441602430792099749101933216934629214305159040913567522609116395485018234259025910227221402350884391969711051377864656945164699379734982178962637190192088596776288873871651609167259167456816094141938735498585327839045360319836147041837569528592447701501104067430848582239927052031661696213986982946173792468753773505681630323945625892041031455025095934790620541499679023777086690062211807019645557781380979957862910047981754126193036968611612056475750787560328372643151874535031184052794483578557248028165948247504989100884012688908781349748818365779371062209169311607720595792421590
e = 65537
'''
#利用yafu分解seek3得到k和s
k = 176868710737612660790124725586933365207
s = 249652499719930280463165749259207398633
'''
#k,s=primefac.primefac(seek3)#分解seek3
s=GCD(seek1,seek3)
k=GCD(seek2,seek3)
p=seek1//s
q=seek2//k
d=inverse(e,(p-1)*(q-1))
m=pow(c,d,n)
print(long_to_bytes(m))

5.韩信点兵

题目:

from secret import flag
from Crypto.Util.number import *

key = getPrime(16)
def encrypt(text):
	return [(((ord(i)<<4)&0xff) + ((ord(i)>>4)&0xff))^key for i in text]

lis = encrypt(flag)

for i in lis:
	p1 = getPrime(16)
	p2 = getPrime(16)
	print(p1,p2,i%p1,i%p2)

output.enc

60719 41941 2732 21510
54277 40751 9077 22603
53147 43711 10208 19644
40277 41999 22965 21243
36929 51647 26346 11628
54767 56767 8713 6713
36433 38867 26843 24409
41659 54419 21598 8838
52289 61211 11019 2097
61643 57773 1630 5500
36923 46993 26401 16331
52783 56311 10538 7010
55147 45869 8094 17372
60859 49663 2385 13581
33533 45007 29856 18382
36433 60913 27019 2539
35879 39857 27397 23419
60589 53299 2732 10022
48947 44971 14329 18305
39199 40709 24190 22680
49783 36263 13461 26981
60271 61027 3066 2310
38977 37507 24315 25785
54667 38351 8625 24941
61703 45979 1686 17410
48029 64499 15407 63436
36433 55667 26843 7609
65287 55603 63292 7689
59999 47777 3242 15464
42923 65323 20466 63389
59273 49547 4035 13761
61819 44449 1534 18904
60589 54709 2687 8567
59467 33301 3985 30151
49253 61223 14100 2130
63493 45613 63337 17724
61121 42187 2171 21105
46769 36809 16552 26512
48731 41351 14510 21890
63277 49991 31 13317
60589 42169 2735 21155
35617 55843 27835 7609
56359 62347 7025 1037

解题:

分析代码,flag第一个字符应该是 I 可以带入代码算出key

image

from Crypto.Util.number import *
import libnum
import numpy as np
f = np.loadtxt('output.enc', dtype=int)
c=[]
n=[]
key=63311
for i in range(len(f)):
    a=f[i]
    a=a.tolist()
    #print(a)
    n.append(a[0])
    n.append(a[1])
    c.append(a[2])
    c.append(a[3])
    wp=libnum.solve_crt(c, n)
    #print(wp)
    for j in '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{!@#}?$%^&*()-=\<>/':
        if wp == (((ord(j)<<4)&0xff) + ((ord(j)>>4)&0xff))^key:
            print(j,end='')
    c=[]
    n=[]

6.babyrsa

题目:

from Crypto.Util.number import *
from flag import flag
import gmpy2
import libnum

m = bytes_to_long(flag)
p = libnum.generate_prime(1024)
q = gmpy2.next_prime(p)
e = 0x10001
n = p * q
phi=(p-1)*(q-1)
c=pow(m,e,n)
print("phi =",phi)
print("c =",c)
# phi = 11998145197184838105291668748328177280207361667546370722759758550200386112478801305683579153942751165452647656673385449297455560085865712968985383490367475984832103238596934094135353170257339614559178443729484992289380330326343473326373076256926770972074683466001586625109364413771716300886242679064050279982192814946404692347546718488456485946902248120569680365122714051066115263800073280766317934165938044443605816890762489369759667593014079143278938847700684310154017484382180324831332527966465023501690149664921975200082428884572496102388046780321762496321487913829155767534947229165886644311869593584303424397016
# c = 5664235030100231880171042228110930207351619841860785495929861788749956436657598539033166266920085041056539484368799525891006461921744810454002229224070342640529484554920046100814190479604751667796353636578589439575896923937945959721385425716210546145718343511555866077148390467362495462929359632111674082222918151696522137240478900570056689827712787018876034334301771868147820786419006234529563416734953393480238739362002713175495890402512002469332947145115452344040709333447223824491510840788018172189866931550385951940611161143400804317944263940630025758568750312753125034413169961147691163044924934280636235493483

解题:

from Crypto.Util.number import *
import gmpy2
phi = 11998145197184838105291668748328177280207361667546370722759758550200386112478801305683579153942751165452647656673385449297455560085865712968985383490367475984832103238596934094135353170257339614559178443729484992289380330326343473326373076256926770972074683466001586625109364413771716300886242679064050279982192814946404692347546718488456485946902248120569680365122714051066115263800073280766317934165938044443605816890762489369759667593014079143278938847700684310154017484382180324831332527966465023501690149664921975200082428884572496102388046780321762496321487913829155767534947229165886644311869593584303424397016
c = 5664235030100231880171042228110930207351619841860785495929861788749956436657598539033166266920085041056539484368799525891006461921744810454002229224070342640529484554920046100814190479604751667796353636578589439575896923937945959721385425716210546145718343511555866077148390467362495462929359632111674082222918151696522137240478900570056689827712787018876034334301771868147820786419006234529563416734953393480238739362002713175495890402512002469332947145115452344040709333447223824491510840788018172189866931550385951940611161143400804317944263940630025758568750312753125034413169961147691163044924934280636235493483
e = 0x10001
d=gmpy2.invert(e,phi)

a=gmpy2.iroot(phi,2)[0]
while 1: 
    B2=pow(a,2)-phi
    a+=1
    if gmpy2.is_square(B2):
        b=gmpy2.iroot(B2,2)[0]
        p=a+b
        q=a-b
        print(p)
        print(q)
        break
p=109536045196021378473484632066472150683521336347358874526866331690092816367179030745104763602807576505784282588391579330792050561206606208658316946611185794570291516186946574151436992714139093506271221446818524824573954054758828492925882010545627804144648642873153564353555136207966912120214314518375212162597
q=109536045196021378473484632066472150683521336347358874526866331690092816367179030745104763602807576505784282588391579330792050561206606208658316946611185794570291516186946574151436992714139093506271221446818524824573954054758828492925882010545627804144648642873153564353555136207966912120214314518375212160647

n=p*q
m=pow(c,d,n)
print(long_to_bytes(m))

7.easy_AES

小明在下载某款漏扫工具的时候,看见作者并没有把压缩密码直接公布出来,而是选择把密码进行加密然后经过Base64编码才公布出来,不过好心的作者给了不完整明文
ISCTF{.................,你能帮帮小明拿到完整的密码明文吗。

/Y39hfmB/Yn83f2V/Yw==
AAcKAA8vLzgoMxY6JiAWHCwmLClpBzw3KjE6dWkVDAdpPywtaT06dAchMDsoPGUdH2l
b'\x00\x07\n\x00\x0f//8(3\x16:& \x16\x1c,&,)i\x07<7*1:ui\x15\x0c\x07i?,-i=:t\x07!0;(<e\x1d\x1fi\x7fc\x7fa~`\x7fb\x7f7\x7fe\x7fc'

-----------------------------------------------------------------------------------------------------------------------------------------------
FOa5aLBjeuIKAFpy8eLkTb5Vk8fIvc8QuMoLHjNB/fc=
b'\x14\xe6\xb9h\xb0cz\xe2\n\x00Zr\xf1\xe2\xe4M\xbeU\x93\xc7\xc8\xbd\xcf\x10\xb8\xca\x0b\x1e3A\xfd\xf7'

第一个密文是异或加密的密文,第二个密文是aes密文

解题:

import base64
from Crypto.Util.number import *
from Crypto.Cipher import AES
from gmpy2 import*
ci='AAcKAA8vLzgoMxY6JiAWHCwmLClpBzw3KjE6dWkVDAdpPywtaT06dAchMDsoPGUdH2l/Y39hfmB/Yn83f2V/Yw=='
baseci=list(base64.b64decode(ci))
a="ISCTF"
b = list(bytes(a, encoding='utf-8'))
#print(b)
for i in range(len(b)):
    plaintext = b[i] ^ baseci[i]
    print(chr(plaintext),end='')
key=''
for j in range(len(baseci)//2):
    key += 'IT'
#print(key)
keys=list(bytes(key, encoding='utf-8'))
#print('\n')
#print(key)
plaint=''
for p in range(len(baseci)):
    plain = keys[p] ^ baseci[p]
    a=chr(plain)
    plaint=''.join(a)
    print(plaint,end='')
def legth(value):
    l = len(value)
    flag = l % 16
    if flag != 0:
        add = 16 - (l % 16)
        value = value + ('\0' * add).encode('utf-8')
    return value
cipher=b'FOa5aLBjeuIKAFpy8eLkTb5Vk8fIvc8QuMoLHjNB/fc='
bcipher=base64.b64decode(cipher)
#print(bcipher)
key = b'Nuyoah'
iv = 0x676574666c6167
iv=long_to_bytes(iv)
key=legth(key)
iv=legth(iv)
aes = AES.new(key,AES.MODE_CBC,iv)
flag = aes.decrypt(bcipher)
print('\n')
print(flag)

8.ezzzzzzzzzzzzzzzzzlattice

题目:

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(340)
e = getPrime(27)
useful = getPrime(1024)
c = (inverse(e, q) * useful + pow(m, e, q)) % p
with open('output','w+') as f:
    f.write(f'p = {p}\nq = {q}\nc = {c}\nuseful = {useful}')

output

p = 176215041366614436655339489935591075636902895954135136841122241380253802582179967593794518297567401299036361575056860517887392943967479843776400627637034876228809071597837754747830328249465839503813449934907560998408748059942360933668204162122439360802825755035429329795025026338388994186440383639279869653617
q = 1242313292529811555206315947830403866100152101264655086220055309490893033589161223226298659803392186789
c = 138410662390266126022898465851432198243842761839203172013625260928165288436953067653757365251155206664375711525949339333912922418821222449394209190808166864229679039695293810120712445232467809405773957984990803742893378439764526132422698663165639289069790788072518598673085607321964936340065626348514556814545
useful = 158443837391423690647166977808516334736755529379034971783606878734292832504801421669112992778721979509812691083536129879186580779162458878826142669865796395792819387809984198367147973904115092855538277798349839501996992692028733595408222280697839208429914897095957668617382589907202789664317638913092559438987

解题:

将题目这行写成如下形式

c = (inverse(e, q) * useful + pow(m, e, q)) % p

\[e^{-1}*useful+m^emod\;q=c+k*p \]

用LLL算法,构造如下格,解出e和rsa的c1的一部分,

\[\begin{pmatrix}e^{-1},1,k \end{pmatrix}\begin{pmatrix} 1 & 0 & -useful\\ 0 & 1 & c \\ 0 & 0 & p \end{pmatrix}=(e^{-1},1,-e^{-1}*useful+c+k*p)=m^emod\;q \]

#sage
from gmpy2 import *
from Crypto.Util.number import *
p = 176215041366614436655339489935591075636902895954135136841122241380253802582179967593794518297567401299036361575056860517887392943967479843776400627637034876228809071597837754747830328249465839503813449934907560998408748059942360933668204162122439360802825755035429329795025026338388994186440383639279869653617
q = 1242313292529811555206315947830403866100152101264655086220055309490893033589161223226298659803392186789
c = 138410662390266126022898465851432198243842761839203172013625260928165288436953067653757365251155206664375711525949339333912922418821222449394209190808166864229679039695293810120712445232467809405773957984990803742893378439764526132422698663165639289069790788072518598673085607321964936340065626348514556814545
useful = 158443837391423690647166977808516334736755529379034971783606878734292832504801421669112992778721979509812691083536129879186580779162458878826142669865796395792819387809984198367147973904115092855538277798349839501996992692028733595408222280697839208429914897095957668617382589907202789664317638913092559438987

v1 = vector(ZZ, [1, 0,-useful])
v2 = vector(ZZ, [0,1, c])
v3 = vector(ZZ, [0,0,p])
m = matrix([v1,v2,v3])
# Solve SVP.
shortest_vector = m.LLL()[0]
e1 = abs(shortest_vector[0])
c1=abs(shortest_vector[2])
e=invert(e1,q)
d=invert(e,q-1)
#print(d)
for i in range(10000):
    m=power_mod(c1,d,q)+i*q
    m=libnum.n2s(int(m))
    #print(m)
    if b'ISCTF{' in m:
        print(m)
        break

9.蓝鲨密码

题目:

蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨!
蓝鲨? 蓝鲨! 蓝鲨! 蓝鲨. 蓝鲨? 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨. 蓝鲨.………………………………………………………………………………………………

解题:

先Ook解码https://www.splitbrain.org/services/ook,解码之后是十六进制数字,十六进制转字符串之后是base64变表,再解出来之后是变种的莫斯密码

import base64
import string
import libnum 
crypt=0x67414E6C686C6438676C396267414E6C686C6438676C396238356438676C39626B5178316B414A326A356C35383439636C6B6B776B5178316B4149776B5178316B414A6A69343569695139636C6B6C326A356C356B5178316B414A326A356C35383439636C6B6C6A6934356969526438676C39626B5178316B4149776B5178316B414A326A356C3567414E6C686B39636C6B6C326A356C3538356438676C39626B5178316B414A326A356C3538356438676C396238356438676C39626B5178316B414A6A69343569694F316A6934356969526438676C39626B5178316B414A6A69343569694F316A69343569695139636C6B6B776B5178316B414A326A356C356B5178316B41497767414E6C686C6438676C396267414E6C6869316A6934356969526438676C3962383439636C6B6C6A69343569694F316A6934356969526438676C396267414E6C686C6438676C3962383439636C6B6C326A356C3567414E6C686B39636C6B6C326A356C35
str1=libnum.n2s(int(crypt)).decode("utf-8")
#print(str1)
string1= string.digits+string.ascii_letters+'+/'
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#print(string1)
print (base64.b64decode(str1.translate(str1.maketrans(string1,string2))))
#string1是改过之后的base64表
mosi1='BLUESHARKBLUESHARK SHARKSHARKBLUE BLUE SHARK SHARKSHARKBLUEBLUESHARKBLUE BLUESHARKSHARKSHARK SHARKBLUEBLUEBLUEBLUE SHARKSHARKBLUE SHARK SHARKSHARKSHARK SHARKSHARKSHARKSHARK SHARKBLUE SHARKBLUESHARK BLUESHARKBLUE SHARKSHARK BLUESHARK SHARKSHARKBLUESHARK BLUEBLUEBLUEBLUEBLUE'
mosi=mosi1.replace('BLUE', '-')
Moster=mosi.replace('SHARK', '.')
print(Moster)

#对照表内容放入字典中
Dict_MorseCode = {
                   'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.',
                   'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-',
                   'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-',
                   'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--',
                   'X': '-..-', 'Y': '-.--', 'Z': '--..',
                   '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....',
                   '7': '--...', '8': '---..', '9': '----.', '0': '-----',
                   ', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-',
                   '(': '-.--.', ')': '-.--.-','_':'..--.-'
                   }
#解密,就是将字符串从摩斯解密为英文的函数
def decrypt(message):
    # 在末尾添加额外空间以访问最后一个摩斯密码
    message += ' '
    decipher = ''
    citext = ''
    global i
    for code in message:
        # 检查空间
        if code != ' ':
            i = 0
            # 在空格的情况下
            citext += code
        # 在空间的情况下
        else:
            # 如果 i = 1 表示一个新字符
            i += 1
            # 如果 i = 2 表示一个新单词
            if i == 2:
                # 添加空格来分隔单词
                decipher += ' '
            else:
                # 使用它们的值访问密钥(加密的反向)
                decipher += list(Dict_MorseCode .keys())[list(Dict_MorseCode .values()).index(citext)]
                citext = ''
    return decipher

result = decrypt(Moster)
print(f'解密后的明文:{result}')
posted @ 2023-01-24 23:08  vconlln  阅读(473)  评论(0编辑  收藏  举报