吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3794|回复: 9
收起左侧

[CTF] “第五空间”智能安全大赛 ManageCode

[复制链接]
sshc008 发表于 2020-6-30 22:32

.net程序
dnSpy 动态调试的过程中可以看到

internal unsafe static bool FormatChk(sbyte* s)
        {
                string text = Marshal.PtrToStringAnsi((IntPtr)((void*)s));
                bool flag = true;
                if (text.Length != 35)
                {
                        return 0;
                }
                flag = (text[6] == '-' && flag);
                flag = (text[13] == '-' && flag);
                return text[20] == '-' && flag;
        }

还有两个check函数是看不到的,但是可以看到他的RVA和文件偏移

// Token: 0x0600015A RID: 346 RVA: 0x001A0520 File Offset: 0x0019F920
        [SuppressUnmanagedCodeSecurity]
        [MethodImpl(MethodImplOptions.Unmanaged | MethodImplOptions.PreserveSig)]
        [return: MarshalAs(UnmanagedType.U1)]
        internal unsafe static extern bool MainLogic2Check(sbyte*);

用ida打开,找到对应的地址(即0x400000 + RVA),这里的代码不能反编译,可以按一下p,创建函数,就可以看到对应的代码逻辑如下:

char __cdecl sub_5A0520(int a1)
{
  char result; // al
  char v2; // [esp+8h] [ebp-14h]

  result = sub_5A04A6(a1);
  if ( result )
  {
    sub_5A04D0(&v2, a1);
    result = (unsigned __int8)sub_5A04BF(&v2) != 0 ? 1 : 0;
  }
  return result;
}

这段代码好像没什么用,上面我们能看到的formatcheck其实就是这里的sub_5a0520,所以下面的两个函数,尤其是sub_5A05BF应该是第二个check函数,在ida中我们发现这个函数依然无法反编译,它跳到了一个值为60009f的地址,再回到dnspy中,我们发现这个60009f其实是一个函数的TOKEN

// Token: 0x0600009F RID: 159 RVA: 0x001A04AC File Offset: 0x0019F8AC
        [return: MarshalAs(UnmanagedType.U1)]
        internal unsafe static bool HeapAllocCheck(sbyte* s)
        {
                return <Module>.chk_848((void*)s);
        }

这个chk_848应该就是最终的处理逻辑了,找到其地址,同上,得到代码

int __cdecl sub_5610E0(unsigned __int8 *a1)
{
  char v1; // dl
  int v2; // edi
  int v3; // ebx
  int v4; // eax
  int v5; // edi
  int v6; // esi
  int v7; // ecx
  char v8; // bl
  int v9; // edi
  char v10; // dl
  int v11; // ebx
  int v12; // esi
  int v13; // eax
  unsigned __int8 v14; // bl
  int v15; // edi
  int v16; // esi
  int v17; // edi
  int v18; // esi
  int v19; // edi
  int v20; // esi
  int result; // eax
  int v22; // [esp-34h] [ebp-38h]
  int v23; // [esp-30h] [ebp-34h]
  int v24; // [esp-2Ch] [ebp-30h]
  int v25; // [esp-28h] [ebp-2Ch]
  int v26; // [esp-24h] [ebp-28h]
  int v27; // [esp-20h] [ebp-24h]
  int v28; // [esp-1Ch] [ebp-20h]
  int v29; // [esp-18h] [ebp-1Ch]
  int v30; // [esp-14h] [ebp-18h]
  int v31; // [esp-10h] [ebp-14h]
  int v32; // [esp-Ch] [ebp-10h]
  int v33; // [esp-8h] [ebp-Ch]
  int v34; // [esp-4h] [ebp-8h]

  v1 = 1;
  v2 = *a1;
  v32 = a1[2];
  v33 = v2;
  v34 = a1[1];
  if ( -27637 * v2 != -6522332 )
    v1 = 0;
  if ( 252883 * a1[1] + 453777 * v2 != 142242109 )
    v1 = 0;
  v3 = a1[3];
  v31 = a1[3];
  if ( 181477 * v34 - 201938 * v2 - 297323 * a1[2] != -65543900 )
    v1 = 0;
  v4 = 458431 * v2;
  v5 = a1[4];
  v6 = a1[5];
  v30 = a1[4];
  v29 = a1[5];
  if ( 181412 * v32 - 233649 * v34 - v4 - 189829 * v3 != -153466961 )
    v1 = 0;
  v7 = 109740 * v3;
  v8 = v1;
  if ( 380210 * v34 + 503276 * v33 + v7 - 411351 * v32 - 150530 * v5 != 103122101 )
    v8 = 0;
  if ( 142075 * v31 + 244585 * v33 + 408296 * v6 + -490577 * v34 - 367282 * v32 - 446583 * v5 != -36334126 )
    v8 = 0;
  v9 = a1[6];
  v27 = v9;
  v10 = v8;
  if ( 148775 * v31 + 281672 * v9 + 519091 * v34 + 234610 * v32 + 277144 * v30 - 459331 * v6 - 515735 * v33 != -6200311 )
    v10 = 0;
  v11 = a1[7];
  v28 = v11;
  if ( 344476 * v6 + 413396 * v31 + 247143 * v11 + 515238 * v32 + 90778 * v34 + 210426 * v9 - 62481 * v30 - 256123 * v33 != 246216395 )
    v10 = 0;
  v12 = a1[8];
  v13 = 45892 * v11;
  v14 = v10;
  v26 = v12;
  if ( 119517 * v34
     + 87976 * v29
     + 204700 * v9
     + 341700 * v32
     + v13
     + 437619 * v12
     - 18469 * v33
     - 155319 * v31
     - 82534 * v30 != 110824929 )
    v14 = 0;
  v15 = a1[9];
  v25 = v15;
  if ( 161068 * v32
     + 196008 * v33
     + 520619 * v27
     + 327403 * v30
     + 32583 * v29
     + -136035 * v31
     - 3835 * v28
     + 365964 * v12
     + 312942 * v34
     + 501468 * v15 != 371281087 )
    v14 = 0;
  v16 = a1[10];
  v24 = v16;
  if ( 322753 * v33
     + 217314 * v26
     + -89274 * v15
     - 422412 * v16
     + 332451 * v31
     + 202652 * v32
     + 494651 * v28
     + 377088 * v34
     + 473202 * v27
     - 69794 * v29
     - 122709 * v30 != 266551333 )
    v14 = 0;
  v17 = a1[11];
  v23 = v17;
  if ( 347620 * v26
     + 477781 * v16
     + 263014 * v32
     + -231522 * v28
     - 335275 * v34
     - 462486 * v30
     + 103453 * v27
     + -298198 * v17
     - 46644 * v29
     - 267482 * v25
     - 338363 * v31
     - 99545 * v33 != -215091705 )
    v14 = 0;
  v18 = a1[12];
  v22 = v18;
  if ( -153961 * v34
     - 375877 * v25
     - 237882 * v18
     + 246481 * v26
     + 284330 * v29
     + 141332 * v33
     + 198791 * v24
     - 341231 * v32
     + -95168 * v31
     - 97060 * v27
     - 80648 * v17
     - 480222 * v28
     - 286994 * v30 != -253031934 )
    v14 = 0;
  v19 = a1[13];
  if ( 479775 * v32
     + -123407 * v34
     - 315042 * v28
     + 509748 * v25
     + 242426 * v19
     + 292629 * v29
     + 284106 * v18
     + 431092 * v26
     - 138421 * v24
     - 516799 * v23
     - 526241 * v30
     - 4181 * v33
     - 490918 * v31
     - 481513 * v27 != 40074517 )
    v14 = 0;
  v20 = a1[14];
  if ( -370346 * v24
     - 121069 * v34
     + 485645 * v33
     + 412093 * v25
     + 214496 * v22
     + 199139 * v30
     + -353829 * v19
     - 337624 * v32
     - 69291 * v31
     + 499353 * v27
     + 301562 * v23
     - 405281 * v28
     - 136415 * v26
     - 126381 * v20
     - 361293 * v29 != -59915647 )
    v14 = 0;
  result = v14;
  if ( 13587 * v25
     + -222408 * v34
     - 503769 * v19
     + 351355 * v28
     + 161388 * v32
     + -318552 * v24
     - 58824 * v23
     - 444790 * v22
     + 457718 * v26
     + 167699 * v27
     + 373885 * v31
     + -181217 * v33
     - 525254 * v20
     + 475218 * v30
     + 194205 * a1[15]
     - 465334 * v29 != -161404828 )
    result = 0;
  return result;
}

