Cumt第三次双月赛writeup

若想得到想要的东西,至少付出等价的付出

前言

这是学校举办的第三次CTF比赛,也是第三次双月赛。时间定得很好(五一),只是还有各种杂事缠身,没能花太多时间做,所以只做出了几个简单的题,等考完试后再找时间看看其他题吧。

Web

web签到

1.打开连接,发现:

提示试试本地文件包含搜索cxk.php,而且通过page参数传值,如果不指定page则输出page!!!!

2.直接访问cxk.php,发现为相关配置信息等,没有发现有用的信息。

3.直接访问源码,通过?page=php://filter/read=convert.base64-encode/resource=cxk.php,访问得到

1
PD9waHAgDQpwaHBpbmZvKCk7IA0KLypmbGFne0N1bXRDVEZfdGhpc19pU19hX1JFbEx5X2ZMYUchISF9Ki8NCj8+DQo=

4.base64解码,得到flag:

1
2
3
4
<?php
phpinfo();
/*flag{CumtCTF_this_iS_a_RElLy_fLaG!!!}*/
?>

Crypto

古典密码签到

1.题目给出:

1
2
3
6A757474616967796B68706D6A7972656361

key=63756D74

2.古典密码,想到可能是维吉尼亚密码,或者是变异凯撒等,但发现密文和秘钥都是16进制的,所以先转为字符穿得到:

1
2
3
juttaigykhpmjyreca

key=cumt

3.在线网站一个一个试,发现为维吉尼亚加密,解密得到flag:

现代密码签到

1.题目给出:

1
2
3
zSLWE5Fk7Sg3mlltw9l2N7dhuADvk2HvWYU=

key: WTNWdGRHWnNZV2M9

2.看着似乎是base64,先解码看看,发现密文无法解。但是key可以,而且通过两此base64解密后得到key=cumtflag

3.接着便是考虑是何加密了,此题明显是对称加密,在现代密码中,常见的有DES,AES,RC4,RC5,A5等,还是一个一个试,最后发现为RC4,解密得到flag:

easyxor

1.此题名为简单异或,下载后打开得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import libnum
flag = 'flag{**************************}'

def crypt(msg):
msg = libnum.s2n(n)
k = 0
for i in bin(msg)[2:]:
k = k << 1
if int(i):
k = k ^ msg
if k >> 256:
k = k ^ 0x10000000000000000000000000000000000000000000000000000000000000365L
return str(k)


d = crypt(flag).encode('base64')

2.由此可知,需要写出相应的解密函数,在此之前,先了解python2中的libnum模块

libnum库是一个关于各种数学运算的函数库,它包含common maths、modular、modular squre roots、primes、factorization、ECC、converting、stuff等方面的函数

  • s2n(): 字符转数字(数字:十六进制,十进制都行)
  • n2s(): 数字转字符
  • b2s(): 二进制转字符串
  • s2b(): 字符串转二进制

其他:可参考: python libnum库安装使用方法

3.未给提示前,尝试了几种解密,都没成功。后给出提示如下

hint : Decryption is equivalent to continuing encryption

4.解密相当于继续加密,也就是说加密函数继续加密,就会得到明文。即此加密为一个循环,那么我们只需要继续加密,当加密得到的内容和所给的密文相等时,此时被加密的内容即为相应的明文。

5.下面对函数进行相应修改:

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
# -*- coding:utf-8 -*-

import libnum

def decrypt(c):
k = 0
for i in bin(c)[2:]:
k = k << 1
if int(i):
k = k ^ c
if k >> 256:
k = k ^ 0x10000000000000000000000000000000000000000000000000000000000000365L
return k

# 通过文本读取密文
c = open("cipher.txt")
c = c.read()
# base64解码
c = c.decode('base64')
# 解码后得到的为数字字符串,需要转为数值
c = int(c)
# 打印查看是否转换成功
print "the cipher number is: ", c

# 通过不断的加密,找出明文(数值)
t = c
for i in range(100000):
# 当加密的内容和密文数值相等时,打印出明文并退出循环
if(decrypt(t) == c):
print "the plain number is: ", t
ans = libnum.n2s(t)
print "the plain string is: ", ans
break
# 如果不等,t更改为此次加密后的值,继续加密
t = decrypt(t)

6.得到flag

encode

1.下载得到1.pyc,关于pyc文件,Python在执行.py文件的时候。将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快下次执行文件的速度。同时,可以一定程度防止源码泄漏。

2.首先,进行反编译,不同python版本编译后的pyc文件是不同的,这里直接找了网站:在线工具进行反编译,得到:

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
import base64

def encode1(ans):
s = ''
for i in ans:
x = ord(i) ^ 36
x = x + 25
s += chr(x)
return s

def encode2(ans):
s = ''
for i in ans:
x = ord(i) + 36
x = x ^ 36
s += chr(x)
return s

def encode3(ans):
return base64.b32encode(ans)

flag = ' '
print 'Please Input your flag:'
flag = raw_input()
final = 'LOQ2NJFYU5YH2WTUU5VHJIDXLJNVW2LQO52WS2L6PVUVW2TQLJNVSWLJUBN3E==='
if encode3(encode2(encode1(flag))) == final:
print 'correct'
else:
print 'wrong'

3.接下来就很简单了,写出相应的解密函数,如下:

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
import base64

final = 'LOQ2NJFYU5YH2WTUU5VHJIDXLJNVW2LQO52WS2L6PVUVW2TQLJNVSWLJUBN3E==='

def decode3(ans):
return base64.b32decode(ans)


def decode2(ans):
s = ''
for i in ans:
x = ord(i) ^ 36
x = x - 36
s += chr(x)
return s

def decode1(ans):
s = ''
for i in ans:
x = ord(i) - 25
x = x ^ 36
s += chr(x)
return s


flag = decode1(decode2(decode3(final)))
print flag

运行得到flag


Misc

Whoami???

1.查看题目,发现:

2.这个,首先想到的是代理服务器,尝试几次发现不对,基础不行,那就爆破吧:使用burpsuite中的字典进行爆破:选了很多字典,爆破时花了不少时间。

3.根据响应长度不同,发现有两个答案,为teapot和teapots,查看响应内容,得到flag。


0%