第二届“湖北省大学生信创大赛”复赛Write-up

本文最后更新于:7 个月前

前言

由于本次比赛的初赛采用的是知识问答的形式,所以没有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>");
}

//only admin can do it
$content = addslashes($_GET['content']);
echo 'now_you_are_admin'."<br>";
if(!file_exists("admin.php")){
file_put_contents('admin.php', "secret = 'xxx'");
//change the content
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*')进行简单测试:

web-2

调整线程为50,持续发包,再另开⼀重放包,设置10线程,⼀段时间后可以得到反馈:

web-3

拿到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; // rax
_BYTE *result; // rax
_BYTE *v3; // [rsp+0h] [rbp-18h]
_BYTE *v4; // [rsp+10h] [rbp-8h]
_BYTE *i; // [rsp+10h] [rbp-8h]

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)) # b'oVDQyN2XiBkcj91MjFjb'

再上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; // rax
_BYTE *v2; // [rsp+0h] [rbp-18h]
_BYTE *v3; // [rsp+10h] [rbp-8h]
_BYTE *i; // [rsp+10h] [rbp-8h]

v2 = a1;
v3 = a1;
do
v1 = v3++;
while ( *v1 );
for ( i = v3 - 2; v2 < i; --i )
{
*v2 ^= *i;
*i ^= *v2;
*v2++ ^= *i;
}
puts(a1);
//bjFjM19jckBiX2NyQDVo
}

base64解码得到flag:

re

Misc

没有文件后缀

要不是看了wp,我都不知道这道题有原题,不愧是省赛啊(doge)。

出处是:https://blog.csdn.net/zz_Caleb/article/details/88601860

得到flag:CTF{131Ack_3Y3_gA1AxY}

Crypto

古典

签到题,很多队伍很早就解出来了。(我为什么那么菜,过了好久才做出来qwq)

打开发现是base编码,用在线工具⼀个⼀个试可知是base32编码:

cry-1

synt是flag进行13位凯撒加密得到:

cry-2

得到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}


第二届“湖北省大学生信创大赛”复赛Write-up
https://rookieterry.github.io/2023/03/07/第二届“湖北省大学生信创大赛“复赛Write-up/
作者
HackerTerry
发布于
星期二, 三月 7日 2023, 9:02 晚上
许可协议