论坛首页 逆向工程技术区 阅读主题

[原创]一道简单的RE迷宫题

383 浏览 0 回复
#1 楼主 2026-06-01 21:08:55
首先使用工具查看文件信息,是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

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号