buuctf 不一样的flag

大致流程就是输入值,程序根据你的输入值进行各种判断,并对程序内的某些变量进行操作,通过判断后又把之前参与变动的变量作为数组(v7)的偏移地址,判断在该地址的v7的值是否等于49或35。若等于前者,则程序结束,等于后者则提示成功

根据输出的提示,我们知道输入的数字分别代表4个方向(up down left right),而当执行up或down时v3[25]分别-1或+1;执行left或right时v4分别-1或+1。所以先暂时假定v3[25]代表纵坐 标,v4代表横坐标。

再看看结合整个程序和声明的变量得知:只有v7没有值,但v7参与了判断。有理由怀疑v7地址与某一变量是有联系的。唯一一次用到v7的地方有一个莫名的数字:41,为什么减41呢,百思不得其解。再想想,41存在于v7的偏移地址计算中,所以41是与地址有关?

我们找到v7的首位地址,在十六进制计算器中将地址减去41,好家伙,刚好是v3的首位地址

将判断语句转换成v3的“风格” :v3[5*v3[25]+v4]

之前拟定v3[25]代表纵坐标,v4代表横坐标,这个表达式像什么?

答:二维数组!

再结合判断语句:如果等于49('1')结束程序;等于35('#')提示成功

这不就是判断当前坐标么,之前对变量的操作就是对当前坐标进行变化

看看v3的元素

根据之前得到的信息,v3字符串区域可看作是二维数组,且有5列(5*v3[25]),我们把v3的字符串分为5列

最后的判断:碰到'#'提示成功,碰到'1'结束程序,要想成功,就不能碰到'1',从*位置开始移动到'#',所以这是一个5*5的迷宫,而移动输入的数字就是flag

所以得到flag{222441144222}

笔记:

通过对v3的计算可得知,v4就是v3[28]

未解决问题:v[25]未找到初始化的步骤

PS:这是我写过最难的攻略了,做题当然不难,难点在怎么给读者描述自己的思路过程,因为很多东西是靠经验理解的,属于是“只可意会,难以言传”。佩服那些写书的大佬。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值