【CTF】BUUCTF RE 刷(抄wp)题记录
浏览 722 | 评论 0 | 字数 17026
Xunflash
2021年04月01日
  • 本篇可能会持续更新

    RE11:Java逆向解密

    这个是为数不多自己做的题

    下载来是个.class文件,用jadx打开来是这个样子

    看到26有一堆奇奇怪怪的,看着就像ascii的东西,有个加密函数

    那么就写个解密脚本

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

    运行结果:

    flag:flag{This_is_the_flag_!}

    RE12:刮开有奖

    不会,还没写呢

    RE13:[GXYCTF2019]luck_guy

    21.5.1

    又被小端序这个东西坑了:在CTF中的小端序与大端序

    下载文件出来

    ida64拖进去打开

    整个反编译出来逻辑还是比较清楚的,就是switch按照一定顺序执行,就会给flag

    看了一下感觉有用的就1,4,5 想了一下可能会是451,4551,45551这几种,然后试了一下试不出来,后面才发现又被小端序这个东西坑到了,然后调整了一下s的顺序

    直接把整个关键代码修改一下放进vscode去试一下

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"defs.h"
    
    int main(){
      unsigned int v0;
      char v1;
      signed int i;
      signed int j;
      __int64 s;
      char v6;
      unsigned __int64 v7;
      char f1[]={71, 88, 89, 123, 100, 111, 95, 110, 111, 116, 95,0};
      char f2[9];
      int a;
    
        for ( i = 0; i <= 4; ++i )
        {
            scanf("%d",&a);
            switch ( a  )
            {
              case 1:
                puts("OK, it's flag:");
                memset(&s, 0, 0x28uLL);
    
                printf("%s %s", f1,f2);
                break;
              case 2:
                printf("Solar not like you");
                break;
              case 3:
                printf("Solar want a girlfriend");
                break;
              case 4:
                v6 = 0;
                f2[7]=127;
                f2[6]=102;
                f2[5]=111;
                f2[4]=96;
                f2[3]=103;
                f2[2]=117;
                f2[1]=99;
                f2[0]=105;
                break;
              case 5:
                for ( j = 0; j <= 7; ++j )
                {
                  if ( j % 2 == 1 )
                    v1 = f2[j] - 2;
                  else
                    v1 = f2[j] - 1;
                  f2[j] = v1;
                }
                break;
              default:
                puts("emmm,you can't find flag 23333");
                break;
            }
        }
    }
    

    输入451就出来了flag

    flag:GXY{do_not_hate_me}

    RE14:findit

    21.5.1

    下载下来发现是个apk,直接jadx打开,源码直接出来了

    代码都不用写,直接挑出关键代码稍作修改放到vscode里面运行一下就可以了

    #include<stdio.h>
    
    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', '}'};
        char x[17];
        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] - '\b');
            }
        }
    


    ​ 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<17;i++){
    ​ printf("%c",x[i]);

        }
        printf("\n");
        for(int j=0;j<38;j++){
            printf("%c",y[j]);
        }
    }
    

    但是我输出y会乱码,我也不知道为啥

    于是就交给手机,把x输进去框框里面,得到flag

    flag:flag{c164675262033b4c49bdf7f9cda28a75}

    RE15:简单注册器

    21.5.8

    下载文件,发现是个apk,拖进jadx打开

    找到关键代码拖进vscode,稍微做一点修改

    #include<stdio.h>
    
        int main(){
            char x[33] = "dd2940c04462b4dd7c450528835cca15";
                x[2] = (char) ((x[2] + x[3]) - 50);
                x[4] = (char) ((x[2] + x[5]) - 48);
                x[30] = (char) ((x[31] + x[9]) - 48);
                x[14] = (char) ((x[27] + x[28]) - 97);
                for (int i = 0; i < 16; i++) {
                    char a = x[31 - i];
                    x[31 - i] = x[i];
                    x[i] = a;
                }
            printf("flag{%s}",x);
        }
    

    运行得到flag

    flag:flag{59acc538825054c7de4b26440c0999dd}

    RE16:[GWCTF 2019]pyre

    21.5.8

    下载文件,是一个pyc文件,找某度有个pyc在线反编译

    得到源码

    #!/usr/bin/env python
    # visit http://tool.lu/pyc/ for more information
    print 'Welcome to Re World!'
    print 'Your input1 is your flag~'
    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]
    
    print code
    code = [
        '\x1f',
        '\x12',
        '\x1d',
        '(',
        '0',
        '4',
        '\x01',
        '\x06',
        '\x14',
        '4',
        ',',
        '\x1b',
        'U',
        '?',
        'o',
        '6',
        '*',
        ':',
        '\x01',
        'D',
        ';',
        '%',
        '\x13']
    

    然后根据源码写出解密脚本

    code = [
        '\x1f',
        '\x12',
        '\x1d',
        '(',
        '0',
        '4',
        '\x01',
        '\x06',
        '\x14',
        '4',
        ',',
        '\x1b',
        'U',
        '?',
        'o',
        '6',
        '*',
        ':',
        '\x01',
        'D',
        ';',
        '%',
        '\x13']
    
    flag=''
    
    for i in reversed(range(22)):
        code[i]=chr(ord(code[i+1])^ord(code[i]))
    
    for j in range(23):
        flag+=chr(((ord(code[j])-128)%128-j)%128)
    
    print flag
    

    其中有一个地方有点难,就是取余的逆运算(对于当代痴呆大学生:指我自己
    具体可以参考这个:求余逆运算+负数求余

    RE17:[BJDCTF2020]JustRE

    21.5.9

    下载文件,点开看了一下

    有个getflag的选项,点一下

    弹出一个窗口,点下面click it

    会计数,感觉是要动态调试,可惜我不会,于是打开ida,看了一下关键代码

    盲猜要点19999下,于是打开ce

    直接改成19998,最后点一下click it

    真不戳

    flag:flag{1999902069a45792d233ac}

    RE18:rsa

    21.5.9

    rsa不会,直接抄的BUUCTF RSA

    RE21:[2019红帽杯]easyRE

    21.5.18

    代码好乱,不会,看了一下wp

    打开文件,一堆函数,然后shift+f12打开

    找到一些东西

    看起来就是base64

    点进函数

    写半天,把这个base64解密了,上面那一串异或了就一个提示

    看别人的wp才知道还有个函数在另外一个地方

    然后来个脚本

    '''a='Iodl>Qnb(ocy'+chr(127)+'y.i'+chr(127)+'d`3w}wek9{iy=~yL@EC'
    b=''
    for i,j in zip(a,range(len(a))):
        b+=chr(ord(i)^j)
    print b'''
    
    v1='flag'
    v2=[64,  53,  32,  86,  93,  24,  34,  69,  23,  47, 
       36, 110,  98,  60,  39,  84,  72, 108,  36, 110, 
      114,  60,  50,  69,  91]
    key=''
    flag=''
    
    for i in range(4):
        key+=chr(v2[i]^ord(v1[i]))
    
    for i in range(len(v2)):
        flag+=chr(v2[i]^ord(key[i%4]))
    
    print flag
    

    flag:flag{Act1ve_Defen5e_Test}

    RE22:[ACTF新生赛2020]rome

    21.5.18

    脚本没写出来

    s='Qsw3sj_lz4_Ujw@l'
    flag=''
    for i in s:
        if ord(i)>64 and ord(i)<=90:
            flag+=chr((ord(i)-14))
        elif ord(i)>96 and ord(i)<=122:
            flag+=chr((ord(i)-18))
        else:
            flag+=i
    print flag
    

    有点问题,不知道为啥,后来就直接抄了cnblog[ BUUCTF--[ACTF新生赛2020]rome][5]

    flag:flag{Cae3ar_th4_Gre@t}

    RE23:[FlareOn4]login

    21.5.26

    简单的题

    算法都没看,直接试一下alert(rotFlag);

    然后随便输入一些字母,发现就是简单的移位

    写个脚本

    s='PyvragFvqrYbtvafNerRnfl@syner-ba.pbz'
    flag=''
    
    for i in s:
        if (i>='a' and i<='m') or (i>='A' and i<='M'):
            flag+=chr(ord(i)+13)
        elif (i>='n' and i<='z') or (i>='N' and i<='Z'):
            flag+=chr(ord(i)-13)
        else:
            flag+=i
    
    print flag
    

    flag:flag{ClientSideLoginsAreEasy@flare-on.com}

    RE25:[GUET-CTF2019]re

    21.5.26

    一堆奇葩东西

    手工处理数据之后上脚本

    a=[1629056,
    6771600,
    3682944,
    10431000,
    3977328,
    5138336,
    7532250,
    5551632,
    3409728,
    13013670,
    6088797,
    7884663,
    8944053,
    5198490,
    4544518,
    3645600,
    10115280,
    9667504,
    5364450,
    13464540,
    5488432,
    14479500,
    6451830,
    6252576,
    7763364,
    7327320,
    8741520,
    8871876,
    4086720,
    9374400,
    5759124]
    
    b=[166163712,
    731332800,
    357245568,
    1074393000,
    489211344,
    518971936,
    406741500,
    294236496,
    177305856,
    650683500,
    298351053,
    386348487,
    438258597,
    249527520,
    445362764,
    174988800,
    981182160,
    493042704,
    257493600,
    767478780,
    312840624,
    1404511500,
    316139670,
    619005024,
    372641472,
    373693320,
    498266640,
    452465676,
    208422720,
    515592000,
    719890500]
    


    ​ flag=''

    for i,j in zip(a,b):
        flag+=chr(j/i)
    print flag
    
    #坑壁题目缺第七位,看都看不到。。。
    

    坑壁题目缺第七位,看都看不到。。。害我看wp

    好像要爆破第七位..是1

    flag:flag{e165421110ba03099a1c039337}

    RE27:相册

    21.7.27

    时隔多月我又做了一题(主要原因是放假了在玩

    首先下载,发现是个apk,那么我们打开jadx看看

    这么怪的名字肯定在里面

    随便点开几个康康

    然后去c2看看

    ok,这波属于是写明了是base64了,接下来我们去so文件里面找一下base64的字符

    解压得到libcore.so

    ida打开,shift+f12

    得到几个base64

    选中的这个就是flag需要的邮箱了

    包上flag提交即可。

    flag:flag{18218465125@163.com}

    RE29:level1

    21.8.3

    ida64打开

    逻辑很清晰

    奇数进行位运算右移,偶数乘以下标

    python写个脚本就行了

    a=[198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000]
    flag=''
    for i in range(1,20):
        if (i&1)!=0:
            a[i-1]=a[i-1]>>i
        else:
            a[i-1]=a[i-1]/i
    for j in a:
        flag+=chr(j)
    print flag
    

    flag:ctf2020{d9-dE6-20c}

    RE30:[MRCTF2020]Transform

    21.8.5

    无壳,打开ida64看一下main

    主要的加密还是在这两句

    这是数据

    具体就是根据索引dword_40F040打乱顺序然后再异或,然后我们只需要反过来即可,也就是倒着循环reversed(range(33))然后先异或再flag[dword_40F040[i]]=byte_40F0E0[i]即可

    写出python脚本:

    dword_40F040=[0x09,0x0A,0x0F,0x17,0x07,0x18,0x0C,0x06,0x01,0x10,0x03,0x11,0x20,0x1D,0x0B,0x1E,0x1B,0x16,0x04,0x0D,0x13,0x14,0x15,0x02,0x19,0x05,0x1F,0x08,0x12,0x1A,0x1C,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
    byte_40F0E0=[0x67,0x79,0x7B,0x7F,0x75,0x2B,0x3C,0x52,0x53,0x79,0x57,0x5E,0x5D,0x42,0x7B,0x2D,0x2A,0x66,0x42,0x7E,0x4C,0x57,0x79,0x41,0x6B,0x7E,0x65,0x3C,0x5C,0x45,0x6F,0x62,0x4D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
    flag=[0]*33
    
    for i in reversed(range(0,33)):
        byte_40F0E0[i]^=(dword_40F040[i])
        flag[dword_40F040[i]]=byte_40F0E0[i]
        
    print ''.join([chr(x) for x in flag])
    

    flag:flag{Tr4nsp0sltiON_Clph3r_1s_3z}

    RE31:[WUSTCTF2020]level2

    21.8.5


    ???
    放到kali里面upx -d,shift+f12就出来了

    flag:flag{Just_upx_-d}

    RE34:[MRCTF2020]Xor

    21.10.12

    反编译失败,调用函数参数有问题,这里删掉三个点这个东西就行了。

    超级简单的异或,直接脚本

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

    flag:MRCTF{@_R3@1ly_E2_R3verse!}

    RE35:[FlareOn4]IgniteMe

    21.10.14

    今天线下打金华市和美杯 来早了,做了个re

    ida打开

    只有五个函数,

    这两个是关键函数,打开看看

    这个函数看起来就是对数组初始化,没啥用

    这个就比较有用了,可以看到一个简单的异或操作,但是v4初值不知道,点进sub_401000():

    查了下这个函数,也没查出什么,动调看看

    断点断在那个for循环上面

    然后双击v4,可以看到

    他的初值是4。

    于是写个脚本

    a=[   13,  38,  73,  69,  42,  23, 120,  68,  43, 108, 
       93,  94,  69,  18,  47,  23,  43,  68, 111, 110, 
       86,   9,  95,  69,  71, 115,  38,  10,  13,  19, 
       23,  72,  66,   1,  64,  77,  12,   2, 105]
    flag=''
    b=0
    v4=4
    for i in reversed(a):
       b=v4^i
       v4=b
       flag+=chr(b)
    print flag[::-1]
    

    flag:flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}

    RE36:[MRCTF2020]hello_world_go

    21.10.14

    go语言 逆向出来是真的复杂啊
    完全看不懂

    主函数就有flag

    flag:flag{hello_world_gogogo}

    RE37:[WUSTCTF2020]level3

    21.10.19

    main函数给了个base64

    有个奇怪的换表函数,好像在start的时候被调用了(main之前)

    直接动调一下看看被改成啥样了(脚本写了但是好像不太对?

    真不戳

    然后随便找个换表脚本就出来了

    flag:wctf2020{Base64_is_the_start_of_reverse}

    RE38:[WUSTCTF2020]Cr0ssfun

    21.10.19

    手动操作复制出来输出,没什么好说的

    flag:wctf2020{cpp_@nd_r3verse_@re_fun}

    RE39:[WUSTCTF2020]Cr0ssfun

    21.10.19
    不太会

    参考这个https://blog.csdn.net/weixin_47158947/article/details/107818896

    不过md5那个地方X2是变大写,所以这篇文章交不上去,实际flag内需要大写

    flag:flag{B8C37E33DEFDE51CF91E}

    本文作者:Xunflash
    本文链接:https://www.xunflash.top/index.php/archives/BUUCTFRE.html
    最后修改时间:2021-10-19 22:30:19
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    球球给菜鸡站长评个论8
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论