BUUCTF逆向题Oruga

一、工具

1、IDA

二、解题思路

双击进去查看关键函数实现代码

经过分析后可以判断该题是一道迷宫类题目

由第二个 while 可以知道,只要按下反向后,在该方向上只要都是 0 ,那就一直走下去,直到遇到障碍物,由循环体的判断可以知道,方向上必须有障碍物存在,否则会导致程序退出执行。

byte_201020 函数中保存的应该就是迷宫边界之类的数据,上述图片中我们已经猜测迷宫每行是16个字符(16 x 16 的正方形),接下来我们就可以写代码了(用来打印迷宫)

#include <Stdio.h>
int main(){
	char data[]={
		0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x23, 0x23, 0x23,
    	0x00, 0x00, 0x00, 0x23, 0x23, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x50, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x50, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x4C, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
    	0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x45,
    	0x00, 0x00, 0x00, 0x30, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x45,
    	0x54, 0x54, 0x54, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
    	0x00, 0x54, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
    	0x00, 0x54, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x21, 0x00, 0x00, 0x00, 0x45, 0x45
	};
	
	for(int i = 0;i < 16;i++){
		for(int j = 0;j < 16;j++){
			if(i == 0 && j == 0){
				printf("☆ ");//起点 
			}
			else if(data[i * 16 + j] == 0){
				printf("□ ");//路 
			}
			else if(data[i * 16 + j] == 0x21){
				printf("★ ");//终点 
			}
			else{
				printf("■ ");//障碍物 
			}
		}
		printf("\n");
	}
	
	
	
	return 0;
}

最终答案:

flag{MEWEMEWJMEWJM}

三、细节处分析

①、很多人不理解,为什么 +16 表示向下,-16 表示向上,原因很简单,我们上面已经分析出来了,迷宫地图是 16 x 16 的方形图

(+1 、-1 这个就不用分析了,+ 就向右,- 就向左)

②、

这一部分很多人看不懂,其实也很好理解,这个 unsigned int 表示无符号整型,你也可以理解成绝对值,v2 表示当前所在方块(以 ① 中的图为例)位置,v2(max) = 256 (16 x 16),当 v2 = 240 时,如图所示

当 v2 在大于 240 小于 256 范围内,则 - 240 是 > 0xF 的,所以 if ( v4 == 16 && (unsigned int)(v2 - 240) <= 0xF ) 的作用是表示最后一行;其他的也是差不多这样分析就可以了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值