01.easyre

解题步骤

  1. 使用IDA进行打开

  2. 快捷键shift+F12查询字符串,再使用Ctrl+f查询关键字符串flag

    image-20230712184510339

    image-20230712184424442

  3. 得到flag

02.reverse1

解题步骤

  1. 使用IDA进行打开

    image-20230712184537973

  2. 快捷键shift+F12查询字符串,再使用Ctrl+f查询关键字符串flag

    image-20230712184556142

    image-20230712184615531

  3. 右键上图的代码,选择List cross references to

  4. image-20230712184634040

    进入IDA view-A界面,发现输入的hello_world

    image-20230712184656655

  5. 使用快捷键F5查看伪代码,发现重要if条件判断

    image-20230712184716247

  6. 使用快捷键R,将数字转化为字符串,分析转化后的代码可以知道,这个题目是将flag里的o替换成了数字0

    image-20230712184733974

  7. 得到flag为flag{hell0_w0rld}

03.reverse2

解题步骤

  1. 使用IDA进行打开

    image-20230712184806649

  2. 快捷键shift+F12查询字符串,再使用Ctrl+f查询关键字符串flag,并发现关键信息,hacking_for_fun}可能为flag的一部分。

    image-20230712184818342

  3. 进入 this is the right flag!代码处,使用右键选择List cross references to

    image-20230712184829779

  4. 进入伪代码,分析函数发现一个重要的if判断语句,将if函数里的16进制替换成字符串发现代码意思是,将flag中出现的i和r字母替换成1

    image-20230712184844551

  5. 所以我们尝试将刚刚的得到的hacking_for_fun中的i和r替换成1,提交发现正确。

  6. flag为flag{hack1ng_fo1_fun}

04.reverse——-内涵的软件

解题步骤

  1. 运行软件发现,flag被隐藏了,根据题目提示,使用逆向软件IDA打开文件

    image-20230712184902043

  2. 根据题目提示,使用逆向软件IDA打开文件image-20230712184917150image-20230712184940517

  3. 发现关键信息,是flag 的形式,尝试提交,发现flag正确,flag{49d3c93df25caad81232130f3d2ebfad}

05.reverse——-helloworld

解题步骤

  1. 下载附件发现是apk文件。

    image-20230712184956774

  2. 使用GDA打开

    image-20230712185009235

  3. 搜索flag关键字,发现flag

    image-20230712185024132

  4. flag为:flag{7631a988259a00816deda84afb29430a}

06.reverse——-新年快乐

解题步骤

  1. 查壳,使用PEID查看文件是否有壳(前几题未按照这个步骤进行),发现带有UPX壳

    image-20230712185037653

  2. 使用UPX脱壳工具进行脱壳

    image-20230712185058013

  3. 将脱壳后的文件拖入IDA中

    image-20230712185110082

  4. 使用shift+f12快捷键查看字符串,使用ctrl+f查询flag关键词

    image-20230712185124493

  5. 右键查看,接着F5查看伪代码

    image-20230712185136273

    image-20230712185148632

  6. 分析伪代码可以知道输入Str1需要和v1(v1的内容是HappyNewYear!)进行字符串比较,如果两者的字符串一样,则输出this is true flag!

    1
    2
    qmemcpy(&v1, "HappyNewYear!", 0xEu);
    *(_WORD *)Str1 = 0;
    1
    2
    if ( !strncmp(Str1, &v1, strlen(&v1)) )
    result = puts("this is true flag!");
  7. 经过函数的分析可知flag为flag{HappyNewYear!}

07.[GWCTF 2019]pyre

