攻防世界 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}
posted @ 2019-09-05 20:04  DirWangK  阅读(859)  评论(0编辑  收藏  举报