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

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