解题步骤

  1. 下载附件发现得到的是一个pyc的文件,我们可使用python的在线解密网站进行解密,将pyc的文件转化为python代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #!/usr/bin/env python
    # visit https://tool.lu/pyc/ for more information
    # Version: Python 2.7

    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数组里的数据进行着两个运算的逆运算
    code += num

    for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

    print code
    code = [
    '%1f',
    '%12',
    '%1d',
    '(',
    '0',
    '4',
    '%01',
    '%06',
    '%14',
    '4',
    ',',
    '%1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '%01',
    'D',
    ';',
    '%',
    '%13']
  2. 根据代码写出解密脚本为

    1
    2
    3
    4
    5
    6
    code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14',
    '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
    for i in range(len(code)-2,-1,-1):
    code[i]=chr(ord(code[i])^ord(code[i+1]))
    for i in range(len(code)):
    print(chr((ord(code[i])-i)%128),end="")
  3. image-20230702082456688

  4. 所以答案为GWHT{Just_Re_1s_Ha66y!}

08.[ACTF新生赛2020]easyre

解题步骤

  1. 下载附件进行查壳发现存在upx壳

  2. 使用工具进行脱壳,在此处下载脱壳工具,执行以下两个命令

    1
    upx.exe -d       //进行安装upx脱壳工具
    1
    upx.exe -h  文件绝对路径

    image-20230702085844867

  3. 再次进行查壳发现无壳

    image-20230712185216285

  4. 使用IDA进行打开

09.[WUSTCTF2020]level1

解题步骤

  1. 查壳,将拿到的附件载入查壳工具,发现64为且无壳。

    image-20230712181739840

  2. 将程序载入64位IDA pro,进行关键字的检索,快捷键shift+F12,发现无关键词

    image-20230712182043176

    image-20230712182112203

  3. 发现main函数,双击进入。

    image-20230712182148001

  4. 使用tab键或者F5快捷键进行汇编代码的查看。

    image-20230712182253062

  5. 发现关键代码,进行相关的分析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    int __cdecl main(int argc, const char **argv, const char **envp)
    {
    int i; // [rsp+4h] [rbp-2Ch]
    FILE *stream; // [rsp+8h] [rbp-28h]
    char ptr[24]; // [rsp+10h] [rbp-20h] BYREF
    unsigned __int64 v7; // [rsp+28h] [rbp-8h]

    v7 = __readfsqword(0x28u);
    stream = fopen("flag", "r");
    fread(ptr, 1uLL, 0x14uLL, stream); //对文件进行操作,正好附件中有个文件是这个算法的输出结果
    fclose(stream);
    for ( i = 1; i <= 19; ++i ) //关键的循环操作,进行了19次循环
    {
    if ( (i & 1) != 0 ) //如果数组的下标是偶数时
    printf("%ld\n", (unsigned int)(ptr[i] << i)); //如果数组的下标是偶数时,进行这个操作移位操作,逆向的思路(ptr[i] >> i))
    else
    printf("%ld\n", (unsigned int)(i * ptr[i]));//如果数组的下标是奇数时,进行这个操作i * ptr[i],逆向的思路 ptr[i]/i
    }
    return 0;
    }
  6. 逆向代码编写之py代码

    1
    2
    3
    4
    5
    6
    7
    8
    ptr = [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 % 2 == 1:
    flag =flag+chr(ptr[i-1] >> i)
    else:
    flag = flag+chr(ptr[i-1] // i)
    print(flag)
  7. 逆向代码编写之C语言代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>

    int ptr[] = {198, 232, 816, 200, 1536, 300, 6144, 984, 51200, 570, 92160, 1200, 565248, 756, 1474560, 800, 6291456, 1782, 65536000};

    int main()
    {
    char flag[20];
    int i;

    for (i = 1; i <= 19; ++i)
    {
    if (i % 2 == 1)
    {
    flag[i-1] = (char)(ptr[i-1] >> i);
    }
    else
    {
    flag[i-1] = (char)(ptr[i-1] / i);
    }
    }

    flag[19] = '\0'; // 添加字符串结尾的空字符

    printf("%s\n", flag);

    return 0;
    }
  8. 运行结果截图

    image-20230712182929943

    image-20230712182946204