美文网首页
Reversing-x64Elf-100_攻防世界RE【3】

Reversing-x64Elf-100_攻防世界RE【3】

作者: 火把_033f | 来源:发表于2020-04-06 14:33 被阅读0次

    题目描述

    下载附件拖入ida,发现是elf文件。

    解题过程

    关键判断如下:

    signed __int64 __fastcall sub_4006FD(__int64 a1)
    {
      signed int i; // [rsp+14h] [rbp-24h]
      const char *v3; // [rsp+18h] [rbp-20h]
      const char *v4; // [rsp+20h] [rbp-18h]
      const char *v5; // [rsp+28h] [rbp-10h]
    
      v3 = "Dufhbmf";
      v4 = "pG`imos";
      v5 = "ewUglpt";
      for ( i = 0; i <= 11; ++i )
      {
        if ( (&v3)[i % 3][2 * (i / 3)] - *(char *)(i + a1) != 1 )
          return 1LL;
      }
      return 0LL;
    }
    

    凭感觉写出了对应的解密python代码:

    v3 = "Dufhbmf";
    v4 = "pG`imos";
    v5 = "ewUglpt";
    arr2=[v3,v4,v5]
    
    result=""
    for i in range(12):
            int_value=ord(arr2[i % 3][2 * int(i/3)][0])-1
            mingwen = chr(int_value)
            result+=mingwen
    print(result)
    

    又想到Z3也许可以解这个东西:

    from z3 import *
    
    v3 = "Dufhbmf";
    v4 = "pG`imos";
    v5 = "ewUglpt";
    arr2=[v3,v4,v5]
    
    
    
    arr =[Int('v_%s' % (i+1)) for i in range(120)]
    sovler=Solver()
    for i in range(12):
        sovler.add(ord(arr2[i % 3][2 * int(i/3)][0])-arr[i]==1)
    sovler.check()
    m =sovler.model()
    
    sortedM= sorted ([(d, m[d]) for d in m], key = lambda x: str(x[2:]),reverse=True)
    sortedM.reverse()
    result=""
    for ele in sortedM:
        result=result+chr(ele[1].as_long())
    print(result)
    
    

    果然也是可以的,只不过写起来很麻烦。还不如直接往回推。

    题目讨论:

    在解题过程中出现了两个问题:

    1. 作者粗心把位数看成了11位,结果答案怎么也不对。
    2. 只是凭感觉写出了对应的代码,看IDA生成的C并不能看出来这个是一个二维数组。C的语法还是差一些。

    相关文章

      网友评论

          本文标题:Reversing-x64Elf-100_攻防世界RE【3】

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