buuctf· actf easyre

1.一开始就往ida里面扔,然后就俩函数,可能是有壳,于是把题扔到detect it easy。查出一个upx壳,然后脱壳。
2.再打开找到main函数,主要是
if ( (&v4 + i) != data_start_[((char *)&v16 + i) - 1] ) 这一句话。

__main();
  v4 = 42;
  v5 = 70;
  v6 = 39;
  v7 = 34;
  v8 = 78;
  v9 = 44;
  v10 = 34;
  v11 = 40;
  v12 = 73;
  v13 = 63;
  v14 = 43;
  v15 = 64;
  printf("Please input:");
  scanf("%s", &v19);
  if ( (_BYTE)v19 != 65 || HIBYTE(v19) != 67 || v20 != 84 || v21 != 70 || v22 != 123 || v26 != 125 )
    return 0;
  v16 = v23;
  v17 = v24;
  v18 = v25;
  for ( i = 0; i <= 11; ++i )
  {
    if ( *(&v4 + i) != _data_start__[*((char *)&v16 + i) - 1] )
      return 0;
  }
  printf("You are correct!");
  return 0;
}

将输入的 flag先是-1,再从_data_start__数组中找到相应的数然后到v4数组里寻找有无。
所以可以跟着逆向了。
3
里面的\是代表\,如果单\是转义字符会有问题,
这里面的j是代表的_data_start__里的下标,和v4里面的数字做对比,到后面再flag-1=j
然后由j求flag,如下代码。

Key = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(' + chr(0x27) + '&%$# !"'
v4=[42,70,39,34,78,44,34,40,73,63,43,64]
flag=""
for i in v4 :
    for j in range(1,len(Key)):
        if i ==ord(Key[j]):
            flag += chr(j+1)
print(flag)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值