首页
社区
课程
招聘
[原创]MRCTF2022 llvmvm出题以及解题
发表于: 2022-5-2 23:07 13400

[原创]MRCTF2022 llvmvm出题以及解题

2022-5-2 23:07
13400

脚本下载

bool __attribute((__annotate__(("virtualization")))) function2(uint8_t *key,uint8_t *text)
{
  for(int i=0;i<16;i++)
      key[i]=R8(key[i]^(i+3),i%8);
  uint32_t a=*((uint32_t*)&key[0]),b=*((uint32_t*)&key[4]),c=*((uint32_t*)&key[8]),d=*((uint32_t*)&key[12]);
  uint32_t key_stream[16],tmp[16];
  for(int i=0;i<4;i++)
  {
      a=((b*c)&0xdeadbfef)+(a<<3)+(d>>29);
      b=((c*d)&0xdefdbeef)+(b<<7)+(a>>25);
      c=((d*a)&0xdfadbeef)+(c<<9)+(b>>23);
      d=((a*b)&0xdeadbeff)+(d<<1)+(c>>31);
      key_stream[4*i]=d+0xdeadbeef;
      key_stream[4*i+1]=c+0xaa114514;
      key_stream[4*i+2]=a+0xf1919810;
      key_stream[4*i+3]=b+0x1abcdef1;
      //printf(" key stream : %x %x %x %x\n",key_stream[4*i],key_stream[4*i+1],key_stream[4*i+2],key_stream[4*i+3]);
  }
  for(int i=0;i<32;i++)
  {
      uint8_t c=text[i];
      c=((c&0xaa)>>1)|((c&0x55)<<1);
      c=((c&0xcc)>>2)|((c&0x33)<<2);
      c=((c&0xf0)>>4)|((c&0x0f)<<4);
      text[i]=c;
      for(int j=0;j<32;j++)
          text[j]^=R32(key_stream[j%16],j)&0xff;
      function1(tmp,key_stream);
      for(int j=0;j<16;j++)
          key_stream[j]=tmp[j];
  }
  for(int x=0;x<4;x++)
  {
      uint8_t t=text[8*x];
      for(int y=0;y<100;y++)
      {
          for(int i=0;i<8;i++)
          {
              t=t+(key[2*i]^key[2*i+1]);
              t=Sbox[t]+text[8*x+(i+1)%8];
              t=(t<<1) | (t>>7);
              text[8*x+(i+1)%8]=t;
          }
      }
  }
  uint32_t *ptr=(uint32_t *)text;
  for(int i=0;i<8;i++)
  {
      uint64_t v=0;
      for(int j=0;j<32;j++)
      {
          int b=(ptr[i]>>j)&1;
          v+=weights[j]*b;
          v%=mod;
      }
      if(v!=sums[i])
          return false;
  }
  return true;
}
bool __attribute((__annotate__(("virtualization")))) function2(uint8_t *key,uint8_t *text)
{
  for(int i=0;i<16;i++)
      key[i]=R8(key[i]^(i+3),i%8);
  uint32_t a=*((uint32_t*)&key[0]),b=*((uint32_t*)&key[4]),c=*((uint32_t*)&key[8]),d=*((uint32_t*)&key[12]);
  uint32_t key_stream[16],tmp[16];
  for(int i=0;i<4;i++)
  {
      a=((b*c)&0xdeadbfef)+(a<<3)+(d>>29);
      b=((c*d)&0xdefdbeef)+(b<<7)+(a>>25);
      c=((d*a)&0xdfadbeef)+(c<<9)+(b>>23);
      d=((a*b)&0xdeadbeff)+(d<<1)+(c>>31);
      key_stream[4*i]=d+0xdeadbeef;
      key_stream[4*i+1]=c+0xaa114514;
      key_stream[4*i+2]=a+0xf1919810;
      key_stream[4*i+3]=b+0x1abcdef1;
      //printf(" key stream : %x %x %x %x\n",key_stream[4*i],key_stream[4*i+1],key_stream[4*i+2],key_stream[4*i+3]);
  }
  for(int i=0;i<32;i++)
  {
      uint8_t c=text[i];
      c=((c&0xaa)>>1)|((c&0x55)<<1);
      c=((c&0xcc)>>2)|((c&0x33)<<2);
      c=((c&0xf0)>>4)|((c&0x0f)<<4);
      text[i]=c;
      for(int j=0;j<32;j++)
          text[j]^=R32(key_stream[j%16],j)&0xff;
      function1(tmp,key_stream);
      for(int j=0;j<16;j++)
          key_stream[j]=tmp[j];
  }
  for(int x=0;x<4;x++)
  {
      uint8_t t=text[8*x];
      for(int y=0;y<100;y++)
      {
          for(int i=0;i<8;i++)
          {
              t=t+(key[2*i]^key[2*i+1]);
              t=Sbox[t]+text[8*x+(i+1)%8];
              t=(t<<1) | (t>>7);
              text[8*x+(i+1)%8]=t;
          }
      }
  }
  uint32_t *ptr=(uint32_t *)text;
  for(int i=0;i<8;i++)
  {
      uint64_t v=0;
      for(int j=0;j<32;j++)
      {
          int b=(ptr[i]>>j)&1;
          v+=weights[j]*b;
          v%=mod;
      }
      if(v!=sums[i])
          return false;
  }
  return true;
}
old:
a = b + c
...
y = x * a
->
new:
a = b + c
...
y = x * (b + c)
old:
a = b + c
...
y = x * a

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-5-6 17:50 被R1mao编辑 ,原因: 添加题目elf文件
上传的附件:
收藏
免费 13
支持
分享
最新回复 (8)
雪    币: 8764
活跃值: (5718)
能力值: ( LV13,RANK:296 )
在线值:
发帖
回帖
粉丝
2
mark
2022-5-2 23:10
0
雪    币: 2466
活跃值: (4561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
强!
2022-5-2 23:17
0
雪    币: 15
活跃值: (1913)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
(所以数据流混淆有无啥好办法解决呢
2022-5-3 12:22
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
2022-5-3 13:38
0
雪    币: 5137
活跃值: (6863)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
附件地址不对
2022-5-3 14:19
0
雪    币: 3114
活跃值: (3279)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
7
mb_rhynjqzk (所以数据流混淆有无啥好办法解决呢
理论上用编译优化就能做到,加在虚拟机上的话,直接把虚拟机的f5伪代码抄出来用O2编译优化下,再反编译应该就去掉了
2022-5-3 14:50
0
雪    币: 26245
活跃值: (63297)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
8

附件本地上传一份,另外,目标程序楼主能否也上传一份?


上传的附件:
2022-5-6 16:37
0
雪    币: 3114
活跃值: (3279)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
9
Editor 附件本地上传一份,另外,目标程序楼主能否也上传一份?
已上传
2022-5-6 17:50
0
游客
登录 | 注册 方可回帖
返回
//