首先使用工具查看文件信息,是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);
登录后可查看完整内容
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288537.htm
[原创]一道简单的RE迷宫题
383 浏览
0 回复
暂无回复,快来抢沙发吧!