zoukankan      html  css  js  c++  java
  • BUUCTF Re部分wp(二)

    [2019红帽杯]easyRE

    这题有点坑。。。

    两次输入,第一次

    a=[0x49,0x6f,0x64,0x6c,0x3e,0x51,0x6e,0x62,0x28,0x6f,0x63,0x79,0x7f,0x79,0x2e,0x69,0x7f,0x64,0x60,0x33,0x77,0x7d,0x77,0x65,0x6b,0x39,0x7b,0x69,0x79,0x3d,0x7e,0x79,0x4c,0x40,0x45,0x43]
    
    for i in range(len(a)):
        print(chr(a[i]^i),end="")

    得到Info:The first four chars are `flag`

    第二次是一个经过多次base64的密文,解密得https://bbs.pediy.com/thread-254172.htm

    这文章看看,字里行间写满了坑人二字,也知道自己被带到沟里了,但如何找到正确的函数有点困难,在进行了两次输出后,fini里用了个sub_400D35

     有f和g,结合第一次输入的提示,大概可猜到是这个函数

    byte_6CC0A0=[0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
    f="flag"
    v5=[0,0,0,0]
    b=[0x40,0x35,0x20,0x56]
    flag=[]
    for i in range(4):
        v5[i]=b[i]^ord(f[i])
    
    for i in range(len(byte_6CC0A0)):
        flag.append(v5[i%4]^byte_6CC0A0[i])
    for i in flag:
        print(chr(i),end="")

    得到flag

    [SUCTF2019]SignIn

     看到65537就大概可以猜到是rsa了,比较v6,v7,前面是一些字符串的赋值,给了n和e的值,v7是密文,v6为输入的明文

    import gmpy2
    import rsa
    
    e=65537
    n=103461035900816914121390101299049044413950405173712170434161686539878160984549
    p=282164587459512124844245113950593348271
    q=366669102002966856876605669837014229419
    
    phin = (p-1) * (q-1)
    d=gmpy2.invert(e, phin)
    
    key=rsa.PrivateKey(n,e,int(d),p,q)
    
    c=0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
    
    m=gmpy2.powmod(c,d,n)
    
    print hex(m)[2:].decode('hex')

    [GUET-CTF2019]re

    elf,upx壳,脱壳后发现关键部分

     体力活

    flag = []
    flag.append(166163712/1629056)
    flag.append(731332800/6771600)
    flag.append(357245568/3682944)
    flag.append(1074393000/10431000)
    flag.append(489211344/3977328)
    flag.append(518971936/5138336)
    flag.append(406741500/7532250)
    flag.append(294236496/5551632)
    flag.append(177305856/3409728)
    flag.append(650683500/13013670)
    flag.append(298351053/6088797)
    flag.append(386348487/7884663)
    flag.append(438258597/8944053)
    flag.append(249527520/5198490)
    flag.append(445362764/4544518)
    flag.append(981182160/10115280)
    flag.append(174988800/3645600)
    flag.append(493042704/9667504)
    flag.append(257493600/5364450)
    flag.append(767478780/13464540)
    flag.append(312840624/5488432)
    flag.append(1404511500/14479500)
    flag.append(316139670/6451830)
    flag.append(619005024/6252576)
    flag.append(372641472/7763364)
    flag.append(373693320/7327320)
    flag.append(498266640/8741520)
    flag.append(452465676/8871876)
    flag.append(208422720/4086720)
    flag.append(515592000/9374400)
    flag.append(719890500/5759124)
    
    for i in range(len(flag)):
        print(chr(int(flag[i])),end="")
    
    print(len(flag))

    注:这里少给了一位a[6]=1

    [FlareOn4]login

    emm,给了个网页,可看见关键代码为

     document.getElementById("prompt").onclick = function () {
                    var flag = document.getElementById("flag").value;
                    var rotFlag = flag.replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);});
                    if ("PyvragFvqrYbtvafNerRnfl@syner-ba.pbz" == rotFlag) {
                        alert("Correct flag!");
                    } else {
                        alert("Incorrect flag, rot again");
                    }
                }
            

    就是一个移13位的加密,按凯撒密码解就行,得到ClientSideLoginsAreEasy@flare-on.com

    [GWCTF 2019]xxor

     输入6个数,在加密后在sub_400770进行验证

    from z3 import*
    
    f=Solver()
    x=[Int('x%d'%i) for i in range(6)]
    
    f.add(x[1] == 0x20CAACF4)
    f.add(x[5] == 0x84F30420)
    f.add(x[0] == 0xDF48EF7E)
    f.add(x[2] - x[3] == 0x84A236FF)
    f.add(x[3] + x[4] == 0xFA6CB703)
    f.add(x[2] - x[4] == 0x42D731A8)
    
    
    if f.check() == sat:
        for i in range(6):
            print(hex(f.model()[x[i]].as_long()))

    得到加密后的数据

    再看加密部分

     可以看出这应该是个魔改过的TEA

    #include <stdint.h>
    void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
        unsigned int i;
        uint32_t v0=v[0], v1=v[1], delta=0x458BCD42, sum=delta*num_rounds;
        for (i=0; i < num_rounds; i++) {
            v1 -= (v0+sum+20)^((v0<<6)+key[2])^((v0>>9)+key[3])^0x10;
            v0 -= (v1+sum+11)^((v1<<6)+key[0])^((v1 >> 9)+key[1])^0x20;
            sum -= delta;
        }
        v[0]=v0; v[1]=v1;
    }
    
    int main()  {
        uint32_t v[3][2]={0xdf48ef7e,0x20caacf4,0xe0f30fd5,0x5c50d8d6,0x9e1bde2d,0x84f30420};
        uint32_t const k[4]={2,2,3,4};
        unsigned int r=64;
        for(int i=0;i<3;i++){
            decipher(r, v[i], k);
            printf("%u 解密后的数据:%x %x
    ",r,v[i][0],v[i][1]);
        }
        return 0;
    }

    再转为字符串

    def hex_str(x):
        temp=''
        for i in range(len(x)//2):
            temp+=chr(int(x[2*i:2*i+2],16))
        return temp
    a = ["666c61","677b72","655f69","735f67","726561","74217d"]
    for i in range(6):
        print(hex_str(a[i]),end="")

    得到flag

    [ACTF新生赛2020]usualCrypt

    改了表的base64

    a="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 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 0 1 2 3 4 5 6 7 8 9 + /"
    a=a.split()
    for i in range(6,15):
        temp = a[i+10]
        a[i+10] = a[i]
        a[i] = temp
    
    for i in range(len(a)):
        print(a[i],end="")

    得到改后的表

    此处又进行了大小写转换,将密文转换后求base64得到flag

    [HDCTF2019]Maze

    简单的迷宫题

    *******+********* ******    ****   ******* **F******    **************
    1111111211
    1111111311
    1111333311
    1133311111
    1131141111
    1133331111
    1111111111
    //因为字体问题,改成了数字,由2开始到4结束,3为路1为墙

    程序加了花,不能f5,不过也不需要,直接动调得到输入为wasd,走一遍得到flag

    [BJDCTF2020]JustRE

    搜索字符串

    sprintf("bjd{%d%d2069a45792d233ac}",19999,0)

    得到flag

    [V&N2020 公开赛]strangeCpp

    看字符串找到主函数,找到一段数据

    插了一段数组,找到调用

     

    不知道dword_7FF7B86F1190的值,在sub_7FF7B86E1384中

    可根据result爆破得到dword_7FF7B86F1190

    # -*- coding:utf-8 -*-
    a=[0x26,0x2C,0x21,0x27,0x3B,0x0D,0x04,0x75,0x68,0x34,0x28,0x25,0x0E,0x35,0x2D,0x69,0x3D]
    
    result=607052314
    n=0
    for i in range(14549743):
        v=(((i<<8)^(i>>12))*291)&0xffffffff
        n=i
        if(v==result):
            print(str(i))   
            break
    for i in range(17):
        print(chr((a[i]^n)&0xff),end="")

    得到

    [ACTF新生赛2020]easyre

    upx,脱壳后托入ida

    逻辑十分简单,输入{}里作为索引替换表

    # -*- coding:utf-8 -*-
    table="~}|{zyxwvutsrqponmlkjihgfedcba`_^][ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$# !""
    cmp="*F'"N,"(I?+@"
    flag=""
    print(len(cmp))
    for i in range(len(cmp)):
        for j in range(len(table)):
            if(cmp[i]==table[j]):
                print(chr(j+1),end="")
                continue
    #ACTF{U9X_1S_W6@T?}

     emmm所以他给的另一个文件是啥

    [ACTF新生赛2020]rome

    没啥可说的

    a="Qsw3sj_lz4_Ujw@l"
    for j in range(len(a)):  
        for i in range(48,123):
            if(i<90 and i>64):
                t=(i-51)%26+65
                if(ord(a[j])==t):
                    print(chr(i),end="")
                    break
            elif(i>96):
                t=(i-79)%26+97
                if(ord(a[j])==t):
                    print(chr(i),end="")
                    break
            else:
                if(i==ord(a[j])):
                    print(chr(i),end="")
                    break

    [MRCTF2020]Transform

    还是没啥可说的题,先换顺序再异或

    a="67 79 7B 7F 75 2B 3C 52 53 79 57 5E 5D 42 7B 2D 2A 66 42 7E 4C 57 79 41 6B 7E 65 3C 5C 45 6F 62 4D"
    b="09 0A 0F 17 07 18 0C 06 01 10 03 11 20 1D 0B 1E 1B 16 04 0D 13 14 15 02 19 05 1F 08 12 1A 1C 0E 00"
    flag=[]
    a=a.split()
    b=b.split()
    for i in range(len(a)):
        t="0x"+a[i]
        a[i]=eval(t)
        t="0x"+b[i]
        b[i]=eval(t)
    
    for i in range(len(a)):
        a[i]=(a[i]^b[i])
    for i in range(len(a)):
        flag.append(0)
    for i in range(len(a)):
        flag[b[i]]=a[i]
    for i in range(len(a)):
        print(chr(flag[i]),end="")

    [MRCTF2020]Xor

    依然没啥可说的,直接异或

    a="MSAWB~FXZ:J:`tQJ"N@ bpdd}8g"
    
    for i in range(len(a)):
        print(chr(ord(a[i])^i),end="")

    [WUSTCTF2020]Cr0ssfun

    没啥可说的,拼字符串

    [WUSTCTF2020]level3

    在init_array里base64换表,不过给了O_OLookAtYou就没什么意思了

    [ACTF新生赛2020]Universe_final_answer

    直接z3

    from z3 import *
    
    v1,v2,v3,v4,v5,v6,v7,v8,v9,v11=BitVecs('v1 v2 v3 v4 v5 v6 v7 v8 v9 v11',16)
    
    f=Solver()
    f.add(-85 * v9 + 58 * v8 + 97 * v6 + v7 + -45 * v5 + 84 * v4 + 95 * v2 - 20 * v1 + 12 * v3 == 12613)
    f.add(30 * v11 + -70 * v9 + -122 * v6 + -81 * v7 + -66 * v5 + -115 * v4 + -41 * v3 + -86 * v1 - 15 * v2 - 30 * v8 == -54400)
    f.add(-103 * v11 + 120 * v8 + 108 * v7 + 48 * v4 + -89 * v3 + 78 * v1 - 41 * v2 + 31 * v5 - (v6 << 6) - 120 * v9 == -10283)
    f.add(71 * v6 + (v7 << 7) + 99 * v5 + -111 * v3 + 85 * v1 + 79 * v2 - 30 * v4 - 119 * v8 + 48 * v9 - 16 * v11 == 22855)
    f.add(5 * v11 + 23 * v9 + 122 * v8 + -19 * v6 + 99 * v7 + -117 * v5 + -69 * v3 + 22 * v1 - 98 * v2 + 10 * v4 == -2944)
    f.add(-54 * v11 + -23 * v8 + -82 * v3 + -85 * v2 + 124 * v1 - 11 * v4 - 8 * v5 - 60 * v7 + 95 * v6 + 100 * v9 == -2222)
    f.add(-83 * v11 + -111 * v7 + -57 * v2 + 41 * v1 + 73 * v3 - 18 * v4 + 26 * v5 + 16 * v6 + 77 * v8 - 63 * v9 == -13258)
    f.add(81 * v11 + -48 * v9 + 66 * v8 + -104 * v6 + -121 * v7 + 95 * v5 + 85 * v4 + 60 * v3 + -85 * v2 + 80 * v1 == -1559)
    f.add(101 * v11 + -85 * v9 + 7 * v6 + 117 * v7 + -83 * v5 + -101 * v4 + 90 * v3 + -28 * v1 + 18 * v2 - v8 == 6308)
    f.add(99 * v11 + -28 * v9 + 5 * v8 + 93 * v6 + -18 * v7 + -127 * v5 + 6 * v4 + -9 * v3 + -93 * v1 + 58 * v2 == -1697)
    
    if f.check() == sat:
            print(f.model())
  • 相关阅读:
    安全编码1
    VPP tips
    VPP概述汇总
    C语言安全编码摘录
    TCP-proxy
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.4. Matplotlib: plotting
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.3. NumPy: creating and manipulating numerical data
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.1. Python scientific computing ecosystem
    25马5跑道,求最快的五匹马的需要比赛的次数
  • 原文地址:https://www.cnblogs.com/harmonica11/p/12834922.html
Copyright © 2011-2022 走看看