NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

这篇具有很好参考价值的文章主要介绍了NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、brainfuck

附件信息

++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>++++++.>----.<-----.>-----.>-----.<<<-.>>++..<.>.++++++.....------.<.>.<<<<<+++.>>>>+.<<<+++++++.>>>+.<<<-------.>>>-.<<<+.+++++++.--..>>>>---.-.<<<<-.+++.>>>>.<<<<-------.+.>>>>>++.

在线工具一把梭

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

二、Caesar's Secert

题目信息

kqfl{hf3x4w'x_h1umjw_n5_a4wd_3fed}

凯撒解码

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

三、Fence

题目信息

fa{ereigtepanet6680}lgrodrn_h_litx#8fc3

栏栅密码

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

四、Vigenère

题目信息

pqcq{qc_m1kt4_njn_5slp0b_lkyacx_gcdy1ud4_g3nv5x0}

维吉尼亚呀呀呀!!根据flag前缀通过偏移量手算key就行,是kfc呀嘿嘿

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

 

五、babyencoding

题目信息

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

flag分啦三部分,分别来解

part1:base64

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

part2:base32

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

part3:UUencode

NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解

六、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

脚本:

import gmpy2
from Crypto.Util.number import long_to_bytes
n = 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261

e = 65537
c = 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595

p1=2217990919
p2=2338725373
p3=2370292207
p4=2463878387
p5=2706073949
p6=2794985117
p7=2804303069
p8=2923072267
p9=2970591037
p10=3207148519
p11=3654864131
p12=3831680819
p13=3939901243
p14=4093178561
p15=4278428893

phi = (p1 - 1) * (p2 - 1) * (p3 - 1) * (p4 - 1) * (p5 - 1) * (p6 - 1) * (p7 - 1) * (p8 - 1) * (p9 - 1) * (p10 - 1) * (p11 - 1) * (p12 - 1) * (p13 - 1) * (p14 - 1) * (p15 - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
#flag{us4_s1ge_t0_cal_phI}

七、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特别大
在RSA中d也称为解密指数,当d比较小的时候,e也就显得特别大了,所以发现e特别大的时候可以考虑低解密指数攻击。

# Sage

def rational_to_contfrac(x, y):

    # Converts a rational x/y fraction into a list of partial quotients [a0, ..., an]

    a = x // y

    pquotients = [a]

    while a * y != x:

        x, y = y, x - a * y

        a = x // y

        pquotients.append(a)

    return pquotients

def convergents_from_contfrac(frac):

    # computes the list of convergents using the list of partial quotients

    convs = [];

    for i in range(len(frac)): convs.append(contfrac_to_rational(frac[0: i]))

    return convs

def contfrac_to_rational(frac):

    # Converts a finite continued fraction [a0, ..., an] to an x/y rational.

    if len(frac) == 0: return (0, 1)

    num = frac[-1]

    denom = 1

    for _ in range(-2, -len(frac) - 1, -1): num, denom = frac[_] * num + denom, num

    return (num, denom)

c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248
e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825
n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433

def egcd(a, b):

    if a == 0: return (b, 0, 1)

    g, x, y = egcd(b % a, a)

    return (g, y - (b // a) * x, x)

def mod_inv(a, m):

    g, x, _ = egcd(a, m)

    return (x + m) % m

def isqrt(n):

    x = n

    y = (x + 1) // 2

    while y < x:

        x = y

        y = (x + n // x) // 2

    return x

def crack_rsa(e, n):

    frac = rational_to_contfrac(e, n)

    convergents = convergents_from_contfrac(frac)

    for (k, d) in convergents:

        if k != 0 and (e * d - 1) % k == 0:

            phi = (e * d - 1) // k

            s = n - phi + 1

            # check if x*x - s*x + n = 0 has integer roots

            D = s * s - 4 * n

            if D >= 0:

                sq = isqrt(D)

                if sq * sq == D and (s + sq) % 2 == 0: return d

d = crack_rsa(e, n)

m = hex(pow(c, d, n))[2:]

print(bytes.fromhex(m))
#flag{learn_some_continued_fraction_technique#dc16885c}

八、babyxor

题目信息

from secret import *

ciphertext = []

for f in flag:
    ciphertext.append(f ^ key)

print(bytes(ciphertext).hex())
# e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2

简单的异或

脚本:

法一:爆破key

a = 'e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2'
c = bytes.fromhex(a)
for i in range(256):
    flag = []
    for j in c:
        flag.append(j ^ i)
    if b'flag' in bytes(flag):
        print(bytes(flag))
# flag{x0r_15_symm3try_and_e4zy!!!!!!}

法二:直接求key,key = ord(‘f’) ^ (密文第一个字节)

a = 'e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2'
c = bytes.fromhex(a)
key = ord('f') ^ c[0]
flag = []
for j in c:
    flag.append(j ^ key)
print(bytes(flag))
# flag{x0r_15_symm3try_and_e4zy!!!!!!}

九、Affine

题目信息

from flag import flag, key

modulus = 256

ciphertext = []

for f in flag:
    ciphertext.append((key[0]*f + key[1]) % modulus)

print(bytes(ciphertext).hex())

# dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064

题目分析:仿射密码

源码存在两个量 key[0] 和 key[1] 作为密钥a和b

其实仿射密码的本质就是解方程得到a和b

我们可以利用已知明文前缀flag{*****} 获得a和b的值

需要注意一点!!

使用f和l这两个已知字符是无法合适求解的 所以一定要灵活 整体往后取一位用l和a求解就好了

exp:

import gmpy2

#key = '****CENSORED***************'    #密钥 censored 被遮盖
flag = 'flag{*******CENSORED********}'    #部分明文

data = "dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064"   #密文待解密

encrypted = bytes.fromhex(data)
# encrypted = data
# print(encrypted)
plaindelta = ord(flag[2]) - ord(flag[1])
print(plaindelta)
cipherdalte = encrypted[2] - encrypted[1]
print(cipherdalte)

modulus = 256
a = gmpy2.invert(plaindelta, modulus) * cipherdalte % modulus
b = (encrypted[1] - a * ord(flag[1])) % modulus
print(a,b)
# a = 17
# b = 23
a_inv = gmpy2.invert(a, modulus)
result = ""
for c in encrypted:
    result += chr((c - b) * a_inv % modulus)
print(result)
#flag{4ff1ne_c1pher_i5_very_3azy}

十、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'>]\xc1\xe5\x82/\x02\x7ft\xf1B\x8d\n\xc1\x95i'

题目分析:
buu上有一道与这道题很类似
key等于字节a的前16位 * 2
iv = 字节a后16位 ^ key的前一半 ^ 1
key,iv都出来了,那么flag就好说了。。

exp:

from Crypto.Util.number import *
from Crypto.Cipher import AES

a = 3657491768215750635844958060963805125333761387746954618540958489914964573229
c = b'>]\xc1\xe5\x82/\x02\x7ft\xf1B\x8d\n\xc1\x95i'
key = long_to_bytes(a)[:16]
iv = bytes_to_long(key) ^ bytes_to_long(long_to_bytes(a)[16:]) ^ 1

aes = AES.new(key * 2,AES.MODE_CBC,long_to_bytes(iv))
flag = aes.decrypt(c)
print(flag)
# flag{firsT_cry_Aes}

 文章来源地址https://www.toymoban.com/news/detail-711419.html

到了这里,关于NewStarCTF 2023 公开赛道 WEEK1|CRYPTO全解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [wp]NewStarCTF 2023 WEEK1|WEB

    考的就是敏感信息的泄露 题目提示两个  无非就最简单的三种 1.robots.txt 2.www.zip 3.index.php.swp 当然我的做法就是直接用dirsearch扫描了 得到了robots.txt和www.zip文件,访问拼接就得到了flag了   考的就是绕过客户端 JavaScript检验 上传一句话木马修改文件名后缀就行了 一句话木马内

    2024年02月07日
    浏览(37)
  • 【2023NewStar】#Week1 Web和Crypto 全题解!涉及知识扩展~

    泄露的秘密 www.zip Begin of Upload 打开源码 找到限制是在前端 我们抓包 上传正常后缀的文件 比如jpg结尾 但是这样传上去服务器是无法解析的 所以我们进行抓包 然后在bp中修改后缀名 将我们上传的后缀jpg在请求包中改为php 服务器就可以解析我们的语句了 一句话木马: ?php eval

    2024年02月06日
    浏览(49)
  • FSCTF 2023(公开赛道)CRYPTO WP

    1、题目信息 2、解题方法 exp 1、题目信息 2、解题方法 阴阳怪气密码解码 1、题目信息 2、解题方法 1、题目信息 2、解题方法 dp泄露 exp 1、题目信息 2、解题方法 exp1:维纳攻击1 exp2: 维纳攻击2 1、题目信息 2、题目信息 共e攻击 1、题目信息 2、解题方法 cyber一把梭 1、题目信

    2024年02月08日
    浏览(48)
  • [wp]NewStarCTF 2023 WEEK3|WEB

    medium_sql Sqlmap一把梭 (部分能直接 flag\\\' 部分出现flag不完整 或者部分爆不到表 等官方wp) 在week1的基础上,多过滤了union。 验证存在布尔盲注: ?id=TMP0919\\\' And if(10,1,0)# ?id=TMP0919\\\' And if(01,1,0)# 发第一个,有回显,第二个,没回显,说明页面可以根据if判断的结果回显两种(真假)

    2024年02月08日
    浏览(34)
  • NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)

    大致测试一下,发现空格被过滤了 使用内联注释/**/绕过,可行 使用%a0替代空格,也可以  再次测试发现等号也被过滤,我们使用 like 代替 (我最开始以为是and被过滤,并没有,如果是and或者or被过滤我们也可以使用 和 || 替代) 但是这里尝试了很多都只返回一个页面,没有

    2024年02月07日
    浏览(47)
  • PolarD&N2023秋季个人挑战—Crypto全解

    (额。。这个题看错了不是挑战赛的。这里当做好题记录下来了) 题目信息:500 分 5 Polar币 n不互素问题,利用欧几里得求公约数 exp: 题目信息:100 分 1 Polar币 查表把附件里的年份转为数字,分别得到: 14,13,5,19,14,13,5,19,29,29,8,23 ,提示加上甲子,就是加60 然后转ASCII码得到:

    2024年02月08日
    浏览(36)
  • FSCTF 2023(公开赛道) MISC(复盘) WP

    2024年02月08日
    浏览(289)
  • [BUUCTF NewStar 2023] week5 Crypto/pwn

    最后一周几个有难度的题 也是个板子题,不过有些人存的板子没到,所以感觉有难度,毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 直接用双值copper这个双值和多值还是有些区别的,应该是作了些优化。 这个题有9个人完成,我估计有一半

    2024年02月05日
    浏览(42)
  • 2023年SWPU NSS 秋季招新赛 (校外赛道)WP—Crypto

    题目信息 根据第一行新表base64解码即可 题目附件 基础RSA exp: 题目附件 典型的dp泄露 exp: 提示 p/q接近类型 附件信息 exp: 附件信息 题目提示 RSA多项式问题,构造多项式环,sage解 得到x后,直接解 附件信息 兔子流密码(无key型)+栅栏+base,好好好 题目提示 附件信息 有密码,

    2024年02月08日
    浏览(34)
  • week1-深度学习概论

    神经网络又称人工神经网络 (ANN) 或模拟神经网络 (SNN),是机器学习的子集,同时也是深度学习算法的核心。  神经网络其名称和结构均受到人脑的启发,可模仿生物神经元相互传递信号的方式。 人工神经网络 (ANN) 由节点层组成,包含一个输入层、一个或多个隐藏层和一个

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包