攻防世界Replace做法(easy分析)

首先,查个壳,如下发现这个是有壳的,而且是upx脱壳(点进我主页,有upx脱壳教程文章,此处不多说了),此处就直接脱壳了,且是32bit,那就丢进ida32中进行分析,如下在一旁打上注释进行简单的分析,最关键的是那个if语句,左右必须相等,不然会break,返回-1,那就错了,此处一看,v11,v12还有数组byte_4021A0都是已知,右边是完全已知,我们可以先求出右边的值,然后再进行循环,看右边的值和左边数组中第几位的数相等,然后我们就可以一连串的数字,可以直接猜测这串数字就是flag,那就先实践一下看看喽,我们一步步来,先是进行数组数据的提取操作,双击进入数组byte_402150,并选中该部分数据,然后shift+e进行数据的提取,点击export即可,还有个数组byte_4021A0也是如此,重复操作,记得把导出文件的名字 file改一下,然后就是照葫芦画瓢写代码喽


#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
	int byte_4021A0[]= {
   99, 124, 119, 123, 242, 107, 111, 197,  48,   1,
  103,  43, 254, 215, 171, 118, 202, 130, 201, 125,
  250,  89,  71, 240, 173, 212, 162, 175, 156, 164,
  114, 192, 183, 253, 147,  38,  54,  63, 247, 204,
   52, 165, 229, 241, 113, 216,  49,  21,   4, 199,
   35, 195,  24, 150,   5, 154,   7,  18, 128, 226,
  235,  39, 178, 117,   9, 131,  44,  26,  27, 110,
   90, 160,  82,  59, 214, 179,  41, 227,  47, 132,
   83, 209,   0, 237,  32, 252, 177,  91, 106, 203,
  190,  57,  74,  76,  88, 207, 208, 239, 170, 251,
   67,  77,  51, 133,  69, 249,   2, 127,  80,  60,
  159, 168,  81, 163,  64, 143, 146, 157,  56, 245,
  188, 182, 218,  33,  16, 255, 243, 210, 205,  12,
   19, 236,  95, 151,  68,  23, 196, 167, 126,  61,
  100,  93,  25, 115,  96, 129,  79, 220,  34,  42,
  144, 136,  70, 238, 184,  20, 222,  94,  11, 219,
  224,  50,  58,  10,  73,   6,  36,  92, 194, 211,
  172,  98, 145, 149, 228, 121, 231, 200,  55, 109,
  141, 213,  78, 169, 108,  86, 244, 234, 101, 122,
  174,   8, 186, 120,  37,  46,  28, 166, 180, 198,
  232, 221, 116,  31,  75, 189, 139, 138, 112,  62,
  181, 102,  72,   3, 246,  14,  97,  53,  87, 185,
  134, 193,  29, 158, 225, 248, 152,  17, 105, 217,
  142, 148, 155,  30, 135, 233, 206,  85,  40, 223,
  140, 161, 137,  13, 191, 230,  66, 104,  65, 153,
   45,  15, 176,  84, 187,  22
	};
	int byte_402150[]={50,
   97,  52,  57, 102,  54,  57,  99,  51,  56,  51, 
   57,  53,  99, 100, 101,  57,  54, 100,  54, 100, 
  101,  57,  54, 100,  54, 102,  52, 101,  48,  50, 
   53,  52,  56,  52,  57,  53,  52, 100,  54,  49, 
   57,  53,  52,  52,  56, 100, 101, 102,  54, 101, 
   50, 100,  97, 100,  54,  55,  55,  56,  54, 101, 
   50,  49, 100,  53,  97, 100,  97, 101,  54,   0, 
    0,   0,   0,   0,   0,   0,   0,   0,   0
};
	int v4=0;
	int v8,v9,v10,v11,v12,str;  //记得多定义一个变量str
	while(1){
		v8=byte_402150[2*v4];
		if(v8<48||v8>57){
			v9=v8-87;
		} else{
			v9=v8-48;
		}
		v10=byte_402150[2*v4+1]; //这步操作很细,要+1,下面会解释原因
		v11=16*v9;
		if(v10<48||v10>57){
			v12=v10-87;
		} else{
			v12=v10-48;
		}
		str=(v11+v12)^25;    
		for(int i=0;i<255;i++){  //进行循环遍历,判断该数和数组中的第几位数相等
			if(str==byte_4021A0[i]){  
				cout<<i<<endl;
				break;
			}
		}
		if(++v4>=35){
			break;
		}
	}
	return 0;
}

这边解释一下v10=byte_402150[2*v4+1]; 这步操作,原ida中v10是 byte_402151,但当我们点进该数组中会发现,他就在byte_402150数组的后面,内存上是连续的,byte_402150比数组byte_402151多了一位数,那就直接+1,从byte_402150[1]开始取值,那就避开了该数组第一位数,此时就可以直接看作是数组byte_402151了,然后运行一下,得到一连串的数字,最后ascill转字符串,就得到flag了(^_^)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值