本文最后更新于:2 年前
前言
由于本次比赛的初赛采用的是知识问答的形式,所以没有wp,特此说明。这是一篇迟到的wp,因为距离线上复赛已经过去了四个多月,线下决赛也是姗姗来迟,直到最近几天本人才拿到wp。未经本人授权,禁止转载和发布!
正文
Web
getshell
启动环境,拿到源码:
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
| <?php highlight_file(__FILE__); error_reporting(0); echo "<h1>WELCOME 23333333333</h1>"."\n"; $url = $_SERVER["HTTP_REFERER"]; $r = parse_url($url); if(!empty($r['host']) && $r['host'] === 'localhost' && $r['scheme'] === 'file'){ echo "yeah u are admin"."<br>"; } else{ die('u are not admin'."<br>"); }
$content = addslashes($_GET['content']); echo 'now_you_are_admin'."<br>"; if(!file_exists("admin.php")){ file_put_contents('admin.php', "secret = 'xxx'"); if($content){ $file = file_get_contents("./admin.php"); $file = preg_replace("/secret = '.*'/", "secret = '{$content}'", $file); file_put_contents('./admin.php', $file); } }
if (isset($_GET['reset'])){ @exec('/bin/rm -rf admin.php'); }
?>
|
源码分两部分,⼀是身份验证,⼆是写文件。
第⼀部分身份验证要求伪造admin身份,验证逻辑是通过检测Referer
请求头,要求使用file协议,地址是localhost。
第⼆部分写文件来上马,题目有addslashes
函数过滤,引号被转义不能使用,写⼊内容为<?php eval($_GET[1]);?>
,绕过引号:
访问admin.php
,GET传参进行任意代码执行。我采用的是POST传参,再用蚁剑连接,也能拿到flag。
tjjz
好家伙,没想到这个题目的名称就是考查的知识点,属实是没有反应过来。这题考查的是文件上传,加上了条件竞争。
测试发现环境不能覆盖已有的文件,且upload
目录下应该是存有.htaccess
文件,使得上传配置文件不可行。
burpsuite构造包爆破,通过上⼀题推测flag仍然在根目录的flag文件中,使用system('cat /f*')
进行简单测试:
调整线程为50,持续发包,再另开⼀重放包,设置10线程,⼀段时间后可以得到反馈:
拿到flag。
Reverse
crab
源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| _BYTE *__fastcall crab_0o0(_BYTE *a1) { _BYTE *v1; _BYTE *result; _BYTE *v3; _BYTE *v4; _BYTE *i;
v3 = a1; v4 = a1; do v1 = v4++; while ( *v1 ); for ( i = v4 - 2; ; --i ) { result = v3; if ( v3 >= i ) break; *v3 ^= *i; *i ^= *v3; *v3++ ^= *i; } return result; }
|
拿到密文:pWERzO3YjCldk:2NkGkc
由于异或可逆,这个可以不用逆向,直接用Python脚本跑一下:
1 2 3 4 5
| s='pWERzO3YjCldk:2NkGkc' enc=[ord(i) for i in s] for i in range(len(enc)): enc[i]-=1 print(bytes(enc))
|
再上C脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<stdio.h> #define _BYTE char int main(int argc,char **argv,char *envp[]) { char a1[]="oVDQyN2XiBkcj91MjFjb"; _BYTE *v1; _BYTE *v2; _BYTE *v3; _BYTE *i;
v2 = a1; v3 = a1; do v1 = v3++; while ( *v1 ); for ( i = v3 - 2; v2 < i; --i ) { *v2 ^= *i; *i ^= *v2; *v2++ ^= *i; } puts(a1); }
|
base64解码得到flag:
Misc
没有文件后缀
要不是看了wp,我都不知道这道题有原题,不愧是省赛啊(doge)。
出处是:https://blog.csdn.net/zz_Caleb/article/details/88601860
得到flag:CTF{131Ack_3Y3_gA1AxY}
Crypto
古典
签到题,很多队伍很早就解出来了。(我为什么那么菜,过了好久才做出来qwq)
打开发现是base编码,用在线工具⼀个⼀个试可知是base32编码:
synt是flag进行13位凯撒加密得到:
得到flag:flag{791ee565-afde-4772-89a7-6cddd6d0863f}
alice and bob
alice和bob是rsa出现的经典人物。附件里只有四个数字,合理推测是n和c,典型模不互素:大的是n,小的是c,e用65537试⼀下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from Crypto.Util.number import * c1 = 0xa30e64bef4373f1ffdb9f6e116643ccef2f1f5e2509ee3937b7c3af6b36b5ef532cfbdeda n1 = 0xe543df8c958aa57dbaea1ec39c192e5a8b26a64fbdcb3073ba388bc189fb645afd600b256 c2 = 0x3940203d1de79f980e30497847f25ca8562493310b2953570d435fa98bc7259ea119033c0 n2 = 0x9254d235f837be7093dadd7e89af96c43a919a0198b9e7f378a690fe8c655a42dffdaad9d q=GCD(n1,n2) print(isPrime(q))
p1=n1//q p2=n2//q print(isPrime(p1)) print(isPrime(p2)) e=65537 d1=inverse(e,(p1-1)*(q-1)) d2=inverse(e,(p2-1)*(q-1))
m1=pow(c1,d1,n1) m2=pow(c2,d2,n2)
print(long_to_bytes(m1)) print(long_to_bytes(m2))
PYTHON
|
果然是这样,最终得到的flag是:flag{real_man_wear_black_suit}