AES CBC 逆向分析,异常处理,反调试

AES CBC 逆向分析,异常处理,反调试

AES CBC

拿到题目在IDA中看见了类似AES的图标

在这里插入图片描述
放入PEID的KANAL插件查看

在这里插入图片描述

找到了AES的S盒和BASE64的S盒,初步确定了内部的加密算法为AES和base64。

来到关键函数

4020D0处此处对输入字符串进行了加密。进入该函数输入字符串首先和sctfsctfsctfsctf进行了异或

之后又于sycloversyclover进行了异或,后面黑盒测试了一下就是AES ECB模式的加密。

测试数据:1234567890123456 与sctfsctfsctfsctf异或后得到数据如下

42 51 47 52 46 55 43 5E 4A 53 45 54 40 57 41 50

再经过4013E0函数加密之后

5A CD 79 E5 2C B7 A8 25 EB FA 24 69 B9 B9 B7 A1

在这里插入图片描述
因此判断密钥就是sycloversyclover,而函数4013E0就是AES加密,之后将加密后的结果与第二组16个数据进行异或,异或的数据为0x10,是填充的大小。因此我们可以断定为PKCS5Padding

最后一段进行了base64编码。

异常处理

但是最后比较的结果为

*>*pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo

明显不满足base64的加密结果,将程序挂起即可看到最后比较的字符串。

但是仔细分析一下

  int v1; // eax
  __int16 v2; // bx
  const char *v3; // esi
  signed int i; // edi
  int v5; // eax

  v1 = this[15];
  v2 = *(_WORD *)((char *)this + v1 + 6);
  v3 = (char *)this + v1 + 248;
  for ( i = 0; i < v2; ++i )
  {
    v5 = strcmp(v3, ".SCTF");
    if ( v5 )
      v5 = -(v5 < 0) | 1;
    if ( !v5 )
    {
      DebugBreak();
      return;
    }
    v3 += 40;
  }
}

前面一个函数这里有一个DebugBreak函数,该函数在未触发调试的情况下会触发异常。

因此我们对KiUserExceptionDispatcher下断点,并没有调用VEH,那么程序可能调用了SEH,

我们在Zwcontinue处下断点,Zwcontinue函数的一个参数context结构体他的B8处包含着要继续执行的地址

在这里插入图片描述

值为0x72A83C79 我们在此处地址上下断点。

运行至此处,直到遇见EH4_TransferToHandler处,此处调用了SEH

在这里插入图片描述

跳转到4023EF。

反调试

4023EF处进行着反调试

在这里插入图片描述

由于strongOD的效果,我们能过掉IsDebuggerPresaent的反调试,但是我们无法过CheckRemoteDebuggerPresent函数的检测 因此我们需要修改跳转标志位,以达到过反调试的目的,之后程序进行了自解码,自解码后执行404000函数,此处便是将程序最后比较的字符串进行了 改变

于是我们将字符串进行解密

在这里插入图片描述

得到结果

发布了49 篇原创文章 · 获赞 14 · 访问量 6918

猜你喜欢

转载自blog.csdn.net/qq_39268483/article/details/96986429