ida算法解析

来源:互联网 发布:java 邮箱匹配 编辑:程序博客网 时间:2024/04/19 11:29
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!

原创粉丝点击