欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

三个白帽条条大路通罗马系列2之二进制题分析

来源:本站整理 作者:佚名 时间:2016-06-06 TAG: 我要投稿
    {
      if ( secret[0][j] == *(_BYTE *)(i + v9) )   //这里检查上面HASH后的每一个字节对应的字符是否在
//字符串secret[0]里
      {
        v5 = 1;
        break;
      }
    }
    if ( !v5 )
    {
      sub_43019E("Wrong code!\n");    //如果不是 就挂了。
      sub_4302C0(1u);
    }
  }
  v3 = malloc(16);
  memset(v3, 0, 16);
  sub_430045(v9, v3);
  sub_42F3F2(v3);
  return sub_42FDC0();
}
如果上面认证全部通过,按F9后,会进入HASH加密的函数:
这个时候需要进行加密的就是上面得到的第一次HASH加密后的12字节数据。
对这12字节加密,每4个一组,共3组,每组得到3字节数据,这样第二次HASH后就得到了9字节的数据。按F9后到达这里:
int __cdecl sub_431CA0(int a1)
{
   memset(&v2, 0xCCu, 0xF0u);
  v6 = a1;
  v5 = strlen(a1);
  if ( v5 != 9 )   //首先判断第二次HASH后的字节长度是否为9,不是就错了。
  {
    sub_43019E("Wrong code!\n");
    sub_4302C0(1u);
  }
  for ( i = 0; i
  {
    if ( (signed int)*(_BYTE *)(i + v6) signed int)*(_BYTE *)(i + v6) > 57 )  //检查第二次HASH后的//每个字节是否都为数字 //字符
    {
      sub_43019E("Wrong code!\n");
      sub_4302C0(1u);
    }
  }
  for ( i = 0; i
  {
    for ( j = i + 1; j
    {
      if ( *(_BYTE *)(i + v6) == *(_BYTE *)(j + v6) )  //检查第二次HASH后的每个字节是否彼此重复。
      {
        sub_43019E("Wrong code!\n");
        sub_4302C0(1u);
      }
    }
  }
  sub_42F1D1(v6);                                 //如果上面都通过了 ,就到达了胜利的彼岸了!
  return sub_42FDC0();
}
以上就是整个二进制算法的逆向过程,这里我们搞清楚了他的加密算法,下面就是尝试破解认证码了。
0x02 算法破解
针对第一部分HASH算法,我计划是从R9Ly6NoJvsIPnWhETYtHe4Sdl+MbGujaZpk102wKCr7/ODg5zXAFqQfxBicV3m8U里任意选取两个(根据需要也可能是1个)字符分别填充到b@@t S@BX @K@d n@@X,并分组进行HASH加密,再验证HASH结果是否满足条件,如果满足条件,那么就保存一下选取的字符以及HASH后的密文。
具体算法如下:
char m2[17]="b@@tS@BX@K@dn@@X",*p,*q;
    int in1=0,in2=0,in3=0,in4=0;
    q=m2;
    get(q,0,1,2);   //分组取hash  参数分别为字符串 序号  m2里需要填充的字符坐标
    q+=4;
    get(q,1,1,0);
    q+=4;
    get(q,2,0,2);
    q+=4;
    get(q,3,1,2);    //共4组,到这里infos就得到了所有满足第一次HASH结果的可能的值
针对第二次HASH加密,我们把get()函数获得的所有满足条件的密文字符串进行组合,然后对每组字符串再次尝试hash加密,把得到的结果进行检查是否每个字符都是0-9内并且互不重复,把满足条件的结果记录下来。
最后完整破解认证码的代码如下:
#include
#include
#include
char m1[70]="R9Ly6NoJvsIPnWhETYtHe4Sdl+MbGujaZpk102wKCr7/ODg5zXAFqQfxBicV3m8U";
char sz[11]="0123456789";
struct info
{
    char *hash;  //存放第一次hash后的值
    char *mw;    //存放hash前明文
};
info infos[4][1000];
long hash(char *s)
{  
    int j=0,v7=0,k=0;
    v7 = 0;
    for ( j = 0; j
    {
        for ( k = 0; ; ++k )
        {
            if ( k >=  strlen(m1))
                break;
            if ( m1[k] == s[j] )
            {
                v7
                v7 += k;
                break;

上一页  [1] [2] [3] [4] [5] [6]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载