逆向----BugkuCTF----Mountain climbing----笔记

在这里插入图片描述
开局一张图,首先这个dword的数组由伪随机数生成。
随机数种子一定,那么rand出来的数是一定的。

在这里插入图片描述
if ( j_strlen(Str) == 19 )可以得出 输入字符串是19的长度。
并且

while ( v4 < 19 )和 ++v4; 这两行 可以看出来 整个while目的在遍历输入的字符串,
输入的字符串索引的单个字符如果ascii码==76 或 == 82 会索引第一步那个dword数组里的元素并且累加入一个变量 设为sum;

76为L ,82为R

其实不难看出如果为L 其实会影响dword数组的i++,而为R则使得i++且j++;
也就说 L为行++,R为行列都++。

这个题目的意思是要使最后的sum得到所有可能的组合里是最大的。

还原源码

	srand(0xCu);
	for (int i = 1; i <= 20; ++i)
	{
		for (int j = 1; j <= i; ++j)
			arr[100 * i + j] = rand() % 100000;
	}


	for (int i = 1; i <= 20; ++i)
	{
		for (int j = 1; j <= i; ++j)
			printf("%5d ", arr[100 * i + j]);
		cout << endl;
	}

打印出这个表看一下

在这里插入图片描述

整个题化解为
站在77的位置往下走,每一行走到的数字累加,走到最后一行。要使得走的最后的结果最大。

简单算法 递归走全部的道路

int func(int NowRow, int NowList, bool direction)
{
	int sumA = 0;
	int sumB = 0;

	if (NowRow >= maxRow)
	{
		if (NowList >= maxList)
		{
			//越界抛弃该结果
			return 0;
		}

		return arr[NowRow*100+ NowList];
	}

	if (direction)
	{
		//如果是true为只+行
		sumA += func(1 + NowRow, NowList, true);
		sumB += func(1 + NowRow, NowList, false);
	}
	else
	{
		//如果是false为++行列
		sumA += func(1 + NowRow, 1 + NowList, true);
		sumB += func(1 + NowRow, 1 + NowList, false);
	}

	int res = sumA>sumB ? sumA : sumB;
	return res += arr[NowRow*100+NowList];
}

true为L false为R

	int res = func(2, 2, true);
	cout << res << endl;
	 res = func(2, 2, false);
	 cout << res << endl;

	 int hang = 2;
	 int lie = 2;
	 int sum = 0;

	 for (int i = 1; i < 20; i++)
	 {


		 int resA = func(hang, lie, true);
		 int resB = func(hang, lie, false);
		 
		 if (resA > resB)
		 {
			 sum += arr[hang * 100 + lie];
			 cout << hang << "," << lie <<" true " << arr[hang*100+lie]<<endl;
			 hang++;
		 }
		 else
		 {
			 sum += arr[hang * 100 + lie];
			 cout << hang << "," << lie << " false " << arr[hang * 100 + lie] << endl;
			 hang++;
			 lie++;
		 }
	 
	 }
	 cout << sum << endl;
	

输出
在这里插入图片描述

结果为
RRRRR LLRRR LRLRR RLRL

3.别以为结束了

od载入动态看一下

在这里插入图片描述
一路跟进
![在这里插入图片描述](https://img-blog.csdn.net/20180927134144125?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3NjE3Njc1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

发现这里不断循环输入的每一个字符,且有条件的把原字符 xor 4.

分析下:
LLLLLLLLLLLLLLLLLLL
LHLHLHLHLHLHLHLHLHL
偶数列的L变成H

RRRRRRRRRRRRRRRRRRR
RVRVRVRVRVRVRVRVRVR
偶数列的R变成V

于是原本的答案:
RRRRR LLRRR LRLRR RLRL
变成
RVRVRHLVRVLVLVRVLVL

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值