• BUUCTF--xor


    测试文件:https://buuoj.cn/files/caa0fdad8f67a3115e11dc722bb9bba7/7ea34089-68ff-4bb7-8e96-92094285dfe9.zip?token=eyJ0ZWFtX2lkIjpudWxsLCJ1c2VyX2lkIjoxOTAzLCJmaWxlX2lkIjoyMzl9.XW-jSA.6pb2caCKvD2RceQo5EiL3_wSfec

    1.准备

    恩...毫无信息,用万能的IDA打开,博客园居然502了...

    2.IDA打开

    反编译main函数,获得C代码

     1 int __cdecl main(int argc, const char **argv, const char **envp)
     2 {
     3   char *v3; // rsi
     4   int result; // eax
     5   signed int i; // [rsp+2Ch] [rbp-124h]
     6   char v6[264]; // [rsp+40h] [rbp-110h]
     7   __int64 v7; // [rsp+148h] [rbp-8h]
     8 
     9   memset(v6, 0, 0x100uLL);
    10   v3 = (char *)256;
    11   printf("Input your flag:
    ", 0LL);
    12   get_line(v6, 256LL);
    13   if ( strlen(v6) != 33 )
    14     goto LABEL_12;
    15   for ( i = 1; i < 33; ++i )
    16     v6[i] ^= v6[i - 1];
    17   v3 = global;
    18   if ( !strncmp(v6, global, 0x21uLL) )
    19     printf("Success", v3);
    20   else
    21 LABEL_12:
    22     printf("Failed", v3);
    23   result = __stack_chk_guard;
    24   if ( __stack_chk_guard == v7 )
    25     result = 0;
    26   return result;
    27 }

    2.1代码分析

    从第13行代码,我们知道flag的长度是33

    第18行代码,在比较v6和global,后面的0x21也印证了,flag长度是33

    global

    __cstring:0000000100000F6E aFKWOXZUPFVMDGH db 'f',0Ah              ; DATA XREF: __data:_global↓o
    __cstring:0000000100000F6E                 db 'k',0Ch,'w&O.@',11h,'x',0Dh,'Z;U',11h,'p',19h,'F',1Fh,'v"M#D',0Eh,'g'
    __cstring:0000000100000F6E                 db 6,'h',0Fh,'G2O',0

    从第15~16行代码,我们知道了v6的处理方式,那么将global反过来处理,也就获得了flag。

    2.2脚本获取flag

    str1 = ['f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v',
            '"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O']
    
    x = 'f'
    
    for i in range(1, len(str1)):
        if (isinstance(str1[i], str)):
            if (isinstance(str1[i - 1], str)):
                x += chr(ord(str1[i]) ^ ord(str1[i - 1]))
            else:
                x += chr(ord(str1[i]) ^ str1[i - 1])
        else:
            x += chr(str1[i] ^ ord(str1[i - 1]))
    
    print(x)

    注:第一个‘f’没有被处理,但是也是flag的一部分。

    3.get flag!

    flag{QianQiuWanDai_YiTongJiangHu}

  • 相关阅读:
    软件测试工程师的素质
    软件测试阶段的划分
    如何去涉及测试用例
    如何判断测试结束
    Linux常用命令大全
    测试用例设计方法
    Web测试方法
    loadrunner
    谈谈重复性测试
    软件测试思维导图
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11461575.html
Copyright © 2020-2023  润新知