-
-
[原创]一道简单的RE迷宫题
-
发表于: 2025-9-18 22:38 2568
-

首先使用工具查看文件信息,是Linux系统下的一个文件,而且没有打包,很正常的程序。
不想动态分析啊,动态分析很依赖操作系统的嘛,用IDA查看文件。函数也很简单,一个初始化跳转到main函数,然后就可以分析函数内容了。其实说是逆向还是在这里主要看代码。这里为了方便逐一分析代码就直接粘贴过来了。
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
const char *v3; // rsi
signed __int64 v4; // rbx
signed int v5; // eax
char v6; // bp
char v7; // al
const char *v8; // rdi
__int64 v10; // [rsp+0h] [rbp-28h]
v10 = 0LL;
puts("Input flag:");
scanf("%s", &s1, 0LL); 这里可以看到要求用户输入,存储在s1里面,0LL是一个多余的参数,可以不用管。
if ( strlen(&s1) != 24 || (v3 = "nctf{", strncmp(&s1, "nctf{", 5uLL)) || *(&byte_6010BF + 24) != 125 )
这里处理用户输入,主要的判断条件有三个:
1.判断输入长度是否为24,
2.将v3赋值为”nctf{“,把s1的前五个字符与”nctf{“进行比较,其中5uLL是一个参数,表示前5,无符号,LongLong型,
3.&byte_6010BF + 24地址处的内容是否为”}“,也就是ASCII码125。
{
LABEL_22:
puts("Wrong flag!"); 前面条件不符就直接失败了啊。
exit(-1);
}
v4 = 5LL; v4被赋值为5,LL表示5是一个LongLong型。
if ( strlen(&s1) - 1 > 5 )
{
while ( 1 )
{
v5 = *(&s1 + v4); 这里就比较好懂了,接下来要从用户输入的第6个字符开始分析。
v6 = 0;
if ( v5 > 78 )
{
v5 = (unsigned __int8)v5; 为什么v5要做这么一个操作呢,v5在这里要确保字符在这里被解析成一个无符号字节,如果是负的可能有意外结果。
if ( (unsigned __int8)v5 == 79 ) 一、O
{
v7 = sub_400650((char *)&v10 + 4, v3);
goto LABEL_14;
}
if ( v5 == 111 ) 二、o
{
v7 = sub_400660((char *)&v10 + 4, v3);
goto LABEL_14;
}
}
else
{
v5 = (unsigned __int8)v5;
if ( (unsigned __int8)v5 == 46 ) 三、.
{
v7 = sub_400670(&v10, v3);
goto LABEL_14;
}
if ( v5 == 48 ) 四、0
{
v7 = sub_400680((int *)&v10);