美文网首页
攻防世界 no-strings-attached(Reverse

攻防世界 no-strings-attached(Reverse

作者: 御史神风 | 来源:发表于2020-09-30 01:21 被阅读0次

    解题概要

    使用pe分析是32位文件,使用ida反汇编分析代码逻辑,是一道要求用户输入flag,然后比较的题目。
    正确flag并不是明文存储,所以解题关键为分析构造flag的函数。
    需注意的是使用wchar_t,分析可得是32bit长(搜索得到长度可能是16或32bit)。
    以下按时间顺序分享解题过程。

    解题过程

    主函数非常直白,连续调用四个函数,然后就什么都没干了。

    setlocale(6, &locale);
    banner();
    prompt_authentication();
    authenticate();
    

    前三个函数都莫名奇妙,第一个搜索得到是用于区域设置。
    第二个获取时间,搞个随机数种子,还输出了欢迎语。
    第三个故弄玄虚,函数里只输出了句话叫你输入。
    重点在第四个

    void authenticate()
    {
      int ws[8192]; // [esp+1Ch] [ebp-800Ch]
      wchar_t *s2; // [esp+801Ch] [ebp-Ch]
    
      s2 = decrypt(&s, &unk_8048A90);
      if ( fgetws(ws, 0x2000, stdin) )
      {
        ws[wcslen(ws) - 1] = 0;
        if ( !wcscmp(ws, s2) )
          wprintf("S");
        else
          wprintf("A");
      }
      free(s2);
    }
    

    fgetws是wchar_t版的fgets
    wcscmp同样是wchar_t版的strcmp

    看到!wcscmp(ws, s2)第一反应便是flag在这里。
    ws来自用户输入,那么s2就是flag了。
    而s2来自decrypt。看来这就是构造flag的代码了。
    decrypt这个函数还算简单,自己转成c或py运行一遍即可得到flag。
    简单分析下,实际上是循环用a2去减走s的数据。两者差值恰好在ASCII范围内,相减后直接转为字符类型即可。
    疑点
    ida反汇编得到的c代码中,用于flag数组下标的v4并没有初始化为0。
    v4在栈中的地址是ebp-1Ch
    而只有用于a2下标的var_18[ebp-18h]被初始化为0。
    可能题目出现了错误,忘记初始化v4了。

    相关文章

      网友评论

          本文标题:攻防世界 no-strings-attached(Reverse

          本文链接:https://www.haomeiwen.com/subject/exoyuktx.html