.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