codegate final 2018 writeup

远程支援,做了三个逆向,一个《GoCrack》,两个游戏题《Game》,输出还行。

文件链接;https://github.com/LeadroyaL/attachment_repo/tree/master/codegate_final

一、G0Crack

很简单的循环 xor,将输入xor上预期的 key,与输出比较。

1
2
3
4
5
6
7
8
In [3]: main_check="8C01F0A7A5D8B809F285CBAEAE0D70BBF5E6".decode('hex')

In [4]: main_key = "Jix18auf"

In [5]: for i in range(18):
...: print chr((ord(main_check[i])^ord(main_key[i%6]))>>1),
...:
c 4 t c h _ y 0 u r _ d r 2 4 m @ @

二、gameServer

这是一个类似宠物妖怪的游戏,有两个 flag,都是满足一定条件时服务器直接返回。

提供一个 binary 文件,服务器是一个 web server,搭建环境需要开一个 apache 使用80端口,再运行 binary 文件,使用8080 端口。官方提供的 web都是静态页面,爬回来就可以自己用了,使用 js 控制 websocket 来和 binary 文件进行交互,协议都在 js 和 binary 里,不需要猜协议。

整个过程就是控制宠物妖怪,到处走,随机战斗,战斗不受控制,会告诉你战斗结果,打不过也没关系,扣血扣到1。

嘛,然后就逆向嘛,elf 64bit。 (写这篇文章时候发现 idb 打不开了,我这台机器 ida 版本太低) 两个 flag,一个是升级升到100时候给 flag(正常情况升不到100级),一个是在某个地形站着,触发剧情就给 flag。

没有 idb 么,那就说思路吧:

  1. 其实这道题很像游戏安全的一些东西,有些数据是客户端主动给服务器的,假设战斗数据是本地扔过去的,就可以刷怪刷经验什么的。
  2. 尝试找一些整数溢出。因为各个属性都是整数,正面刚肯定是打不过怪物的,所以用整数溢出去打可能会有用。
  3. 尝试找一些能够给角色属性赋值的 API,篡改角色数据。 很遗憾,角色数据存放于远程,最后似乎是可以溢出一个东西,刚好溢出到角色属性,就可以随意刷怪,打到100级了。
  4. 有个迷惑的地方,通过进入特殊的房间可以累积一个值,当累积的刚好94时候可以获得状态"enable cheat",会加9999金币,然而金币没有任何卵用。
  5. 第二个 flag 是在意外发现的,有一个很特殊的道具叫炉石。顾名思义,炉石就是用来传送的,使用了几次总会被传到奇奇怪怪的地方,一开始没有在意。后来找到了存放地图的地方,观察一遍,发现放 flag 的地板所在的房间是不可达的,而且发现地图末尾存放着传送点,每个地图末尾传送点都不一样。
  6. 炉石使用传送点时候是瞎 jb 写的,所以可以传送到那个房间。最后也是这样做的。 有空时候把 idb 补上。