buu刷题Reverse总结

[FlareOn1]Bob Doge

是一个C#编写的程序,在dnspy中打开,找到主函数,可以看到大致逻辑

buu刷题Reverse总结_第1张图片

 不知道dat_secret的值,动态调试看看

DnSpy动态调试:

在主函数中添加断点,调试,因为本题的fag形式为:

buu刷题Reverse总结_第2张图片

 Hint:本题解出相符串后请用flag{}包裹,形如:flag{[email protected]}

找到神似flag的值,尝试一下,成功

[FlareOn5]Ultimate Minesweeper

又是一道游戏类c#语言编写的题目,在dnspy中打开,可以找到源码

对源码进行分析

buu刷题Reverse总结_第3张图片

这一部分是创建雷区,MineField创建雷区, AllocateMemory是内存分配,这个函数及逆行方块布局及雷区分布

buu刷题Reverse总结_第4张图片

 这部分是对是否踩到雷区的判断,下面的if判断中有GetKey函数的调用,猜测是未踩到雷的情况,那么上面就是踩到类的情况,第二个判断若成立,则this,stopwatch.Stop(),停止进程计时,Application.DoEvents()处理应用程序消息队列中的所有待处理事件,Thread.Sleep(1000)线程暂停 1 秒 ,new SuccessPopup函数创建一个新实例,并显示为对话框函数。看到其他大佬的wp知道第一个判断踩到雷代码可以删掉,实现游戏程序踩雷也不会退出。(小小体验一把外挂的感觉)

先放一下GeyKey函数:

// Token: 0x0600000D RID: 13 RVA: 0x000025DC File Offset: 0x000007DC
		private string GetKey(List revealedCells)
		{
			revealedCells.Sort();
			Random random = new Random(Convert.ToInt32(revealedCells[0] << 20 | revealedCells[1] << 10 | revealedCells[2]));
			byte[] array = new byte[32];
			byte[] array2 = new byte[]
			{
				245,
				75,
				65,
				142,
				68,
				71,
				100,
				185,
				74,
				127,
				62,
				130,
				231,
				129,
				254,
				243,
				28,
				58,
				103,
				179,
				60,
				91,
				195,
				215,
				102,
				145,
				154,
				27,
				57,
				231,
				241,
				86
			};
			random.NextBytes(array);
			uint num = 0U;
			while ((ulong)num < (ulong)((long)array2.Length))
			{
				byte[] array3 = array2;
				uint num2 = num;
				array3[(int)num2] = (array3[(int)num2] ^ array[(int)num]);
				num += 1U;
			}
			return Encoding.ASCII.GetString(array2);

这段程序是先用Random()设置随机数,将array数组设置为随机数,将array2数组值赋给array3,再和array异或,得到新的array3,这里应该就是成功后的输出

DnSpy实现程序修改

dnSpy实现程序修改容易的多,在光标停放的函数出按Ctrl+Shit+e这样就可以进入程序修改界面,buu刷题Reverse总结_第5张图片

 修改好的程序要进行编译(右下角红色圈标注的)

具体修改程序方法可以参考:

两种方式进行 C# 反编译修改源码 - lsgxeva - 博客园 (cnblogs.com)

现在是猎杀时刻(嘿嘿)

buu刷题Reverse总结_第6张图片

 电路很多点到有雷的地方,最后给出的结果是乱码,再尝试一次,直接点数字,得到flag

buu刷题Reverse总结_第7张图片

 这个题目本来是想通过动调得到array数组的值,但是动调后没有显示,尝试其他大佬的wp的方法

你可能感兴趣的:(网络安全,逆向工程)