zoukankan      html  css  js  c++  java
  • 攻防世界 reverse leaked-license-64

    mark一下,以后分析

    原文:http://sibears.ru/labs/ASIS-CTF-Quals-2016-Leaked_License/

    [ASIS CTF Quals 2016] - 泄露许可证[64]

    GROKE
    , 2016年5月9日
     

    从朋友的朋友的老兄那里借了这个软件许可证和图书馆!如果我可以伪造今年竞争计算机ID的许可证,那就太好了。

    我们获得了Leaked_Lisence.dll和文件admin@nsa.gov.us_license

     

    Groke @ MacBook-Air-groke:〜/ ctf / asis / Leaked_Lisence $ cat admin @nsa.gov.us_license 
    7e43ecf0b4e27dacfb5e613437b17acb46e8deab2c70510dc71844b492a691ec

     

    在dll中,导出一个验证方法,其参数占用48个字节。如果稍微查看一下该文件,可以看到源代码是C ++中的:

    “ios_base :: eofbit set” 
    “ios_base :: failbit set” 
    “ios_base :: badbit set”
    

    然后假设参数是std :: string。使用代码,我们恢复以下形式的字符串:

    struct  magic { 
        union { 
            char  * s1 ; 
            char  s2 [ 16 ]; 
        }; 
        int  size ; 
        int  real_length ; 
    };
    

    将此结构添加到id后,很明显验证函数按值接受2个这样的行。

    实际上,算法本身如下(伪Python):

    DEF  验证ID 许可证):
        开放“secret.key” 作为与 secret_file:
            秘密 =  secret_file read ()
        checkString  =  sha256 secret 解码'hex' len id <  32 id  =  id + id 
        secretFromUser  =  “” 
        license  =  license 解码'hex' for  x  in  xrange 32 ):
            secretFromUser  + =  chr ord id [ i ]) ^  ord license [ i ]))
        check2  =  sha256 secretFromUser 解码'hex' 如果 check2 equal checkString ):
            返回 1 
        返回 0
    

    显然,这足以让我们从此许可证中获取secretFromUser并在其基础上生成我们自己的许可证。有一个问题,因为不清楚许可证的ID是什么。有一种理论认为某处出现了错误,并且编写了以下文件以便用笔感觉:

    #include“stdafx.h” 
    #include <iostream> 
    #include <string> 
    #include <Windows.h>
    
    
    
     
    struct  magic { 
        union {  
            char  * s1 ;  
            char  s2 [ 16 ];  
        };  
        int  size ;  
        int  real_length ;  
    }; 
    
    magic  *  get_my_magic char  *  buf ){  
        struct  magic  * ret  =  magic  * malloc 24 );  
        int  ln  =  strlen buf );  
        ret - > s1  =  char  * malloc ln ); 
        ret - > size  =  ln ;  
        ret - > real_length  =  ln ;  
        strncpy ret - > s1 buf ln );  
        return语句 的RET ;  
    } 
    
    int  main () { 
        magic  * id  =  get_my_magic “admin@nsa.gov.us” ); 
        magic  * key  =  get_my_magic “7e43ecf0b4e27dacfb5e613437b17acb46e8deab2c70510dc71844b492a691ec” ); 
        auto  hMod  =  LoadLibraryA “Leaked_Lisence.dll” ); 
        auto  myFunc  =  int  * )(magic magic ))GetProcAddress hMod “verify” ); 
        汽车 s  =  myFunc * id * key ); 
        std :: cout  <<  s  <<  std :: endl ; 
    }
    

    需要魔术结构,因为工作室中的sizeof(std :: string)<> 24

    然而,实践表明理论计算是正确的,我们回到了id的搜索。尝试过“quals2016@asis-ctf.ir”后,我们获得了以下许可证:
    6e52e0f5a99023eeac30672828ec22db53ea9dab30414a1fca4511ebd5bea4fe 
    ,结果就是flag:

    ASIS{6e52e0f5a99023eeac30672828ec22db53ea9dab30414a1fca4511ebd5bea4fe}
  • 相关阅读:
    STM32 硬件I2C 到底是不是个坑?
    memory cache 和 disk cache
    希尔排序为什么不稳定
    17-18专业课
    fread和fseek的用法
    浅析alsa声卡驱动snd_interval结构体openmin,openmax和integer含义
    动态存储区、静态存储区、堆和栈的区别
    【专家坐堂Q&A】在 petalinux-config 中选择外部来源时,可将符号链路添加内核来源目录树
    模型文件后缀介绍
    @RestController注解
  • 原文地址:https://www.cnblogs.com/DirWang/p/11469346.html
Copyright © 2011-2022 走看看