buuctf newstar 2023 公开赛-ctrpto-week1-writeup

admin 2023年10月9日17:57:09评论47 views字数 9366阅读31分13秒阅读模式



声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。



0x00 前言

    week1还是比较简单的,但是古典密码我是真的头疼,有些卡了好久。

0X01 题目详解

brainfuck

题目:++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>++++++.>----.<-----.>-----.>-----.<<<-.>>++..<.>.++++++.....------.<.>.<<<<<+++.>>>>+.<<<+++++++.>>>+.<<<-------.>>>-.<<<+.+++++++.--..>>>>---.-.<<<<-.+++.>>>>.<<<<-------.+.>>>>>++.

没啥说的,随波一把梭

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

Caesar's Secert

题目:kqfl{hf3x4w'x_h1umjw_n5_a4wd_3fed}

凯撒加密,随波一把梭了

buuctf newstar 2023 公开赛-ctrpto-week1-writeup


Fence

题目:fa{ereigtepanet6680}lgrodrn_h_litx#8fc3

w型栅栏,随波梭了

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

古典密码还是建议大家自己去看看加解密原理,不然遇到梭不动的,就头疼了

Vigenère

题目:

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

维吉尼亚加密,这种没有key的,可以去专门的网站上爆破

https://www.guballa.de/vigenere-solver

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

但是没直接爆破出来,查看备选的key挨个试

buuctf newstar 2023 公开赛-ctrpto-week1-writeup


发现kyc这个key很像,猜测keykfc进行尝试,得到正确结果

buuctf newstar 2023 公开赛-ctrpto-week1-writeup


babyrsa

题目:

 from Crypto.Util.number import *

 
from flag import flag


 
def gen_prime(n):
 
   res = 1
 
   for i in range(15):

 
       res *= getPrime(n)


 
   return res

 


 


 
if __name__ == '__main__':

 
   n = gen_prime(32)

 
   e = 65537

 
   m = bytes_to_long(flag)

 
   c = pow(m,e,n)

 
   print(n)

 
   print(c)

 
# 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261

 
# 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595

n很小,尝试进行分解,可以使用在线网站

http://factordb.com/index.php

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

分解出10多个素数,根据欧拉定理,phi等于每个素数-1的乘积。

解题脚本:

 from Crypto.Util.number import *
 
import gmpy2

 


 
c = 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595

 
e = 65537

 
n = 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261

 
p = [2217990919,2338725373, 2370292207,2463878387,2706073949,2794985117,2804303069,2923072267,2970591037,3207148519, 3654864131, 3831680819, 3939901243, 4093178561, 4278428893]

 

 
phi = 1

 
for p1 in p:

 
   phi *= (p1-1)

 

 
d = gmpy2.invert(e, phi)
 
m = pow(c,d,n)

 
print(long_to_bytes(m))

buuctf newstar 2023 公开赛-ctrpto-week1-writeup


Small d

题目:

 from secret import flag

 
from Crypto.Util.number import *

 


 
p = getPrime(1024)

 
q = getPrime(1024)

 


 
d = getPrime(32)

 
e = inverse(d, (p-1)*(q-1))

 
n = p*q

 
m = bytes_to_long(flag)

 


 
c = pow(m,e,n)

 


 
print(c)

 
print(e)

 
print(n)

 


 
# c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248

 
# e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825

 
# n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433

高加密指数e,小解密指数d,维纳攻击,板子题。RSAwienerHacker是第三方包,网上可以找到

 import gmpy2

 
import binascii

 
import RSAwienerHacker

 


 
c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248

 
e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825

 
n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433

 


 
d = RSAwienerHacker.hack_RSA(e, n)

 
m = gmpy2.powmod(c, d, n)

 
print(d)

 
print(binascii.unhexlify(hex(m)[2:]))


babyxor

题目:

 from secret import *

 


 
ciphertext = []

 


 
for f in flag:

 
   ciphertext.append(f ^ key)

 


 
print(bytes(ciphertext).hex())

 
# e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2

看题目,是用一个keyflag的每个字符异或。那么解题就是应该找到key,然后再和密文每个字段异或回来。

根据之前的flag,发现flag格式为:flag{xxxx}。所以我们先取密文前四位和flag异或,得到keyx8f,然后就能解密

 from pwn import *

 


 


 
m = bytes.fromhex('e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2')

 
print(m)

 


 
print(xor(m[0:4], b'flag'))

 


 
print(xor(m, b'x8f'))

buuctf newstar 2023 公开赛-ctrpto-week1-writeup


babyencoding

题目:part 1 of flag: ZmxhZ3tkYXp6bGluZ19lbmNvZGluZyM0ZTBhZDQ= part 2 of flag: MYYGGYJQHBSDCZJRMQYGMMJQMMYGGN3BMZSTIMRSMZSWCNY= part 3 of flag: =8S4U,3DR8SDY,CS-F5F-C(S,S<R-CQ9F8S87T`

第一段是base64,第二段是base32,随波可以梭

但是第三段UUencode,随波梭出来有问题,找个在线网站能梭出来末尾}

flag{dazzling_encoding#4e0ad4 f0ca08d1e1d0f10c0c7afe422fea7 c55192c992036ef623372601ff3a}

flag{dazzling_encoding#4e0ad4f0ca08d1e1d0f10c0c7afe422fea7c55192c992036ef623372601ff3a}


Affine

题目:

 from flag import flag, key

 


 
modulus = 256

 


 
ciphertext = []

 


 
for f in flag:

 
   ciphertext.append((key[0]*f + key[1]) % modulus)

 


 
print(ciphertext)

 
print(bytes(ciphertext).hex())

 


 
# dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064

仿射密码,最后输出的结果是十六进制字符串,先要还原成ascii码数组,前四位对应的ascii码为[221, 67, 136, 238]

然后根据之前的提示,flag前四位就是flag,所以先进行ab值的爆破,爆破出a=17b=23时,能把flag加密成对应的ascii码数组

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

然后根据解密公式套入ab值就可以进行解密,注意求a在模数256上的乘法逆元

 import gmpy2

 
from Crypto.Util.number import *

 


 


 
c = 'dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064'

 
c=[int(c[i:i+2],16) for i in range(0,len(c),2)]

 
print(c)

 


 
modulus = 256

 
flag_ = b'flag'

 


 
for a in range(100):

 
   for b in range(100):

 
       ciphertext = []

 
       for f in flag_:

 
           ciphertext.append((a * f + b) % modulus)

 
       print(ciphertext)

 
       if ciphertext == [221, 67, 136, 238]:

 
           print('a=',a)

 
           print('b=',b)

 


 
           break

 


 
a = 17

 
b = 23

 
ni=gmpy2.invert(a,modulus)

 
flag=''

 
for i in c:

 
   f = ni*(i - b) % modulus

 
   flag+=chr(f)

 


 
print(flag)

buuctf newstar 2023 公开赛-ctrpto-week1-writeup


babyaes

题目:

 from Crypto.Cipher import AES

 
import os

 
from flag import flag

 
from Crypto.Util.number import *

 


 


 
def pad(data):

 
   return data + b"".join([b'x00' for _ in range(0, 16 - len(data))])

 


 


 
def main():

 
   flag_ = pad(flag)

 
   key = os.urandom(16) * 2

 
   iv = os.urandom(16)

 
   print(bytes_to_long(key) ^ bytes_to_long(iv) ^ 1)

 
   aes = AES.new(key, AES.MODE_CBC, iv)

 
   enc_flag = aes.encrypt(flag_)

 
   print(enc_flag)

 


 


 
if __name__ == "__main__":

 
   main()

 
# 3657491768215750635844958060963805125333761387746954618540958489914964573229

 
# b'>]xc1xe5x82/x02x7ftxf1Bx8dnxc1x95i'

ACTF新生赛2020的一道原题(9成原题,多了个异或1

整体观察一下,发现是CBC模式下的AESkey32字节(256bits)iv16字节(128bits),所以两者异或的结果其实是key的低128bitsiv异或,再加上key的高128bits。即输出结果的高128bits就是key的高128bits,从而能得到key

这里需要注意的一点是,输出的结果的高位部分在左侧,低位部分在右侧

得到了key之后,取低128bits再与输出结果的低128bits进行异或得到iv

 from Crypto.Cipher import AES

 
from Crypto.Util.number import *

 


 


 
enc_flag = b'>]xc1xe5x82/x02x7ftxf1Bx8dnxc1x95i'

 
xor = 3657491768215750635844958060963805125333761387746954618540958489914964573229 ^ 1

 
print(xor)

 


 


 
key = long_to_bytes(xor)[:16] * 2

 
iv = bytes_to_long(key[16:]) ^ bytes_to_long(long_to_bytes(xor)[16:])

 
iv = long_to_bytes(iv)

 


 
aes = AES.new(key, AES.MODE_CBC, iv)

 
flag = aes.decrypt(enc_flag)

 
print(flag)

buuctf newstar 2023 公开赛-ctrpto-week1-writeup

flagflag{firsT_cry_Aes}

原文始发于微信公众号(夜安团队SEC):buuctf newstar 2023 公开赛-ctrpto-week1-writeup

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月9日17:57:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   buuctf newstar 2023 公开赛-ctrpto-week1-writeuphttp://cn-sec.com/archives/2096377.html

发表评论

匿名网友 填写信息