sshc008 发表于 2020-6-30 22:32

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

.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 == '-' && flag);
                flag = (text == '-' && flag);
                return text == '-' && flag;
      }
```

还有两个check函数是看不到的,但是可以看到他的RVA和文件偏移
```
// Token: 0x0600015A RID: 346 RVA: 0x001A0520 File Offset: 0x0019F920
      
      
      
      internal unsafe static extern bool MainLogic2Check(sbyte*);
```
用ida打开,找到对应的地址(即0x400000 + RVA),这里的代码不能反编译,可以按一下p,创建函数,就可以看到对应的代码逻辑如下:
```
char __cdecl sub_5A0520(int a1)
{
char result; // al
char v2; //

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
      
      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; //
int v23; //
int v24; //
int v25; //
int v26; //
int v27; //
int v28; //
int v29; //
int v30; //
int v31; //
int v32; //
int v33; //
int v34; //

v1 = 1;
v2 = *a1;
v32 = a1;
v33 = v2;
v34 = a1;
if ( -27637 * v2 != -6522332 )
    v1 = 0;
if ( 252883 * a1 + 453777 * v2 != 142242109 )
    v1 = 0;
v3 = a1;
v31 = a1;
if ( 181477 * v34 - 201938 * v2 - 297323 * a1 != -65543900 )
    v1 = 0;
v4 = 458431 * v2;
v5 = a1;
v6 = a1;
v30 = a1;
v29 = a1;
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;
v27 = v9;
v10 = v8;
if ( 148775 * v31 + 281672 * v9 + 519091 * v34 + 234610 * v32 + 277144 * v30 - 459331 * v6 - 515735 * v33 != -6200311 )
    v10 = 0;
v11 = a1;
v28 = v11;
if ( 344476 * v6 + 413396 * v31 + 247143 * v11 + 515238 * v32 + 90778 * v34 + 210426 * v9 - 62481 * v30 - 256123 * v33 != 246216395 )
    v10 = 0;
v12 = a1;
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;
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;
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;
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;
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;
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;
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
   - 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

闲月疏云 发表于 2020-7-2 09:01

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

为什么我的方程出来是这个……

sshc008 发表于 2020-7-2 09:52

闲月疏云 发表于 2020-7-2 09:01
为什么我的方程出来是这个……

这个我也有疑惑,我之前看过一次别人的wp,方程和你我的都不一样,你可以试试你答案能否通过校验,可能是每个人的文件就不一样

羽刃 发表于 2020-7-2 09:54

大佬,反算脚本可以分享下吗?{:301_976:}

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 :( 绝了

没错,我可是看了别人推了一下午{:301_997:}

ckypamym119 发表于 2020-7-2 20:52

感谢分享!!!
页: [1]
查看完整版本: “第五空间”智能安全大赛 ManageCode