BugkuCTF逆向题目04 - [游戏过关]
本帖最后由 shavchen 于 2019-4-28 21:39 编辑<!-- TOC -->
- [题目下载地址](#题目下载地址)
- [分析题目](#分析题目)
- [查壳脱壳](#查壳脱壳)
- (#ida静态分析)
- (#od动态调试)
- [总结](#总结)
<!-- /TOC -->
## 题目下载地址
- https://ctf.bugku.com/files/d2935133b45ff7a32b2b9436851959d0/ConsoleApplication4.exe
## 分析题目
- 直接运行
![运行程序.png](https://i.loli.net/2019/04/09/5caca36c5b9ae.png)
- 题目简介
> 目的:点亮所有的lamp(台灯)
> 输入lamp编号(m),则该lamp变亮,同时(m-1)和(m+1)的lamp亮暗状态会变化
> 输入多次m,最后将lamp全部点亮,游戏过关
- 先玩玩
> 输入2,结果为
>> !(https://i.loli.net/2019/04/08/5cab577d46074.png)
>
> 输入5,结果为
>> !(https://i.loli.net/2019/04/08/5cab577d45b59.png)
>
> 输入8,结果为
>> !(https://i.loli.net/2019/04/08/5cab577d454d5.png)
>
> 尝试多次,无法将所有灯全部点亮
> 初步确认无法手工破解后,默默打开IDA和OD
## 查壳脱壳
- 使用exeinfo查壳工具
![查壳.png](https://i.loli.net/2019/04/08/5cab515f16aee.png)
> 此程序无壳
## IDA静态分析
- 搜索字符串(shift+F12)
!(https://i.loli.net/2019/04/08/5cab5bf0eabe8.png)
> 发现明显暗示:done!!!the flag is
>> 这可能就是成功游戏过关后,显示flag字符串
>> 意味着我们只要让程序执行到这个位置,就可以获得flag了
- 双击查看该字符串的内存地址
!(https://i.loli.net/2019/04/09/5caca09e7a636.png)
> 变量位于只读数据区(rdata)
- 查看该字符串变量的交叉引用地址
> 设置显示行前缀地址(Option-General-Display-Line Prefix)
>> ![地址.png](https://i.loli.net/2019/04/08/5cab5d51b2aea.png)
>
>按`X`键定位变量的交叉引用地址
>>![地址.png](https://i.loli.net/2019/04/08/5cab5daf2b596.png)
>> 发现进栈地址:0x0045E940 ,这里需要记住偏移地址`E940` ,下面使用OD直接`非常规`执行到该地址
## OD动态调试
- 载入程序
![段基地址.png](https://i.loli.net/2019/04/09/5cac97afc4278.png)
> 记住基地址`0130`
- 找一个可控的程序片段,以跳转到目的flag段
> 之前玩游戏的时候发现每次输入都是循环执行的,故这个地址是可以被正常执行到的
> 在OD中搜索字符串找到该输入n的语句地址
>> ![智能搜索.png](https://i.loli.net/2019/04/09/5cac96758e405.png)
>
> CTRL+G ,在这个位置设置断点,运行程序
>> !(https://i.loli.net/2019/04/09/5cac97fed7e5c.png)
>
> 随便输入一个数字,让程序执行到该位置
>> !(https://i.loli.net/2019/04/09/5cac986c5572a.png)
- 跳转到flag字符串地址
> 双击汇编指令段,输入jmp 0x0130e490 ,跳转到目标flag字符串的内存空间
>> !(https://i.loli.net/2019/04/09/5cac994076869.png)
>> !(https://i.loli.net/2019/04/09/5cac9a6c109a3.png)
>
> 单步执行,进入目的地址
>> !(https://i.loli.net/2019/04/09/5cac9ac90d3fd.png)
>
> 单步执行、再单步执行....
> 遇到一个循环,单步跳过(循环判断语句,具体内容不管,设置断点于循环末尾,跳过之)
>>![循环断点.png](https://i.loli.net/2019/04/09/5cac9c136d36a.png)
>> 点击运行,跳过循环
>
> 出现flag字符串
>> !(https://i.loli.net/2019/04/08/5cab676a1c450.png)
- flag字符串
`zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}`
## 总结
1. 调试几乎所有的Windows程序,将IDA和Olldbg联合使用,将起到事半功倍的效果
2. 解题的第一步,需要理清题目想要干什么,运行并研究程序本身的运行流程和提示是必要的
3. IDA调试程序找到关键变量的偏移地址,再使用OD调试,是一种常见的调试手段
4. 本程序使用了jmp指令,通过`中断`可以控制的程序语句,跳转到正常情况下不可以`到达`的flag语句位置,从而获得flag,是一个很棒的思路
5. 掌握OD中执行程序,设置断点,跳出循环的基本操作 zhaotianrun 发表于 2019-4-9 21:49
刚才我电脑坏了,对不起,这个写的还可以,不过真的不能够正常的进去吗
它一个变化要导致前后两盏灯都变化,而总共有8栈灯,是不可以的,三的倍数应该才行,个人理解哈 刚才我电脑坏了,对不起,这个写的还可以,不过真的不能够正常的进去吗 写的相当好,支持 学习学习
学习学习 支持下技术贴 是没有图片?我这刷不出来 jmorning 发表于 2019-4-10 23:19
是没有图片?我这刷不出来
手机端显示有点问题 @shavchen 图了?文章是原创吧?
页:
[1]
2