首页
社区
课程
招聘
SWPUCTF 2021 新生赛 re1 WriteUp
发表于: 2025-1-20 22:40 4829

SWPUCTF 2021 新生赛 re1 WriteUp

2025-1-20 22:40
4829

SWPUCTF 2021 新生赛 re1 WriteUp

概览

首先运行这个软件,查看运行效果
图片描述
可以看到,该程序就是一个简单的输入flag,输入错误则结束。

使用exeinfo查看exe是否有加壳

图片描述

可以看到,该程序是一个64位程序,并未进行任何加壳处理,因此将该程序直接使用IDA打开,进行静态分析

静态分析

图片描述

在IDA的反汇编代码中首先看到了程序输入的流程,可以知道,用户的输入存储在Str1这个变量之中

完成输入之后,将var_4变为了0,随后进行跳转,此处初步怀疑是一个for循环,var_4极有可能是i
图片描述

跳转之后,紧跟又是对var_4的比较与跳转,已经基本可以判断是for循环的结构,此处也可按空格键,转换为流程控制视图观察验证结果

因此将var_4重命名为i辅助分析,并转至401595分析for循环逻辑

图片描述

可以看到如上代码是对Str1,即用户输入的操作进行遍历操作,将字符串中的e全部变为了3

完成循环后,执行的代码位于4015CC,因此可以看到,此处再次将i的值变为了0,跟进至401603处观察

图片描述

可以看到,此处又是一个for循环,该循环的作用的是将用户输入的字符串中的‘a'全部变为’4‘

图片描述

随后便对Str1和Str2进行了比较,如相等则输出“you are right!”,由此可知Str2便是解题的关键

定位至Str2的赋值处

图片描述

此处便是通过dword,word和byte类型,对Str2的赋值。由这些16进制数我们就可以知道每个字符的ascii码是多少。此处需要注意由于小端存储,因此此处还原时需要进行逆序

编写解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main()
{
    char szFlag[] = {
        0x7b, 0x33, 0x34, 0x73,
        0x79, 0x5f, 0x72, 0x33,
        0x76, 0x33, 0x72,0x73,
        0x33,0x7d,0
    };
    for (int i = 0; i < 15; i++)
    {
        if (szFlag[i] == '4')
        {
            szFlag[i] = 'a';
        }
        if (szFlag[i] == '3')
        {
            szFlag[i] = 'e';
        }
    }
    printf("%s", szFlag);
    return 0;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回