写个简单的脚本反算一下,得到一串数字:
0xec, 0x8b, 0x91, 0xce, 0xd1, 0xe0, 0x54, 0xd4, 0x76, 0xf8, 0x9e, 0x36, 0xdd, 0xd3, 0xdc, 0xe5
把它变成16进制,然后根据formatchk调整一下格式即得到flag

免费评分

参与人数 3威望 +1 吾爱币 +22 热心值 +3 收起 理由
Cheremace + 1 + 1 我很赞同!
处女-大龙猫 + 1 + 1 谢谢@Thanks!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

闲月疏云 发表于 2020-7-2 09:01
本帖最后由 闲月疏云 于 2020-7-2 09:08 编辑

QQ图片20200702090743.png 为什么我的方程出来是这个……
 楼主| sshc008 发表于 2020-7-2 09:52
闲月疏云 发表于 2020-7-2 09:01
为什么我的方程出来是这个……

这个我也有疑惑,我之前看过一次别人的wp,方程和你我的都不一样,你可以试试你答案能否通过校验,可能是每个人的文件就不一样
羽刃 发表于 2020-7-2 09:54
 楼主| sshc008 发表于 2020-7-2 10:02
羽刃 发表于 2020-7-2 09:54
大佬,反算脚本可以分享下吗?

我当时是直接抄在ida的命令行里的,没有保存,你可以直接复制一下整个c语言程序,然后把每一处的判断语句换成赋值语句就行了
闲月疏云 发表于 2020-7-2 10:29
本帖最后由 闲月疏云 于 2020-7-2 10:32 编辑
sshc008 发表于 2020-7-2 09:52
这个我也有疑惑,我之前看过一次别人的wp,方程和你我的都不一样,你可以试试你答案能否通过校验,可能是 ...

最重要的是z3解出来发现没法推出来flag :( 绝了
 楼主| sshc008 发表于 2020-7-2 11:37
闲月疏云 发表于 2020-7-2 10:29
最重要的是z3解出来发现没法推出来flag :( 绝了

可以不用z3,直接算就行,复制一下程序,把判断改成赋值就行
wh1sper 发表于 2020-7-2 18:17
闲月疏云 发表于 2020-7-2 10:29
最重要的是z3解出来发现没法推出来flag :( 绝了

没错,我可是看了别人推了一下午
ckypamym119 发表于 2020-7-2 20:52
感谢分享!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 23:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表