Fork me on GitHub

Bugku-CTF逆向篇之游戏过关

游戏过关

 
 
 
 
本题要点:IDA使用 、OD使用、修改程序代码并保存
 
 
 
-------------------------------
玩一个游戏
 
n是灯的序列号,m是灯的状态
 
如果第n盏灯的m是1,它是亮的,如果不是,它是灭的
 
起初所有的灯都是关着的
 
现在你可以输入n来改变它的状态
 
但是你要注意一件事,如果你改变第N盏灯的状态,第(N-1)和第(N+1)的状态也会改变
 
当所有的灯都亮时,就会出现flag
 
现在,输入n
-------------------------------
 
 
 
 
 
笔者打算先随便输一些数字玩一玩.....
 
直接按照从小到大顺序试一下吧...........12345678..........结果.........
 
flag就出来了........
 
 zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t} 
 
但是老实讲,很多逆向题目不会这么容易得到flag
 
我们本着学习技术的态度,还是老老实实用 IDA和OD 分析分析吧~
 
 
 

一、查壳

 
第一步当然是先查壳啦~
 
查壳 ,无壳。
我们发现是  Visual C++ 编写的。
 
 
 
 

二、IDA静态分析

 
 
既然没有壳,那我们下面就用IDA来静态分析一下:
 
先用IDA里的搜索功能,搜索一下flag这样的关键字~
 
 
 
 
 
 
我们双击点击 .text:0045F4E1或者.text:0045E968 ,都会定位到图下这一块位置。
 
我们观察一下, .text:0045F940 应该是核心代码运算判断的部分。
 
 
 
继续往下翻一翻,我们看到了程序运行显示字符串的那段代码:
 
 
我们可以转化成c语言代码,更加容易理解一些。
 
(笔者用IDA 64位的F5反汇编不了c语言,不知道是不是版本的问题,用32位的就可以使用F5的反汇编功能qwq)
 
反汇编成c语言之后,我们看到了判断灯亮的语句。
 
 
 
往下再翻一翻,我们看到了最后面的运算:
 
关键函数的主要逻辑就是上面说的游戏规则的实现。
 
看一下输出flag的函数:就是将两个已经初始化的数组求与之后,再按位和 0x13 求与之后,转化成字符串输出即可~
 
 
 
 
借用一位大佬的py3代码:
 
(大佬的文章在参考资料里面,有需要的小伙伴可以参考~)
 
# py 3
# coding:utf-8
 
 
array1 = [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]
#第一个数组
 
 
array2 = [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(array1)):
    flag+= chr(array1[i] ^ array2[i] ^ 0x13 )
    #两个数组求与,然后每一位与0x13求与
    
print (flag)
 

 

 
 
 

三、OD动态调试

 
当然,我们也可以利用OD进行动态调试~
 
首先我们可以通过 中文搜索引擎=》智能搜索 
 
搜索flag
 
 
 
 
 
双击点击进入
 
 
 
我们发现跳转来自 00427AB4 ,因此我们往上转到00427AB4
 
 
 
 
 0042E940=ConsoleA.0042E940  表明了它指向了输出flag的函数;
 
 本地调用来自 0042F66C :说明它是由0042F66C调用的,所以我们再往回转到 0042F66C:
 
 
 
 
 
 
我们可以在开头下一个断点,运行之后,单步运行几次,就会发现:
 
一旦只要由一个判断不满足,程序就跳转到输出flag的函数的下一条去了,这样就不会输出flag而重新开始循环要求你输出n了
 
 
所以我们要修改源代码使得程序不管怎样都会进入输出flag的函数,这样我们只要运行程序就能得到flag了。
 
 
 
 
 
 
 
修改完就是这个样子啦~
 
 
保存文件
(没有直接保存的选项,所以需要右键 复制到可执行文件=》选择  )
 
 
 
 
选择路径保存。
 
运行我们修改之后的程序~
 
 
回车,我们就看到答案啦~
 
 
 
  zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t} 
 
 
 
 

参考资料

 
https://blog.csdn.net/Onlyone_1314/article/details/89414568
https://blog.csdn.net/weixin_42528089/article/details/85114846
 
 
posted @ 2020-06-15 12:41  0yst3r  阅读(1911)  评论(0编辑  收藏  举报
返回顶部