ida算法解析

7 篇文章 0 订阅
3 篇文章 0 订阅
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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值