int sub_401130()
{
char v1; // [sp+0h] [bp-10h]@1
sub_402702("Do you know flag?\n");
((void (__thiscall *)(char *))loc_4010A0)(&v1);
if ( !sub_401000((int)&v1) )
{
sub_402702("wrong~");
ExitProcess(0);
}
sub_402702("Yes,YOU GET IT!");
return 0;
}
bool __thiscall sub_401000(int this)
{
int v1; // eax@1
bool result; // al@2
char v3; // dl@7
char v4[48]; // [sp+0h] [bp-40h]@1
int v5; // [sp+30h] [bp-10h]@1
int v6; // [sp+34h] [bp-Ch]@1
char v7; // [sp+38h] [bp-8h]@1
v1 = *(_BYTE *)this;
v5 = 0x2020908;
v6 = 0x9030106;
v7 = 0;
if ( v4[v1] != 2
|| v4[*(_BYTE *)(this + 1)] != 8
|| v4[*(_BYTE *)(this + 2)] != 9
|| v4[*(_BYTE *)(this + 3)] != 3
|| v4[*(_BYTE *)(this + 4)] != 9
|| (v3 = v4[*(_BYTE *)(this + 7)], v4[*(_BYTE *)(this + 5)] != v3)
|| v4[*(_BYTE *)(this + 6)] != 9 )
{
result = 0;
}
else
{
result = v3 == 8;
}
return result;
}
这是算法的具体内容,这里出现的第一个问题就是 v4的值
char v4[48]; // [sp+0h] [bp-40h]@1
int v5; // [sp+30h] [bp-10h]@1
这里定义了v4 下面紧跟着定义v5,如果sp作为v4,也就是基地址,v5是v4+30h
v5 = 0x2020908;
v6 = 0x9030106;
第二个问题是this指针
sub_402702(“Do you know flag?\n”);
((void (__thiscall )(char ))loc_4010A0)(&v1);
if ( !sub_401000((int)&v1) )
这段代码很容易知道v1是输入数据存放的地方loc_4010A0读入数据。
其实this是=v1 不过这里把*this强制转换成了int型,v4+ascii-30h=v5[a](这里a表示ascii-30h后的值)
a=[2,0,1,6,1,1,1,1,0]
for i in a:
print(chr(i+48),end=”“)
输出结果为 201611110
注意
result = v3 == 8;
这里的v3==8时会result=1否则result还是0!