“第五空间”智能安全大赛 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:08 编辑
为什么我的方程出来是这个…… 闲月疏云 发表于 2020-7-2 09:01
为什么我的方程出来是这个……
这个我也有疑惑,我之前看过一次别人的wp,方程和你我的都不一样,你可以试试你答案能否通过校验,可能是每个人的文件就不一样 大佬,反算脚本可以分享下吗?{:301_976:} 羽刃 发表于 2020-7-2 09:54
大佬,反算脚本可以分享下吗?
我当时是直接抄在ida的命令行里的,没有保存,你可以直接复制一下整个c语言程序,然后把每一处的判断语句换成赋值语句就行了 本帖最后由 闲月疏云 于 2020-7-2 10:32 编辑
sshc008 发表于 2020-7-2 09:52
这个我也有疑惑,我之前看过一次别人的wp,方程和你我的都不一样,你可以试试你答案能否通过校验,可能是 ...
最重要的是z3解出来发现没法推出来flag :( 绝了 闲月疏云 发表于 2020-7-2 10:29
最重要的是z3解出来发现没法推出来flag :( 绝了
可以不用z3,直接算就行,复制一下程序,把判断改成赋值就行 闲月疏云 发表于 2020-7-2 10:29
最重要的是z3解出来发现没法推出来flag :( 绝了
没错,我可是看了别人推了一下午{:301_997:} 感谢分享!!!
页:
[1]