逆向题目分析

2018.7.27

将文件拖进IDA,点开相关文件,得到代码

if ( (unsigned __int8)sub_8048630(&s) )
    puts("Flag is right.");
  else
    puts("Flag is wrong.");
  return 0;

由代码可知,if条件成立,才能输出”Flag is right.”所以我们要让sub_8048630()函数返回1,点开sub_8048630()函数得到代码,如下:

int __cdecl sub_8048630(char *s)
{
  size_t v1; // eax
  int v3; // edx

  if ( s )
  {
    v1 = strlen(s);
    if ( v1 )
    {
      if ( v1 == 29 )
      {
        v3 = 0;
        while ( s[v3] == byte_8049AE0[(unsigned __int8)((unsigned __int8)byte_8049B15[v3] / 3u - 2)] )
        {
          if ( ++v3 == 29 )
            return 1;
        }
      }
    }
  }
  return 0;
}

要想返回值为1,while循环条件和if条件就要成立。点开byte_8049B15,得到
这里写图片描述
点住图中灰色部分,按shift+E会得到
这里写图片描述
空白框中数据就是byte_8049B15数组中的数据,我们把byte_8049AE0后面的6Ch按R键变为字符后,也得到了byte_8049AE0字符串。while循环要成立,我们可以得到s也就是flag,脚本如下:

a=[0x48,0x5D,0x8D,0x24,0x84,0x27,0x99,
   0x9F,0x54,0x18,0x1E,0x69,0x7E,0x33,0x15,
   0x72,0x8D,0x33,0x24,0x63,0x21,0x54,0x0C,
   0x78,0x78,0x78,0x78,0x78,0x1B]
b=[]
c='lk2j9Gh}AgfY4ds-a6QW1#k5ER_T[cvLbV7nOm3ZeX{CMt8SZo]U'
flag=''
for i in range(len(a)):
     b.append(int(a[i]/3-2))

for j in range(len(b)):
     flag+=c[b[j]]
print (flag)

a++ 和 ++a 的区别
a++ 和 ++a的相同点都是给a+1,不同点是a++是先参加程序的运行再+1,而++a则是先+1再参加程序的运行。例如:

  a=2;  b = a++;    运行后: b = 2a =3a=2;  b = ++a;    运行后: b = 3a =3

a - - 和 - - a情况与 a + + 和 ++ a相似,a - -为先参加程序运算在-1;- - a为先减1后参加运算

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值