Bootstrap

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;
}

运行结果
在这里插入图片描述

;