shavchen 发表于 2019-4-9 21:34

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中执行程序,设置断点,跳出循环的基本操作

shavchen 发表于 2019-4-9 21:54

zhaotianrun 发表于 2019-4-9 21:49
刚才我电脑坏了,对不起,这个写的还可以,不过真的不能够正常的进去吗

它一个变化要导致前后两盏灯都变化,而总共有8栈灯,是不可以的,三的倍数应该才行,个人理解哈

zhaotianrun 发表于 2019-4-9 21:49

刚才我电脑坏了,对不起,这个写的还可以,不过真的不能够正常的进去吗

2013年 发表于 2019-4-9 22:27

写的相当好,支持

52lxw 发表于 2019-4-9 23:07

学习学习

wangzhenuen 发表于 2019-4-10 10:52


学习学习

你的燚龘 发表于 2019-4-10 16:43

支持下技术贴

jmorning 发表于 2019-4-10 23:19

是没有图片?我这刷不出来

shavchen 发表于 2019-4-11 09:28

jmorning 发表于 2019-4-10 23:19
是没有图片?我这刷不出来

手机端显示有点问题

Hmily 发表于 2019-4-28 08:24

@shavchen 图了?文章是原创吧?
页: [1] 2
查看完整版本: BugkuCTF逆向题目04 - [游戏过关]