本文由掌控安全学院 - sbhglqy 投稿
前言:由于此次比赛的题目较多,所以这是这个比赛的第一篇wp,共20题,先记录一下,防止忘记。里面有些题目是新手题较为简单,但也有许多有意思的题目,真的是做的过程痛不欲生,做完才感觉到酣畅淋漓,废话不多说,开写。
一、签到题------hello CTFer
1.题目给出了一个网址如下。
https://cyberchef.org/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=Ylc5bFkzUm1lMWRsTVdOdmJUTmZkREJmYlRCbFkzUm1Yekp2TWpNaElTRjk
只需要对input参数的值进行两次base64解码即可获得flag。
二、Classical Crypto------ezrot
1.附件中信息如下。
>@64E7LC@Ecf0:D0;FDE020D:>!=60=6EE6C0DF3DE:EFE:@?04:!96C0tsAJdEA6d;F}%0N
根据题目可以得到这是个rot家族编码,经过尝试,此为rot47编码,解码即可获得flag。
三、Classical Crypto------可可的新围墙
1.附件内容如下。
mt3_hsTal3yGnM_p3jocfFn3cp3_hFs3c_3TrB__i3_uBro_lcsOp}e{ciri_hT_avn3Fa_j
根据题目"新围墙"可以很容易的想到是栅栏密码,不过这是个w型栅栏密码,编写脚本获得flag。
1 def dec(encrypted, num):2 matrix = [([0] * len(encrypted)) for i in range(num)]3 cur = 04 for i in range(num):5 if i == 0:6 pair = [(num - (i + 1)) * 2 - 1]7 elif i == num - 1:8 pair = [i * 2 - 1]9 else:10 pair = [(num - (i + 1)) * 2 - 1, i * 2 - 1] 11
12 pair_i = 013 j = i14 while True:15 if cur = len(encrypted):16 break17 i_s = []18 for a in range(num):19 i_s.append(a)20 for a in range(num - 2, 0, -1):21 i_s.append(a)22 i_s_len = len(i_s)23 decrypted = ''24 for j in range(len(encrypted)):25 decrypted += matrix[i_s[j % i_s_len]][j]26 return decrypted 27
28 ciphertext = 'mt3_hsTal3yGnM_p3jocfFn3cp3_hFs3c_3TrB__i3_uBro_lcsOp}e{ciri_hT_avn3Fa_j'29 for i in range(2, len(ciphertext)):30 plaintext = dec(ciphertext, i)31 if "moectf" in plaintext:32 print(plaintext)
四、Classical Crypto------皇帝的新密码
1.附件内容如下。
tvljam{JhLzhL_JPwoLy_Pz_h_cLyF_zPtwPL_JPwoLy!_ZmUVUA40q5KbEQZAK5Ehag4Av}
根据题目"皇帝的新密码"可以想到凯撒密码,当偏移量为7时获得flag。
五、Classical Crypto------不是"皇帝的新密码"
1.附件内容如下。
scsfct{wOuSQNfF_IWdkNf_Jy_o_zLchmK_voumSs_zvoQ_loFyof_FRdiKf_4i4x4NLgDn}
md5 of flag (utf-8) 'ea23f80270bdd96b5fcd213cae68eea5'
给出了flag的md5值,第一想法肯定是去爆破一下了,很显然拿不到答案。
这里提供几个常见的爆破md5值的网址:
https://www.somd5.com/
https://www.cmd5.com/
http://scmd5.com/
2.根据题目提示"不是皇帝的新密码",那就不是凯撒密码,但是根据题目所给内容又像是一种代换密码。搜索凯撒密码的变种,查到了维吉尼亚密码。接下来就是技巧了,由于知道flag的开头肯定是"moectf",根据这个去猜测密钥,最终得到密钥为"goodjob"。
验证一下得到的解密内容的md5值。
完全正确,提交即可。
六、Classical Crypto------猫言喵语
1.文件内容如下。
喵喵?喵喵喵喵喵喵喵喵喵喵喵喵 喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵喵喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵喵喵喵喵 喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵喵 喵喵喵喵喵?喵喵?喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵喵喵喵喵 喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵喵 喵喵喵喵喵?喵喵喵喵喵?喵喵喵喵喵喵 喵喵喵喵喵?喵喵喵喵喵喵 喵喵喵 喵喵?喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵?喵喵喵 喵喵?喵喵?喵喵?喵喵喵喵喵喵喵喵?喵喵?喵喵?喵喵喵喵喵喵 喵喵喵喵喵喵 喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵喵喵喵喵 喵喵?喵喵喵喵喵?喵喵?喵喵喵喵喵喵喵喵?喵喵?喵喵喵喵喵?喵喵喵喵喵?喵喵喵 喵喵?喵喵喵喵喵喵喵喵?
2.根据文件提示"Morse code",是摩斯密码。众所周知。摩斯密码只有两种符号,所以得把文件内容根据特征划分成两块。内容中的空格相当于分隔符,根据观察,可以看出"喵喵?"是一组,"喵喵喵"是一组,根据这个规律进行转换,得到如下内容。
./----/-/--..-./.-./-./-../-./--/--/--..-./.-.-/-././--..-./.---/--././--..-./.---/-/--..-./.-.-/-./-.--/-.--/-/.--/--..-./..-/.../--./..--/--/--..-./.---/.-../--..-./-.-/.--.
解码发现有问题,将"-"和"."交换一下解码成功。
套上moectf{},提交即可。
七、Misc-Misc入门指北
1.文档最后有个base64编码的字符串,直接解码即可获得flag。
八、Misc---打不开的图片1
1.下载得到一个破损的文件,用16进制编辑器打开,看到文件头和文件尾就可以想到是个jpg格式的文件。2.但是文件头有点不对,将第二个字节改成D8,保存。3.打开图片,啥也没有,右击属性,在详细信息中看到一串16进制编码,解码得到flag。
几个常见文件的文件头的16进制编码:
zip:504b0304
rar:52617221
png:89504e47
jpg:ffd8ff
gif:47494638
九、Misc-打不开的图片2
1.这次显示文件是个jpg格式的图片,但是打不开,16进制编辑器打开,看到文件头出现了IHDR头,就可以想到其实是个png格式的图片,再看到文件尾,更加证实了是个png文件。2.修改文件头前4个字节为89504e47,保存。3.打开图片,即可看到flag
十、Misc-狗子(1)普通的猫
1.下载得到一个音频,用audacity打开没有什么发现。最后用16进制编辑器打开,flag就藏在文件尾。
十一、Misc-building_near_lake
1.这题跟信息泄露有关,附件是个图片,先通过百度搜图看看是哪里。
2.根据原图中的umx和搜索结果可以定位到厦门大学,搜索厦门大学的经纬度。题目中说使用的是BD09坐标系,所以就要将GPS坐标转为BD09坐标。
function wgs84ToBd09(lng, lat) {
var pi = Math.PI * 3000.0 / 180.0;
var x = lng,
y = lat;
var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi);
var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi);
var bdLng = z * Math.cos(theta) + 0.0065,
bdLat = z * Math.sin(theta) + 0.006;
return {"bdLng": bdLng, "bdLat": bdLat};
}
3.还差一个拍摄设备的发布会时间,查看图片的详细信息,发现是小米的设备,照相机型号为22122RK93C。
网上搜索,可以发现改照相机型号用于Redmi k60手机上,搜索Redmi k60手机的发布会时间得到2022年12月27日。4.填上相关信息,提交获得flag。
十二、Misc-机位查询
-
附件给了我们三张图片,叫我们找到这三张照片分别是在哪栋楼拍的。2.第一张照片可以看到南宁站和中铁快运营业部,放大还可以看到猪霸王煮粉,直接百度地图上搜,就可以定位到大概的位置了。
候选地点是嘉士摩根国际。
3.第二张照片是最简单的,直接百度识图,可以看到有个人在小红书上刚好发布过这张图片,直接拿到了拍摄地点。
https://www.xiaohongshu.com/explore/5f223da3000000000101f3f2
4.第三张照片是最头疼的,全都是高楼,能够看到的只有广西农信,时代丽都,搜索相关位置,找到了大概区域。
但是能够拍到这张图片的位置可不少。试了好久也没试对。最终在图片的属性信息中看到了有经纬度。接下来就可以定位了。手机上下载"经纬度定位"app,输入经纬度就得到了地址。(一开始用谷歌定位一直定位不出来)
经度:108; 21; 33.0084219999844919
纬度:22; 48; 48.3576960000066
最终将三个地点的前两个字的拼音进行拼接即可,即jiashi_baisheng_huijin。
十三、Web-Web入门指北
1.一次16进制解码加一次base64解码即可获得flag。
十四、Web-http
1.题目意思如下。
只要我们能满足以上5个条件,即可获得flag。
2.但是由于容器采用的是wsrx穿透,最终访问的是localhost的地址,这时burp就无用武之地了。这里用了另一款工具postman。发包即可获得flag。
十五、Web-彼岸的flag
1.直接从前端代码中搜索ctf就能拿到flag。
十六、Web-cookie
1.看下所给的附件内容。
## 一些api说明
注册 `POST /register`
``json
{
"username":"koito",
"password":"123456"
}
``
登录 `POST /login`
``json
{
"username":"koito",
"password":"123456"
}
``
获取flag `GET /flag`
查询服务状态 `GET /status`
告诉我们有register、login、flag、status四个api接口,最终肯定是要访问flag接口获得flag。
2.访问一下地址,页面回显如下。
访问一下flag接口。
提示我们不是admin,看来想获得flag必须是admin身份。
3.注册一个账号。注册成功,登陆一下。
发现产生了cookie。
base64解码发现可操作的地方,只需要将role改为admin,再编码回去,换掉cookie就可以了。访问flag接口的时候带上我们构造好的cookie就可以了。
十七、Web-gas!gas!gas!
1.页面如下。
2.先随便提交一次,看看页面有没有回显。
3.看到了页面提示,那这题看来是根据页面的回显来改变方向和油门。看一下方向和油门两个参数对应的参数名。
4.知道了这两个参数对应的参数名之后,就可以编写脚本了。
import requests
import re
import time
url = "xxxxxx"
session = requests.session() # 必须要用session,只用post的话,当一次会话结束后,session的清空了
params = {'driver': 'a', 'steering_control': '-1', 'throttle': '2'}
response = session.post(url,params)
response.encoding = "utf-8"
while True:
pattern = re.compile('<font color="red">(.*?)</font>')
res = pattern.findall(response.text)
# soup = BeautifulSoup(response.text, 'html.parser')
# res = soup.find('div', class_="info")
# print(response.text)
print(response.text)
print(res)
if 'moectf' in response.text:
print(response.text)
break
if res[0] == "弯道向右,抓地力太小了!":
params['steering_control'] = -1
params['throttle'] = 0
elif res[0] == "弯道向左,抓地力太小了!":
params['steering_control'] = 1
params['throttle'] = 0
elif res[0] == "弯道直行,抓地力太小了!":
params['steering_control'] = 0
params['throttle'] = 0
elif res[0] == "弯道向右,抓地力太大了!":
params['steering_control'] = -1
params['throttle'] = 2
elif res[0] == "弯道向左,抓地力太大了!":
params['steering_control'] = 1
params['throttle'] = 2
elif res[0] == "弯道直行,抓地力太大了!":
params['steering_control'] = 0
params['throttle'] = 2
elif res[0] == "弯道直行,保持这个速度":
params['steering_control'] = 0
params['throttle'] = 1
elif res[0] == "弯道向左,保持这个速度":
params['steering_control'] = 1
params['throttle'] = 1
elif res[0] == "弯道向右,保持这个速度":
params['steering_control'] = -1
params['throttle'] = 1
time.sleep(0.1)
response = session.post(url, params)
response.encoding = "utf-8"
十八、AI-AI入门指北
1.题意如下。2.访问pytorch官网, 查找安装不带GPU的pytorch命令。连接来后就是flag。
十九、Reverse-base_64
1.得到一个pyc文件,进行python反编译,拿到如下代码。
import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = input('welcome to moectf\ninput your flag and I wiil check it:')
enc_flag = base64.b64encode(flag.encode()).decode()
enc_flag = enc_flag.translate(str.maketrans(string2, string1))
if enc_flag == str1:
print('good job!!!!')
else:
print('something wrong???')
exit(0)
2.根据代码意思,其会将我们输入的flag进行base64编码后,再根据string2和string1做一个映射。所以我们只需要将str1按照逆序的过程返回去即可。
str2=str1.translate(str.maketrans(string1,string2))
print(str2) # bW9lY3Rme3BZY19BbmRfQmFzZTY0fn0=
解码即可。
二十、pwn-test_nc
1.这题就是让我们了解python中的pwn库的,只要nc连接上之后就会给一个shell环境,这不就是妥妥的命令执行了嘛。
from pwn import *
io = remote("localhost",59290)
res = io.recv()
io.interactive()
申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.