ACTF2020 writeup

ACTF2020 writeup

  • 所属学校:中南大学

Pwm

  • 不会

Reverse

  • 题目名称 easyalgorithm

  • FLAG: ACTF

  • 大概就先把文件拖进IDA里面反编译一下,看反编译出来的c代码大概就知道是首先判断输入是否为ACTF{},然后将花括弧中的字符串赋给dest,然后通过4006A6和400792两个函数对dest进行加密,然后将得到的密文和v3后的连续地址上的asc码进行比较

  • image-20200605222859597

  • image-20200605222843734

  • 然后进入792函数

  • image-20200605222953339

  • 发现对密文主要进行加密的就是选中的那一条语句,且发现异或运算的逆运算为异或运算所以将v3后面的先赋给dest然后然dest执行一遍792函数即可

  • image-20200605223224940

Crypto

  • 题目名称:[Column Permutation Cipher](http://actf2020.csuaurora.org/challenges#Column Permutation Cipher)

  • FLAG:忘了

  • 好像是矩阵转置吧,大概就把字符串先读入然后依次枚举j,输出str[i%j]=0 1 2 3 4....j;

  • #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    char s[maxn];
    
    
    int main()
    {
        gets(s);
        int t=5;
        for(;t<51;t++){
            int tt=0;
            printf("%d\n",t);
            for(int t1=0;t1<=t;t1++){
                for(int i=0;i<strlen(s);i++){
                    if(i%t==t1){
                        printf("%c",s[i]);
                    }
                }
            }
            puts("");puts("");
        }    
        return 0;
    }
    
  • 题目名称:我的密码本

  • FLAG:忘了

  • emmmm大概替换密码,本来想用字频分析的,但是中间几个连续的太明显了,一看就是I have a dream,接着把每个符号换成对应的字母就行了

  • 题目名称:[bomb or boom](http://actf2020.csuaurora.org/challenges#bomb or boom)

  • FLAG:也忘了

  • emmm5个密码只用破译四个就能拿到最后密码,明显是门限方案,结合题目名称,应该是bloom门限

  • 密码1:培根密码

  • 密码2:盲文

  • 密码3:音符

  • 密码4:放进浏览器f12即可

  • 密码5:beautifulfxxk

  • from Crypto.Util.number import long_to_bytes
    #from Cryptodome.Util.number import *
    a1 =2891369521230520600
    d1 =5539166121540472709
    a2 =5485400237604727152
    d2 =9993590208169240051
    a3 =10305113992248275270
    d3 =23524210813213316809
    a4 =63558232650391605454
    d4 =134070550878039878083
    
    dd = d1*d2*d3*d4
    t1 = pow(dd//d1,d1-2,d1)
    assert(t1*d2*d3*d4%d1 == 1)
    t2 = pow(dd//d2,d2-2,d2)
    assert(t2*d1*d3*d4%d2 == 1)
    t3 = pow(dd//d3,d3-2,d3)
    assert(t3*d2*d1*d4%d3 == 1)
    t4 = pow(dd//d4,d4-2,d4)
    assert(t4*d1*d2*d3%d4 == 1)
    s = a1*t1*d2*d3*d4+a2*t2*d1*d3*d4+a3*t3*d1*d2*d4+a4*t4*d1*d2*d3
    p = 80804238007977405688648566160504278593148666302626415149704905628622876270862865768337953835725801963142685182510812938072115996355782396318303927020705623120652014080032809421180400984242061592520733710243483947230962631945045134540159517488288781666622635328316972979183761952842010806304748313326215619695085380586052550443025074501971925005072999275628549710915357400946408857
    s %= dd
    print(s)
    s %= p
    print(long_to_bytes(s))
    s1=long_to_bytes(s)
    string = str(s1, 'utf-8')
    
  • 题目名称:[naive encryption](http://actf2020.csuaurora.org/challenges#naive encryption)

  • FLAG:也忘了

  • 脚本没了QAQ,大概就是一个很简单的加密,本来应该用逆元来干的,脑抽了,后来索性就把1-1000赋给一个数组然后把这个数组送进脚本加密,最后根据密文从这个数组中搜索相同的值,那个值的数组下标就是对应的明文

  • TIM图片20200605231507

  • 题目名称:[naive rsa](http://actf2020.csuaurora.org/challenges#naive rsa)

  • FLAG:也忘了(梅 开 六 度

  • 大概就是一个知道n,e和p%q的rsa加密,数字都比较大,就通过两个方程来联立

  • n=p*q

  • p=i*q+r r=p%q

  • 大概联立之后是一个一元二次方程,求根公式得到Δ表达式,然后枚举i,求i=?Δ开方为整数

  • 计算i的脚本

  • import math
    from Crypto.Util.number import *
    import random
    import gmpy2
    #from flag import FLAG
    from hashlib import sha512
    # k=1004566198076519599602210506731394352706714405801310206329305430708682949563948700333927208488048733764810655777562050736705748648879470498998723741270
    # N=6175514749485049413373053071377575530945321634164009072622885654208471537300095005766963778577419199581721246040523785483324001647047467977214814050030943587133763852027399660086870815580138990175204425542876441687390233356169129495839603358265027911239762126454056305503929467053024849366236798248475696207
    
    k=1664378273764672561481497292551642336941327875994089223647717998013917832303422428361645030411515444821419803773096130060882949555523385748675583853223
    N=5754094104856015920963155315529694503752968701370323713954167246906863558022656918708749389447554038178168689652102239536100003732359209400841675514433022980427389298328148493518873305290450595854131004830326345098651091200924006517559346903653009437814617233027734388847229394921531624565677894307201380299
    enc=2661364740807287854110181071739266317728462490127466995676506910093610338260841203050069626005131198286843482586503455269576555138365541733524628733534905931329636510784603944959000258482158578421511001987422779325971552722003155928579456158300542375865577164829487177394136543724724417365476765424760984669
    
    def main():
        # w1=gmpy2.mpz(1)
        # w2=gmpy2.mpz(1)
        # print(w1==w2)
        
        for i in range(1,N):
            tmp=pow(k,2)+4*i*N
            t2=gmpy2.mpz(tmp)
            t1=gmpy2.isqrt(tmp)
            t1=gmpy2.mpz(t1)
            if(t1*t1==t2):
                print(i)
                print(t1*t1)
                print(t2)
                tmp1=(-k+t1)
                print(tmp1%(2*i)==0)
                tmp1=tmp1//(2*i)
                q=tmp1
                print(q)
                print("\n")
                p=N//q
                print(p)
                print(p*q==N)
                break
    
    
    if __name__ == "__main__":
        main()
    
  • 破解明文的脚本

  •   import math
      from Crypto.Util.number import *
      import random
      #from flag import FLAG
      from hashlib import sha512
      import gmpy2
      
      #enc=619131807053341983712996592129731844946129596361804867448023818077266884366071907777148396343131913424753531469667253075830996004711559531521437680038739168021990771840146116736026028722046579674483003435680909352182226754031166260584553606550138319245292347367443791048564768901364057882741366609043947257
      #p%q=1664378273764672561481497292551642336941327875994089223647717998013917832303422428361645030411515444821419803773096130060882949555523385748675583853223
      N=5754094104856015920963155315529694503752968701370323713954167246906863558022656918708749389447554038178168689652102239536100003732359209400841675514433022980427389298328148493518873305290450595854131004830326345098651091200924006517559346903653009437814617233027734388847229394921531624565677894307201380299
      enc=2661364740807287854110181071739266317728462490127466995676506910093610338260841203050069626005131198286843482586503455269576555138365541733524628733534905931329636510784603944959000258482158578421511001987422779325971552722003155928579456158300542375865577164829487177394136543724724417365476765424760984669
      e=65537
      #N=6175514749485049413373053071377575530945321634164009072622885654208471537300095005766963778577419199581721246040523785483324001647047467977214814050030943587133763852027399660086870815580138990175204425542876441687390233356169129495839603358265027911239762126454056305503929467053024849366236798248475696207
      #cmp='actf'
      q=3200913633159406700739711619676356828830359533084335918792917056899609530674479638023261347286860850048621666570302221712996430920616792302792029358479
      
      
      p=1797641162587862886621385006530773899427124515827105214755163452706932525563681417095567980804026038624450846609018641414592282480829787314218357947364376581
      
      def main():
          phi_n = (p-1)*(q-1)
          d = gmpy2.invert(e,phi_n)
          c=enc
          m=pow(c,d,N)
          print(m)
          m=int(m)
          # a=input()
          print(long_to_bytes(m))
      
      
      if __name__ == "__main__":
          main()
    

Mise

  • 题目名称:签到
  • 进入公众号,即可获得宝贵的flag一枚(狗头保命
posted @ 2020-06-22 01:00  0xDkXy_DWM  阅读(313)  评论(0编辑  收藏  举报