zoukankan      html  css  js  c++  java
  • buuctf-re (持续更新)

    buuctf

    1.easyre

    查壳:

    image-20210105181744994

    没有壳,且为64位程序

    分析:

    image-20210105182318295

    使用ida64分析该文件发现,只是简单的判断我们的输入相等则输出flag。

    image-20210105181939132

    #flag{this_Is_a_EaSyRe}
    

    2.reverse1

    查壳:

    image-20210105182602212

    无壳,64位程序

    分析:

    使用ida64分析

    image-20210105182856224

    输入的Str1字符串与Str2字符串比较,若相等则为flag。而Str2在进行比较之前做了一个变化,将 字符串中的字符 o 替换为 0.

    故将Str2简单的替换一下即为flag

    image-20210105183135228

    #{hell0_w0rld}
    

    3.reverse2

    查壳:

    image-20210105183328285

    无壳,且为64位elf文件

    分析:

    image-20210105183542302

    跟上题一样的套路,如果将flag中的i和r字符,替换为1

    image-20210105183716521

    手动还原即为flag

    #{hack1ng_fo1_fun}
    

    4.内涵的软件

    查壳:

    image-20210105184051676

    无壳,32位程序

    分析:

    image-20210105185538070

    分析了一段时间也没出来,突然回去看了一样hint。

    结合hint

    flag就是加上花括号里面的值image-20210105185606708

    (这真的很内涵

    image-20210105185508518

    #flag{49d3c93df25caad81232130f3d2ebfad}
    

    5.新年快乐

    查壳:

    image-20210105185826559

    有upx壳,32位程序。

    脱壳:

    可以有工具脱也可以用esp定律法手脱。

    分析:

    image-20210105190454476

    输入与v4进行判断。

    v4=HappyNewYear!

    结合hint

    image-20210105190534320

    #flag{HappyNewYear!}
    

    6.[BJDCTF 2nd]guessgame

    查壳:

    image-20210106130115556

    分析:

    image-20210106130725962

    明文显示。

    #BJD{S1mple_ReV3r5e_W1th_0D_0r_IDA}
    

    7.helloword

    查壳:

    image-20210106130933518

    分析:

    image-20210106131020276

    #flag{7631a988259a00816deda84afb29430a}
    

    8.xor

    查壳:

    image-20210106131123822

    分析:

    image-20210106133138985

    对输入的字符进行了异或加密。

    流程是下个字符异或上一个字符,然后与global中的字符进行比较。

    解密即global中的字符与下一个字符进行异或即可。

    解密:

    str=[ 0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
      0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
      0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
      0x47, 0x32, 0x4F]
    
    flag=''
    
    for i in range(0,len(str)-1):
        str[i]^=str[i+1]
        flag+=chr(str[i])
    
    print(chr(0x66)+flag)
    
    
    #flag{QianQiuWanDai_YiTongJiangHu}
    
    

    9.reverse3

    查壳:

    image-20210106133422078

    无壳,32位程序

    分析:

    IDA打开,查看字符串

    image-20210106133517770

    出现base64的表,猜测存在base64编码

    image-20210106133556741

    加密流程:

    base64编码-->每个字符的acii码+下标-->与Str2比较

    解密流程:

    Str2的每个字符的acii码-下标-->base64解码

    解密:

    import base64
    
    str='e3nifIH9b_C@n@dH'
    flag=''
    for i in range(len(str)):
        flag+=chr(ord(str[i])-i)
    print(base64.b64decode(flag).decode('utf-8'))
    #{i_l0ve_you}
    
    flag{i_l0ve_you}
    

    10.不一样的flag

    查壳:

    image-20210106140306427

    无壳,32位程序

    分析:

    image-20210106140408535

    发现有上下左右,猜测为迷宫题。开始那串01可能为地图。

    分为5个一组有

    image-20210106140522501

    解密:

    走一下

    # *1111
    # 01000
    # 01010
    # 00010
    # 1111#
    222441144222	
    
    flag{222441144222}
    

    11.SimpleRev

    查壳:

    image-20210106191606084

    无壳,64位程序

    分析:

    image-20210106203814943

    将KEY变成小写。

    然后规定输入的字符为大写,然后进行一系列变化后字符与test的字符相等。

    脚本:

    一套逆向算法,一套爆破

    test = 'killshadow'
    key = 'ADSFKNDCLS'
    for i in key:
        i += chr(ord(i) + 32)
        print(i[1:], end='')
    flag1 = [0]*len(test)
    key = 'adsfkndcls'
    for i in range(len(test)):
        flag1[i]=(ord(test[i])-97)
    print(flag1,end='')
    flag2=[0]*len(test)
    for i in range(len(test)):
        flag2[i]=(97-ord(key[i%10])-39)
    print(flag2)
    for i in range(len(test)):
        for f in range(ord('A'),ord('Z')+1):
            enc=f
            if flag1[i]==(enc-39-ord(key[i%10])+97)%26:
    
                print(chr(f),end='')
    
    flag=''
    for i in range(len(test)):
        for f in range(ord('A'),ord('Z')+1):
            enc=f
            if test[i]==chr((enc-39-ord(key[i%10])+97)%26+97):
                flag+=chr(f)
    print(flag)
    
    #flag{KLDQCUDFZO}
    

    12.Java逆向解密

    分析:

    image-20210106204532847

    输入的字符串中的字符+‘@’后的acii与32异或。然后与KEYList里面的值相等。

    解密就是KEYList减去‘@’再与32异或

    脚本:

    str=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
    flag=''
    for i in str:
        i=(i-ord('@'))^32
        flag+=chr(i)
    print(flag)
    #This_is_the_flag_!
    

    13.刮开有奖

    查壳:

    image-20210106205207233

    32位未加壳

    分析:

    image-20210106213440120

    重新初始化v7的值,使用动态调试直接获得变化后的值。

    image-20210106213524463

    然后发现该函数位base64编码函数。

    image-20210106213610383

    base64的值给出了,直接获得原值,image-20210106213755834然后image-20210106213636204

    求一下剩下的值。

    最后得到flag为

    flag{UJWP1jMp}
    

    14.[BJDCTF 2nd]8086

    查壳:

    image-20210106213904862

    未知文件?

    打开ida查看

    image-20210106214012361

    密文异或了。

    直接解密看看

    s=']U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;'
    flag=''
    for i in range(len(s)):
        flag+=chr(ord(s[i])^0x1f)
    print(flag)
    #BJD{jack_de_hu1b1an_xuede_henHa0}
    

    15.[GKCTF2020]Check_1n

    查壳:

    image-20210106214434115

    无壳,32位程序

    分析:

    image-20210106214529766

    首先要找开机密码。

    image-20210106214634358

    发现一串疑似base64的字符串,拿去解密image-20210106215039867

    接着还发现一串。编码。

    image-20210106215023048

    image-20210106215004144

    这是非预期解,我们继续,正常分析。image-20210106215417023

    image-20210106215406615

    打砖块死亡后出现flag

    image-20210106215603074

    image-20210106215555759

    flag{f5dfd0f5-0343-4642-8f28-9adbb74c4ede}
    

    16.findit

    查壳:

    image-20210107112114147

    未加固

    分析:

    image-20210107112207930

    把代码扣下来,直接解密就行了

    脚本:

    c++

    #include <iostream>
    
    int main()
    {
        
        char a[] = { 'T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e' };
        char b[] = { 'p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}' };
        unsigned char x[17] = {};
        unsigned char y[38] = {};
        for (int i = 0; i < 17; i++) {
            if ((a[i] < 'I' && a[i] >= 'A') || (a[i] < 'i' && a[i] >= 'a')) {
                x[i] = (char)(a[i] + 18);
            }
            else if ((a[i] < 'A' || a[i] > 'Z') && (a[i] < 'a' || a[i] > 'z')) {
                x[i] = a[i];
            }
            else {
                x[i] = (char)(a[i] - '');
            }
        }
        for (int i2 = 0; i2 < 38; i2++) {
            if ((b[i2] < 'A' || b[i2] > 'Z') && (b[i2] < 'a' || b[i2] > 'z')) {
                y[i2] = b[i2];
            }
            else {
                y[i2] = (char)(b[i2] + 16);
                if ((y[i2] > 'Z' && y[i2] < 'a') || y[i2] >= 'z') {
                    y[i2] = (char)(y[i2] - 26);
                }
            }
        }
        for (int i = 0; i < 38; i++) {
            printf("%c", y[i]);
        }
       
    }
    
    

    python

    b=['p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}']
    y=[0]*len(b)
    for i in range(len(b)):
        if ((b[i] < 'A' or b[i] > 'Z') and (b[i] < 'a' or b[i] > 'z')) :
            y[i] = b[i]
        else:
            y[i] = chr(ord(b[i] )+ 16)
            if ((y[i] > 'Z' and y[i] < 'a') or y[i] >= 'z') :
                y[i] = (chr) (ord(y[i]) - 26)
    for i in y:
        print(i,end='')
    
    

    17:[GXYCTF2019]luck_guy

    查壳:image-20210107115140571

    无壳,64位程序

    分析:

    image-20210107121418503

    照着流程分析下去,解密即可

    脚本:

    str='icug`ofx7F'
    print(len(str))
    flag1='GXY{do_not_'
    flag2=''
    for i in range(8):
        if (i%2==1):
            flag2+=chr(ord(str[i])-2)
        else:
            flag2+=chr(ord(str[i])-1)
    
    print(flag1+flag2)
    #GXY{do_not_hate_me}
    #注意,题目提交是flag{***}形式
    

    18.简单注册器

    查壳:image-20210107121506103

    未加壳

    分析:

    分析代码流程发现,会对输入的字符串进行判断,输入不正确就跳出,那我们改smali代码,使其条件永远成立即可得flag

    image-20210107123136857

    image-20210107123022120

    image-20210107122957933

    另外一种解法,就是直接扣出这段代码,跑一下

    image-20210107123302381

    flag{59acc538825054c7de4b26440c0999dd}
    

    19.[GWCTF 2019]pyre

    分析:

    使用umcompyle6反编译pyc文件

    image-20210107123628017

    简单的逆向一下就出来了

    脚本:

    # l = len(input1)
    # for i in range(l):
    #     num = ((input1[i] + i) % 128 + 128) % 128
    #     code += num
    #
    # for i in range(l - 1):
    #     code[i] = code[i] ^ code[(i + 1)]
    code = ['x1f', 'x12', 'x1d', '(', '0', '4', 'x01', 'x06', 'x14', '4', ',', 'x1b', 'U', '?', 'o', '6', '*', ':', 'x01', 'D', ';', '%', 'x13']
    str=[0]*len(code)
    print()
    for i in range(len(code)):
        str[i]=ord(code[i])
    print(str)
    str=str[::-1]
    print(str)
    for i in range(len(str)-1):
        str[i+1]=str[i]^str[i+1]
    str=str[::-1]
    print(str)
    for i in range(len(str)):
        for f in range(0x20,0x7f):
            enc=f
            if(str[i]==((enc + i) % 128 + 128) % 128):
                print(chr(f),end='')
    #GWHT{Just_Re_1s_Ha66y!}
    

    20.RSA

    解析key.得到N和e

    写脚本解密即可。

    import gmpy2
    import rsa
     
    e=65537
    n=86934482296048119190666062003494800588905656017203025617216654058378322103517
    p=285960468890451637935629440372639283459
    q=304008741604601924494328155975272418463
     
    phin = (p-1) * (q-1)
    d=gmpy2.invert(e, phin)
     
    key=rsa.PrivateKey(n,e,int(d),p,q)
     
    with open("flag.enc","rb") as f:
        f=f.read()
        print(rsa.decrypt(f,key))
    #flag{decrypt_256}
    

    21.[BJDCTF2020]JustRE

    查壳:

    image-20210107153835920

    32位无壳

    分析:

    image-20210107154526975

    动调直接改条件成立即可得到flag

    image-20210107154504054

    22.CrackRTF

    查壳:

    image-20210107154700203

    无壳32位

    分析:

    image-20210107162446487

    第一步是的输入的6个数字,与“@DBAapp”进行拼接,然后经过sub_40100A后与40位的字符串进行比较。

    我们打开sub_40100A发现

    image-20210107162640352

    好家伙,就看到hash,想到hash加密,但是有很多类型,拷贝函数名去网上现学了一波。

    CryptCreateHash的第二参数如下图,为sha1加密

    image-20210107162745162

    我们直接爆破。

    import hashlib
    flag2='@DBApp'
    for i in range(100000,999999):
        h2 = hashlib.sha1(str(i).encode()+flag2.encode())
        flags = h2.hexdigest()
        if "6e32d0943418c2c33385bc35a1470250dd8923a9" == flags:
                print (str(i)+flag2)
                print (flags)
    

    可以得到我们输入的六个数字为

    123321

    进入第二关

    image-20210107162929559

    也是有一个加密函数加密了,我们继续分析。

    image-20210107163012744

    查看官方文档可知,此处为MD5加密image-20210107163032580

    在线破解了一下,都破解不了。

    那只能继续看程序流程

    image-20210107164650920

    读取AAA文件然后取内容进入sub_401005进行异或操作,然后传出来写入.rtf。

    (然后下面百度的,不知道怎么做了)

    原来是.rtf的文件头是固定的,而异或后传进来的前六个数刚好是文件头,所以在百度找到前六个数在做异或就可得到加密前的密文了。

    image-20210107164505133

    s = "{\rtf1"
    
    a = [0x05, 0x7D, 0x41, 0x15, 0x26, 0x01]
    
    flag = ""
    for i in range(0, len(s)):
        x = ord(s[i]) ^ a[i]
        flag += chr(x)
    print(flag)
    #~!3a@0
    

    然后按循序输入我们的答案即可,

    然后当前目录下生成了

    image-20210107170521078

    23.

    查壳:

    image-20210107170919000

    无壳64位

    分析:

    shift+f12发现

    image-20210107171022634

    了base64的表,猜测存在base64加密。

    --------------复习了期末了,考完下再写了------------------------------------

  • 相关阅读:
    [书目20130415]改变:28天让自己内心强大
    [引]软件著作权登记申请所需文件
    [转]动软代码生成器之模板功能介绍
    [转]C# 冒泡排序你还会吗?
    [转]细说ASP.NET Forms身份认证
    [转]listview加载性能优化ViewHolder
    [转]App for Android (2) —— Python篇
    [转]sqlserver 创建分区表
    [转]c# 四舍五入、上取整、下取整
    常用 Java 静态代码分析工具的分析与比较
  • 原文地址:https://www.cnblogs.com/pupububu/p/14237601.html
Copyright © 2011-2022 走看看