0%

g2uc2020年新生赛WriteUp

g2uc2020年新生赛WriteUp

Crypto

Caesar

简单的凯撒加密。

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
/**
* @author yuzining
* @date 2020/11/07 14:29
*/

#include<bits/stdc++.h>
using namespace std;
#define debug(...) do { } while(false)
void Main();
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
Main();
return 0;
}

void Main() {
std::string str = "uapv{s0ndjzcdlzpxhp}";
for (char& c : str) {
if ('a' <= c && c <= 'z') {
int cur = c + 11;
if (cur > int('z')) {
cur -= 26;
}
c = char(cur);
}
}
std::cout << str << std::endl;
}

遵守社会主义核心价值观

密文:
公正公正公正诚信文明公正民主公正法治法治友善平等公正敬业平等友善敬业公正友善公正公正诚信平等法治公正公正平等平等诚信平等公正和谐公正爱国公正敬业公正诚信自由公正民主法治诚信和谐

扔进在线工具里即可:http://ctf.ssleye.com/cvencode.html

misc

扫码支付

给的是这样的一副图片:

扫了那个码发现是一串意义不明的字符串。

上面说的是这不是密码。

以为这个是干扰项,于是就卡了。

一筹莫展时,突然想到用7zip开一下,居然可以开出来,但是文件被加密了。

这时才想起来那串字符串说这不是密码是这个压缩包的密码。

然后解压找到flag了。

docx是个啥

给的是一个zip文件,开两层压缩包得到“这是个啥.zip”。

然后看到hint说是爆破于是就开始爆破吧。

一开始爆了有数字加字母的,然后长度比较小的情况下爆不出来。

仅数字爆破,爆破成功。

因为是AES256的所以用弄个第三方库pyzipper来搞,还爆破了半天。

大概正常的工具会用C++写爆破得很快吧。

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
import os, pyzipper

file_name = '这是个啥.zip'
zip_file = pyzipper.AESZipFile(file_name)

def check(s: str):
global zip_file
zip_file.pwd = str.encode(s)
try:
zip_file.read('flag.txt')
return True
except Exception:
return False

str_set = '0123456789'

def dfs(total: int, lst: list):
if len(lst) >= total:
if check(''.join(lst)):
print(''.join(lst))
exit(0)
return
for i in str_set:
lst.append(i)
dfs(total, lst)
lst.pop()

for n in range(1, 8):
dfs(n, [])

zip_file.close()

万恶的墨水

题目是一串文字:

本来想把flag直接告诉你算了,但是小明把墨水泼上去了,现在后四位看不到了。幸好我有它md5后的样子,你能算出来吗?

md5加密:B970BCC47176E5C61C42954CEA34F567

flag{vnei357####}

只有四位看起来还都是可视字符于是就直接$O(95^{4}\cdot |s|)$爆破了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import hashlib

def GetMD5(s):
obj = hashlib.md5()
obj.update(s.encode(encoding='utf-8'))
return obj.hexdigest().upper()

dest = 'B970BCC47176E5C61C42954CEA34F567'

sf = 'flag{vnei357'
sd = '}'

for i1 in range(32, 127):
for i2 in range(32, 127):
for i3 in range(32, 127):
for i4 in range(32, 127):
source = sf + chr(i1) + chr(i2) + chr(i3) + chr(i4) + sd
if GetMD5(source) == dest:
print(source)
exit(0)

web

氪金才能变强

如图所示输入超过400这个按钮就没办法按了。

但网站采用的是前端校验的方式,填完超过1000后按钮会变成disabled的状态,使用谷歌浏览器修改元素大法,将disabled去除即可。

这网站真眼熟

打开一看,被重定向了,用Python的requests禁止重定向后看看有什么妖魔鬼怪即可。

1
2
3
import requests
url = 'http://xxx.xxx.xxx.xxx:xxxxx'
print(requests.get(url, allow_redirects=False).headers)

闹钟响了

题目给的是一坨php代码。

1
2
3
4
5
6
7
8
9
10
11
<?php
class clock
{
function __wakeup()
{
echo "flag{xxx}";
exit();
}
}
$c = unserialize($_GET['try']);
?>

unserialize()会检查存在一个__wakeup()方法。如果存在,则先会调用__wakeup()方法。

于是访问http://xxx.xxx.xxx.xxx:xxxxx/?try=O:5:"clock":0:{}即可。

比如说这样的代码:

1
2
3
4
5
6
7
8
9
<?php
class clock {
function __wakeup() {
echo "flag{xxx}";
exit();
}
}
$c = unserialize('O:5:"clock":0:{}');
?>

会输出flag{xxx}

极限一换一

1
2
3
4
5
6
7
8
9
10
11
<?php
// 大概是写了这种代码
// 如果 $_GET["a"] 不是一个字符串就会报错,然后 `strcmp("flag{xxx}", $_GET["a"])` 会等于null而不是0就会输出了flag。
if (isset($_GET["a"])) {
if (strcmp("flag{xxx}", $_GET["a"]) === 0) {
echo("No");
} else {
echo("flag{xxx}");
}
}
?>

于是访问http://xxx.xxx.xxx.xxx:xxxxx/?a[]就会输出flag{xxx}

回到开头