WUST-CTF 2020 WriteUp
前言
本文无任何跳步,过程十分详细,面向零基础的萌新(我也是萌新
这次又被“面向萌新,题目友好”给骗了,我还是tcl。
Web
checkin
打开链接发现要提交作者的名字,但是提交键无法点击
于是按F12查看网页源代码找到提交键的元素,发现了disabled=“disabled”,把它删除后发现无法输入作者“52Hertz”,发现有maxlength="3"的限制,把3改成大数后就可以点击提交了。
弹出来一个框,输入url进入博客。
在主页发现了滚动的前半段flag,接着在博客里找后半段。
文章翻到最后一页的最后一篇博客发现了“远古的blog”
进入后翻到最下面找到了后半段,拼接即可。
admin
第一反应居然是sql注入。。。这里放的是我的奇yin方法,当时没想到要用万能密码(例如’or 1#)
随便输个账号密码,用Burp Suite(以下简称BP)抓包
把包复制粘贴到kali linux的文本文档里并保存
sqlmap一下发现了一个302的url
访问这个url,发现要本地ip,所以在BP抓的每一个包里都加上 X-Forwarded-For: 127.0.0.1
GET请求,构造?ais=520
POST请求,用Max HackBar 勾选Post Data wust=1314 Execution
p和aste应该连起来,剩下的4dz,Rqr,cSf2排列组合即可
把得到的这段base64解码即可
CV Maker
先注册一个账号并登录
只有这个更换头像的地方可操作,看出是文件上传,试试一句话木马行不行
更改content-type为image/jpg等操作都无法上传成功,查一下exif_imagetype
找到CSDN里有这样一篇博客
制作图片马
上传2.jpg,抓包,send to repeater,把filename的后缀改为.php,send,在response里找到了上传的回显路径
打开中国蚁剑进行连接,url为那个路径,密码为一句话木马的POST里的那个
刚开始在html文件夹里翻了半天flag在哪(受ctfhub影响),最后在根目录里找到了flag和readflag
打开flag发现是空的
再打开readflag,是一堆乱七八糟的
于是打开终端使用命令 ./readflag 执行文件得到flag
朴实无华
找不到什么注入点,sqlmap也无果,打开robots.txt看看发现了 /xxx.php
进去看看有一个假flag
按F12点网络看消息头,发现了look_at_me,进入/fl4g.php
全是php代码,审计一波,有三个部分,第一个num要<2020,+1后还要>2021,查一下,php,弱类型,十六进制,构造num=0x2019成功了
第2步要求md5加密前后相等,php把科学计数法0e后面全是数字的全当作0,Google到了这篇博客,piao过来一个md5=0e215962017
最后一步:!strstr…可知get_flag里不能有空格,即空格被过滤了,要绕过,有<>,${IFS},%09等姿势;再看str_ireplace这句可知get_flag里面的cat都会被换成wctf2020,又要绕过;再看有system是执行get_flag里的命令语句,所以先用ls看一下目录(不用加"")
cat用别的命令来代替,比如nl,tac等
Crypto
大数运算
我也只配拿这种水题的第一解了。。。
第一步在线算阶乘
前八位转16进制
第二步用电脑自带的计算器
搜索宇宙终极,这篇文章里有两种xyz,第一种试了下不对,第二种对了
算积分
情书
RSA算法,四位一组共八组,公钥2537和13,私钥2537和937,解出来iloveyou(也可根据“情书”盲猜诈胡)
B@se
base64的变种
可知变种表里缺了四位,分别是j,u,3,4,排列组合一波
写个python脚本,最后试出来34uj的顺序是对的
import base64
s1="JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs34ujkxyz012789+/"
s2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
base=b'MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD=='
flag=''
for i in base:
if chr(i) != '=':
index = s1.find(chr(i))
flag += s2[index]
else:
flag +='='
print(flag)
print(base64.b64decode(flag))
运行结果
d2N0ZjIwMjB7YmFzZTY0XzFzX3YzcnlfZUBzeV9hbmRfZnVOfQ==
b'wctf2020{base64_1s_v3ry_e@sy_and_fuN}'
babyrsa
又是RSA
GitHub上下载RsaCtfTool,根据n和e算出来PEM格式的公钥
再根据公钥算出来PEM格式的私钥
用在线ctf工具根据私钥解析出d
写个python脚本
from binascii import a2b_hex
c=28767758880940662779934612526152562406674613203406706867456395986985664083182
d=30854876581442056228588093398155288897790570329196285069001545119486056472273
n=73069886771625642807435783661014062604264768481735145873508846925735521695159
flag=a2b_hex(hex(pow(c,d,n))[2:])
print(flag)
运行结果
b'wctf2020{just_@_piece_0f_cak3}'
佛说:只能四天
根据提示“圣经分为《旧约全书》和《新约全书》”可知是新与佛论禅,Google一下在线工具,复制粘贴并在开头加上 佛曰: 参悟佛所言的真谛,解码出了核心价值观编码
在线ctf工具解码,根据结尾的doyouknowfense可知是栅栏密码
去掉结尾的doyouknowfense后在线解码,每组字数试到4出来了doyouknowCaesar可知是凯撒密码
在线凯撒解码(凯撒因为位移是3所以被叫作凯撒)
把得到的编码base解码,base64失败,base32成功了
Misc
Space Club
打开文件是个空的txt,Ctrl+A发现有好多有规律的空格
Google一下找到了一篇UUTCTF 2019的writeup(英文的,翻译一下)
把代码copy一下,路径改成自己的,并要在前面加上一个r(报错了,百度才知道的),否则不行
f = open(r"C:\Users\1\Desktop\space-1.txt", "r")
text = f.read()
to_hex = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]
space = 0
for c in text:
if c == ' ': space += 1
if c != ' ' and space > 0:
print(to_hex[space], end='')
space = 0
运行结果全是6和C
6CCC6CCC6CC666CC6CCC6C666CC66CC666CC66C666CC666666CC66C666CC66666CCCC6CC6CC6C66666CC66CC6CCC66C66CC66C6C6C6CCCCC66CC666C6CCC66CC6C6CCCCC6CCCC66C66CC66666CCC6C6C6CCC66C66C6CCCCC6CC66CC66CC6CC666C6666666CC66CCC6C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666CCCCC6C
盲猜一波是二进制,自己写个C++把6换成0,C换成1
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s="6CCC6CCC6CC666CC6CCC6C666CC66CC666CC66C666CC666666CC66C666CC66666CCCC6CC6CC6C66666CC66CC6CCC66C66CC66C6C6C6CCCCC66CC666C6CCC66CC6C6CCCCC6CCCC66C66CC66666CCC6C6C6CCC66C66C6CCCCC6CC66CC66CC6CC666C6666666CC66CCC6C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666C6CCCCC6CCC66CC66CC666C6CCCC6666CCCCC6C";
for(int i=0;i<s.size();i++)
{
if(s[i]=='6')
s[i]='0';
else
s[i]='1';
}
cout<<s;
return 0;
}
运行结果
在线二进制转字符串
Welcome
文件夹里的三个文件要一起,不能只把exe拿出来,丢到ida里也看不出来啥东西
题目说明
Google一下是第十二届全国大学生信息安全竞赛线上初赛的签到题,摄像头里要识别到三个人脸
就出来flag了
爬
下载下来是无后缀文件
丢到winhex里看一下在开头发现了PDF
把后缀加上.pdf就可以打开了
flag被图片覆盖住了,把图片拖开就看到了16进制字符串(不要转成word再拖),在线16进制转字符串即可
Find me
以为是图片隐写,winhex,binwalk都没啥线索
属性的详细信息里发现了八点式盲文,Google在线工具(千千秀字)解码即可,不要丢掉结尾的=,我刚开始以为没用,解不出来,白费了我几个小时搜别的工具
girlfriend
音频文件隐写
丢到Audacity里,刚开始以为是摩斯密码(长短),解出来不对,听一下像是电话按键音
Google在线Detect DTMF Tones上传wav解出来下面的这段数字,像是手机拼音九键键盘,解出来发现只有前半段,根据名字girfriend盲猜是youaremygirlfriend,再跟音频对比一下发现位数不对,最后有一个连续按四下的音,再看九键键盘推理出来最后一位加上个s
Shop
在kali linux里输入一下命令,再输入1,2多试试
Google一下找到了一篇英文的PicoCTF 2019 Writeup,里面有一道flag_shop,可知如果输入一个大数,就会溢出变成一个大负数
输入3579138,就有钱了,有钱就能买flag了,有钱真好
Reverse
Cr0ssFun
拖进ida里,把里面每一个函数都点开,再copy到自己的C++里,把&&,==等格式改一下输出a1就行了
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a1[100];
a1[0] = 119 ;
a1[6] = 50;
a1[22] = 115;
a1[31] = 110;
a1[12] = 95;
a1[7] = 48;
a1[16] = 95;
a1[11] = 112;
a1[23] = 101;
a1[30] = 117;
a1[10] = 112;
a1[13] = 64;
a1[3] = 102;
a1[26] = 114;
a1[20] = 101;
a1[1] = 99 ; a1[25] = 64; a1[27] = 101;
a1[4] = 50 ; a1[17] = 114 ; a1[29] = 102 ; a1[17] = 114 ; a1[24] = 95;
a1[2] = 116;
a1[9] = 99;
a1[32] = 125;
a1[19] = 118;
a1[5] = 48;
a1[14] = 110;
a1[15] = 100;
a1[8] = 123;
a1[18] = 51;
a1[28] = 95;
a1[21] = 114;
cout<<a1;
return 0;
}
运行结果
level1
根据output可知这些数都是输出的结果
拖进ida里看一下,把for循环里面的逆过来就行了
把output作为a[20]里的值,但是注意i是从1开始的,所以要给a[0]赋个值,把ld改成c,unsigned int改成char,<<改成>>,*改成/
#include<bits/stdc++.h>
using namespace std;
int main()
{
long a[20]={0,198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000};
for (int i = 1; i <= 19; ++i )
{
if ( i & 1 )
printf("%c", (char)(a[i] >> i));
else
printf("%c", (char)(a[i]/i));
}
return 0;
}
运行结果