V0W's Blog

中国科大CTF HackerGame-WP

字数统计: 1,716阅读时长: 7 min
2018/10/16 Share

中国科大CTF HackerGame

前言

本次参加中科大的HackerGame-CTF,体会了一下看神仙打架的感觉,据说不少还是大一的0rz。题目整体来说质量还算不错,不少是脑洞题,算是见识了一些新的思路,也算是见识了新兴领域的一些东西(如机器学习和区块链),值得学习消化一段时间。另外比较可惜的一点是Web安全方面的题目实在较少,web狗感觉不开心╭(╯^╰)╮

签到题

嗯,去掉max-length就行。

1
flag{Hackergame2018_Have_Fun!}

猫咪问答

考察搜索引擎的使用

建校年份百科就有1958

学号演变史(百度搜关键词得到链接9211B026

多少名人,这个爆破一下就行9

中国科大图书馆有官网在其中搜一下就得到了 TP311.1/94

可以google搜到中国科大 Linux 用户协会在活动中找到3A202

Word文档

重命名.zip解压,考察word的本质——xml文档的压缩文件。

游园会的集章卡片

我是没想到什么好的方法的,直接上PS,虽然忘了很多操作,但是想了一个稍好点的办法

百度找了一张校徽图片,放大到652*625,然后把碎片放到里面,调整透明度对齐,然后得到比较完美的还原图。

mark

mark

flag{H4PPY_1M4GE_PR0CE551NG}

猫与键盘

大概看出了规律,先找到了url

1
2
3
* url: aHR0cHM6Ly96anUtbGFtYmRhLnRlY2gvY3BwZHQtcHJpbnRmLw==

https://zju-lambda.tech/cppdt-printf/

找到参考文章,根据文章,逐个修改调整字符顺序,写脚本,修改文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# coding: utf-8

f = open("typed_printf.cpp")
content = f.read()
lines = content.split('\n')
f.close()
# print lines
w = open("form.cpp","a+")

for s in lines:
try:
s0 = s[0]
s1 = s[32:39]
s2 = s[1:7]
s3 = s[20:22]
s4 = s[8:20]
s5 = s[22:32]
s6 = s[39:]

ss = s0+s1+s2+s3+s4+s5+s6
# print ss
res = ss + "\r\n"
w.write(res)
except:
ss = ""
print ss
print "done."

得到正确的源码,但是运行不了,还好关键代码部分不难,脑跑程序就能出来

1
2
3
4
5
6
7
8
9
int main(){                                                                              	def_typed_printf(f_l_x_g_1, "%s%s%s%s");                                             
f_l_x_g_1("fl")("a")("g")("{");
def_typed_printf(a_a_a_a_a_a_a_a_a, "%s%s%s%s%s%s%d");
a_a_a_a_a_a_a_a_a(ABC)("")(BAC)("")(CAB)("")('}');
def_typed_printf(def_typed_printf_, "%s%d%s");
def_typed_printf_("typed_printf")('_')("}");
return 0;
}
// flag{FfQ47if9Zxw9jXE68VtGAJDk6Y6Xc88UrUtpK3iF8p7BMs4y2gzdG8Ao2gv6aiJ125typed_printf95}

黑曜石浏览器

提示换浏览器,应该是改UA

google出来黑曜石浏览器后,在index.html中发现UA

mark

1
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36

Burp中改UA,即得flag

为了出题,写了个浏览器的网页也是用心了。/点赞

1
flag{H3ic0re_49.1.2623.213_sai_kou}

猫咪银行

考察整数溢出,

但是一开始考虑错了,想直接金额溢出,但是不行;

经大佬提醒以后,才想到应该是时间溢出,时间填很大的整数会溢出成负数,从而。很快就能取得很高的收益。

mark

mark

1
flag{Evil_Integer._Evil_Overflow.}

我是谁

哲学思考

很有意思的题目(ノ ̄▽ ̄)

打开网站,发现一个418的http状态,从来没见过,可能有猫腻。

mark

于是了解一下,知道了:

HTTP 418 I’m a teapot 客户端错误响应代码表示服务器拒绝冲泡咖啡,因为它是一个茶壶。 这个错误是超文本咖啡壶控制协议的参考,这是1998年愚人节的笑话。

还有人专门写了相应的RFC文档作为这个协议控制的参考

再看题目:

Who am I?

OK,第一题答案应该是teapot

得到第一个flag

flag{i_canN0t_BReW_c0ffEE!}

Can u help me

Come to This Link, help me brew some tea, and you can get the 2nd FLAG!

Brewing tea is not so easy.

Try using other methods to request this page.

首先是让我们用别的请求方法。

我一开始试了POST不行,但是得到提示

The method “POST” is deprecated.

See RFC-7168 for more information.

在文档中得到相应的提示

如基本HTCPCP规范中所述,通过发送BREW请求来执行对具有TEA能力的控制的控制。

POST 请求被等效地处理,但它们仍然被弃用。

然而,茶的生产与咖啡的不同之处在于,在泡制茶之前,通常提供茶的选择供客户选择。

对于URI“/”,将不会开始酿造。相反,必须发送RFC 2295 [ RFC2295 ]中 定义的Alternates 标头,并将可用的茶包和/或叶子品种作为条目。

也就是说,我们想做POST请求的时候,

  1. 用BREW代替POT方法,然后需要在url后面加上一个/xxtea

  2. 并且加上字段Content-Type:message/teapot

mark

响应里面有需要加的信息

加上需要加的http请求头信息,就可以得到flag了

mark

她的诗

py 脚本跑一下得到解密结果

mark

mark

但是发现两个解密结果不一样,而相差的字符连起来就是flag。

mark

1
flag{STegAn0grAPhy_w1tH_uUeNc0DE_I5_50_fu

提交不正确,不知道是我的文件少了还是怎么的。

根据语义加了点,过了。

1
flag{STegAn0grAPhy_w1tH_uUeNc0DE_I5_50_fun}

回到过去

把错误字符去掉,在Linux里跑一遍,就完事了,保存一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ed
a
flag{
.
a
44a2b8
a3d9b2
c44039
f93345
}
.
2m3
2m5
2m1
2
s/4/t
w flag.txt
q
1
flag{t4a2b8c44039f93345a3d9b2}

猫咪怕蛇

每道题给30秒的时间,算出来,肯定用脚本跑咯。

之前一直没有接触python写类似socket接口来链接服务器,这题算是学习了一些,又发现pwntools用的就是socket来写的,于是算是也学习了pwntools的一些用法。谁知道以后会不会入坑pwn呢,毕竟web快混不下去了呀==、

但是在脚本运行过程,发现了这么几个坑,需要注意一下:

  1. sleep(100),导致timeout
  2. exit()函数夹杂其中导致链接断开
  3. find ~ 可能导致超时,至少看着难受
  4. 输出二进制字符导致错误

mark

mark

mark

mark

因此,需要加上过滤,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pwn import *

# context.log_level = "debug"

ip = '202.38.95.46'
port = 12009

p=remote(ip,port)


tar = p.recv()
print tar
out = ''
while 'flag' not in out:
tar = p.recv()
tar = tar.replace("__import__('time').sleep(100)","None")
tar = tar.replace("exit()","None")
tar = tar.replace("__import__('os').system('find ~')","None")
tar = tar.replace("print('\\x1b\\x5b\\x33\\x3b\\x4a\\x1b\\x5b\\x48\\x1b\\x5b\\x32\\x4a')","None")
print tar
res = eval(tar)
out = tar
p.sendline(str(res))

print out

# flag{'Life_1s_sh0rt_use_PYTH0N'*1000}

秘籍残卷

拿到秘籍,然后notepad++打开,一顿放大缩小,结果竟然是这样的( ̄▽ ̄)/

mark

1
flxg{University_of_Ridiculous}

后记

官方WP

其实做的也不是很多,还有很多题目一点思路都没有,打算看看WP学习一波。

最后,分享两个有意思的ID(我的ID是伊丽莎白小竹鼠(`・ω・´)

mark

CATALOG
  1. 1. 中国科大CTF HackerGame
    1. 1.1. 前言
    2. 1.2. 签到题
    3. 1.3. 猫咪问答
    4. 1.4. Word文档
    5. 1.5. 游园会的集章卡片
    6. 1.6. 猫与键盘
    7. 1.7. 黑曜石浏览器
    8. 1.8. 猫咪银行
    9. 1.9. 我是谁
      1. 1.9.1. 哲学思考
      2. 1.9.2. Can u help me
    10. 1.10. 她的诗
    11. 1.11. 回到过去
    12. 1.12. 猫咪怕蛇
    13. 1.13. 秘籍残卷
    14. 1.14. 后记