首页
社区
课程
招聘
[原创]看雪CTF.TSRC 2018 团队赛 第八题 二向箔 WP
发表于: 2018-12-18 14:59 1950

[原创]看雪CTF.TSRC 2018 团队赛 第八题 二向箔 WP

ccfer 活跃值
16
2018-12-18 14:59
1950
看雪CTF.TSRC 2018 团队赛 第八题 二向箔

做这个题,不需要识别fft,也不需要熟悉熟悉tea和aes等算法,只需用二元一次方程组解决复数除法和解GF2线性方程组即可,剩下全都是体力

先ida里F5一下
int sub_4027B0()
{
  char v1; // [esp+0h] [ebp-130h]
  int v2; // [esp+104h] [ebp-2Ch]
  int v3; // [esp+108h] [ebp-28h]
  int v4; // [esp+10Ch] [ebp-24h]
  int v5; // [esp+110h] [ebp-20h]
  int v6; // [esp+114h] [ebp-1Ch]
  int v7; // [esp+118h] [ebp-18h]
  int v8; // [esp+11Ch] [ebp-14h]
  int v9; // [esp+120h] [ebp-10h]
  int v10; // [esp+124h] [ebp-Ch]
  char v11; // [esp+128h] [ebp-8h]

  while ( 1 )
  {
    v2 = 0;
    v3 = 0;
    v4 = 0;
    v5 = 0;
    v6 = 0;
    v7 = 0;
    v8 = 0;
    v9 = 0;
    v10 = 0;
    v11 = 0;
    printf("\nInput RegCode:");
    memset(&v1, 0, 0x101u);
    scanf("%245s", &v1);
    if ( sub_401650(&v1, &v2) == 36 && sub_401AC0((int)&v2) && sub_401710(&v6) )
      break;
    printf("\n Wrong, Plz Try Again...\n");
  }
  printf("\n Good!\n");
  return sub_404B2E();
}

得到大致流程:
    总输入长度72个字符转换成36个字节
    检查前16字节:sub_401AC0
    检查后20字节:sub_401710

sub_401AC0里面像是某种复数运算的相关算法,流程还算简单,算完后和固定数据比较,不需要知道这是什么算法,因为这个运算过程是可逆的,用到的都是复数的加减乘除运算,会解二元一次方程组即可还原复数,直接体力活逐段逆运算回去就行了,见代码中unchk1函数。

sub_401710里面稍微有些复杂:
    1.sub_403A30->sub_4038E0->sub_403760是某种解密算法,解密出的20字节,最后4个字节是个长度,要求在13到16字节范围,是什么算法不重要,代码较短,花点时间逐行逆出来即可,见代码中tea_en。
    2.sub_401330似乎是本题比较重要的部分了,要不然为啥单独这里面加了vm呢,函数有两个参数,一个参数是个长度为0xF0的固定数据key,另一个参数是前算法解密出的16字节数据,函数入口和出口分别有一段简单的4x4转置和xor操作,核心部分是中间会跳到vm中处理:
        vm入口:
        00401452    jmp loc_42C43D
        vm出口:
        00401501    sub dword ptr [ebp-28h], 10h
        从00401452到00401501这段比较小的范围可以判断这中间没有几行代码,可能会call到其它函数,而其它函数没有发现有被vm的,而sub_401080在ida中是没有被参考的,
        所以可以判断vm中call到了sub_401080,所以在sub_401080处下断点,先运行到vm入口处,把[ebp-14]处的16字节清0,然后运行到sub_401080断下来,观察[ebp-14]处的16字节发生变化,对比参数key的数据可以看出是对key中某一行的转置,再来一次把[ebp-14]处
        的16字节全填FF,再观察就能猜出是与key中某一行的xor并转置,这些都是简单可逆的运算。
    3.现在只剩下sub_401080了,这个函数把16字节的输入分成奇偶两组分别处理,先把它的实现还原出来,见代码中chk2_en函数(后面探测矩阵时要用到),看到这个函数里面只用了xor运算,所以尝试用GF2的64位线性方程组来解决,竟然有效,见代码中chk2_de2函数。

最终得到完整结果:
76474B2B1926009C452B00627200190268740438FDCC641665D0EA735F2739B3EE7B315A    

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//