bugku 逆向游戏过关

在这里插入代码片题目来自bugku的游戏过关
第一种方法在这里插入图片描述
显然这是一道通关游戏就会出现flag的题目,首先我们拖入ida中,F5找伪函数
在这里插入图片描述
我们可以发现sub_457AB4就是flag所在的函数,上面的if的成立,flag便出来了。
在这里插入图片描述
发现v2~v58数组与v59至v115数组位运算后得到的数组在与0x13位运算就可以得到flag了。

# py -3
# coding:utf-8
A=[18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
B=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
flag=''
for i in range(len(A)):
    flag+=chr(A[i] ^ B[i] ^ 0x13 )
print(flag)    

第二种方法:
那我们可以尝试通过修改程序来直接跳过之前游戏的步骤得到flag。这时我们将程序放入od中。
打开之后,我们用搜索“done!!!the flag is”的方法直接找到flag的所在地址
在这里插入图片描述
这时我们需要查看是如何来到这个地址,我们在这个地址没找到我们需要的东西,这时我们就需要往上每个地址都看一遍。
在这里插入图片描述
我们可以发现是从00DC7AB4跳转过来的,这时我们就右键下方的跳转到00DC7AB4。
在这里插入图片描述
我们又可以发现这里又是跳转过来的,我们再跳。
在这里插入图片描述
到这里没有跳转的来源了,我们老办法周围看看,
在这里插入图片描述
在这里插入图片描述
我们可以发现上面有八个jnz判断指令,这便是上文的if函数,如果有一个指令跳转实现了,那么便会跳到00DCF671,然后又跳回00DCF4FB,重复循环,所以我们要修改这类跳转的地址
在这里插入图片描述

之后运行程序,我们随便输入1到8其中一个
在这里插入图片描述
之后继续运行程序,flag便出来了。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/inryyy/article/details/104832504