NEUQCSA2022招新彩蛋 题解

发布于 2022-07-30  566 次阅读


一、WEB

1、[彩蛋题-1-1] Relax games

题目链接:http://81.70.101.23:2333/

4096(2048)小游戏,需要我们玩到100000

直接到js文件里搜索100000找对应函数就可以了

后面有“=”,大概率是base64,扔进去解码即可得到答案

图片太糊?为什么不自己试试呢

2、[彩蛋题-1-2] 扫雷

题目链接:http://124.222.182.202:1919(已失效)

认真玩你就输了

看网页script部分,有个console.log

扔进控制台,得到flag

3、[彩蛋题-2] 什么是Vim

题目链接:http://124.222.182.202:810(已失效)

什么是vim,vim写网页会留下来什么吗?

 非正常关闭vi/vim编辑器时会生成一个.swp文件

因为这个界面用Vim写的,所以应该有index.php.swp文件

也不用进Vim恢复文件了,直接打开看就能找到flag

3、手速大赛

在10秒内提交114次计算结果即可

import requests,re,time
ip = '11.4.5.14'#服务器地址
s = requests.Session()#保持session
page = s.get("http://{}/?{}".format(ip,'Hello~MonianHelloHere.Date:2022/08/01'))#跟服务器打个招呼
def WTH(page):
    calc = re.compile(r'\d+').findall(page.text[100:], 0, 30)#切割网页
    print('#{}\n{} + {}={} \n\n {}'.format(i,int(calc[0]),int(calc[1]),str(int(calc[0]) + int(calc[1])),page.text))#Debug
    return(str(int(calc[0]) + int(calc[1])))
ltime = time.time()
for i in range(115):
    page=s.get("http://{}/?res={}".format(ip,WTH(page)))
print('运行结束,总用时{0:,.2f}秒'.format(float(time.time()-ltime)))

实际运行大概0.6秒左右

切割网页,得到数字算完再交回去

因为到 题目: 的时候正好100个字符,前面的字符直接用[100:]切一下,之后正则匹配下两个数字就可以了

服务器 : speedTest_base_源码.rar

4、Steam社区

题目链接:Steam 社区

一个steam登录页面

当然,你要是真的用你账号登,号就無了

点击右上方的登录可以进入后台

在注释中提示要使用admin admin1 admin12 admin123 admin1234....进行尝试

admin:拜托,骗子没那么傻会用admin
admin1:和admin没关系
admin12:都说了,和admin没关系
admin123:别想了,和admin没啥大关系,但也有关系
admin1234:别想了,和admin没啥大关系,但现在关系更接近了
admin12345:别想了,和admin没啥大关系,但现在关系已经巨接近了
admin123456:别想了,和admin没啥大关系,但基本上一致了and visit a2.html
admin1234567:哈哈哈,不逗你了hacker,用户名是admin1233211234567,是不是关系特别近

得知用户名是admin1233211234567,以及第二个提示:http://81.70.101.23:1234/a2.html

在第二个提示中,有很多$_password = str_ireplace,对传入的password进行过滤

使用admin1233211234567登录后,提示password=systemflagecho。Correct username but incorrect password,please try again.

由于system flag echo均被过滤,直接使用systemflagecho肯定无法登录

这里使用双写关键字绕过,密码为sysystemstemflflagagecechoho

得到flag

二、PWN

1、[彩蛋题-1] civilization

文明游戏

先认真玩游戏,各种wiki无果。扔进IDA看一眼,根据源码简述下游戏流程

比较长也比较墨迹,可以直接跳过,看不好好玩游戏的部分

(0)定义初始数据:

这里具体值的含义一会再解释

(1)main()主函数

游戏共10回合,10回合后没能实现上天目标游戏失败(How did this happen?!),反之胜利

(2)turn()函数:

根据输入内容选择要进行的操作

每回合有四个选择:上天 feitian() 、砍树 cut_tree() 、收粮 harvest() 、商贸 trade()

(2.1)feitian()函数:

根据游戏要求,需要足够的 生产力(dword_4068)和金钱(laoqin)才可以建立太空中心获得游戏胜利

也就是 生产力(dword_4068)>=需要产力(dword_4098),金钱(laoqin)>=需要金钱(dword_409C)

(2.2)trade()函数:

dword_4080用来储存贸易路线的值,最多五条

创建贸易路线后,生产力+100,粮食+100,dword_4064为每回合自增金钱,+50

(2.3)cut_tree()函数:

一看就知道,砍树

作用也很明显,先判断有没有树,树一共可以砍五次(dword_4078的初始值为5),砍一次少一次。砍一次树能得到200生产力(基础值)

(2.4)harvest()函数:

和砍树类似,不赘述了。dword_406C是粮食

(3)run()函数:

好麻烦,大概就是看粮食够不够吃,一件事有多少人干

(4)auto_work()函数

啊哈哈,重头戏来咯

乍一看没什么,打印下当前持有的资源顺便加点钱。但是仔细看下

在2.1说飞天函数那里,提到过胜利条件是

生产力(dword_4068)>=需要产力(dword_4098)

金钱(laoqin)>=需要金钱(dword_409C)

而dword_4098和dword_409C这两位每回合还要自己加点料

而这二位的初始值分别是1100锤和2200钱

当时玩的时候没想到他俩玩阴的,玩了好长时间,结果钱和锤都够了也没能拿到flag

按照每回合自增200锤和400钱来算,到第十回合需要3100锤和6200钱


到这里就可以考虑不好好玩游戏了

游戏内我们可操作的也就是输入的名字和那几个数字

在(2)turn()函数里,有一个choice()

这里输入的值如果不是数字,或者值不是1234都会抛出 How self-indulgent the king is!

没什么操作空间

在(3)run()函数里,有一个read_num()

很明显,负数都比正数小,也能通过if()。所以输入人数的时候可以直接上负号

2、逆向彩蛋题

一个去年的题

解压缩,exe外带个dll

点一下

刚开始打算上连点器,后来发现真有人点出来了

先查壳,虽然不知道为什么DiE没查出来壳,用PEiD却能查出来yoda的壳

妹说就是0壳,上OD

jnb short 0040186F

JUMP NO BIT 到 就这就这就这

把地址0040186F改成00401841,顺便把后面全部nop

运行,flagGET

三、MISC

1、[彩蛋题-1] 比♂利

最近MISC做的题也不少了,群公告也有提示

记得要深♂入查看图片隐♂藏的地方哦

进010 Editor看文件尾

盲猜base64,解码

Once more

核心价值观编码(Core Values Encoder)

工具地址:Core Values Decoder