【CTF】BUUCTF RE 刷(抄wp)题记录
浏览 255 | 评论 0 | 字数 11341
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}

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