论坛首页 漏洞分析研究区 阅读主题

[原创]2025 磐石行动-线下AWD-PWN

200 浏览 2 回复
#1 楼主 2026-06-01 21:09:20
人生中第一次正式的线下比赛,也是第一场AWD比赛.rank8完赛,对于我来说已经很满足了.第一次参赛,一开始不是很会操作导致浪费了几轮攻击积机会,后来慢慢适应了比赛模式一路冲榜本次两道web和两道pwn,我们的排名几乎都是靠pwn打的官方会给每个队伍提供一个路由器用于连接本队专属的服务器,pwn和web服务被部署在服务器中.队内的人都可以通过ssh连接服务器并修改文件(pwn的服务固定放置在9999端口,web不清楚)每轮主办方都会对pwn和web服务进行check:检测服务是否正常运行,所以我们不能对文件进行"魔改",如果哪个字符串回显失败/流程卡住了,主办方就会判断你没有正常防御,会对你进行大量扣分的操作如果实在修不好服务,可以选择让本队的服务器下线(down),这样虽然过不了check会扣分,但是其他队伍也无法通过攻击你的服务获得flag我们要在修补elf的同时对其他队伍的服务器进行攻击,并提交flag得分.每10分钟主办方会刷新一次flag,所以每十分钟就要跑一次攻击脚本,但是patch好的文件会一直存在.所以合适的流程是:由于队伍比较多,每次获得的flag最好使用post报文提交. 在init中先开辟了一片rwx空间0x111000
然后进入菜单
其中trick选项可以看出题目的预期是让用户输入0x100的可见字符shellcode,复制到0x111000处并执行
如果shellode不处于可见字符便会报错并返回.这里边出现了第一个漏洞点,shellcode的长度使用strlen检测
当然,使用ae64库对shellcode进行转化也是可以的在treat选项中,我们会发现这里的v2是个int且未进行检查,dword_40B0是个全局变量我们可以通过简单的计算,修改位于dword_40B0低地址处的got表:在got表减去任意的数值这样做我们就可以直接修改函数的地址当我们输入的v2为-4,-5,-6时,可以对fgets,strlen,printf的got表进行修改
如果我们将strlen修改为system,再在trick中输入"/bin/sh"或"cat /flag/flag"便可以getshell/flag关于fgets.got和printf.got的利用比较困难,如果写入one_gadget会发现寄存器总是调整不对本道题由于属于栈相关,我使用了evilPatcher为程序增加了open,openat,fstat,execve,mmap和execveat的沙箱,这样任意代码执行无论如何也无法get flag(我认为是这道题最全面的防御)github中的evilpatcher项目将沙箱规则设置如下通过checksec发现这道题的保护非常少在main函数中可以看出是个菜单其中send函数要求我们输入IP+port,并可以输入0x500字节的数据最终整个IP+PORT+CONTXT结构体被保存在全局变量msgHistory中在receive中可以看到发现context被无检查地memcpy到了dest中
且dest缓冲区远小于0x500,此处我们有一个非常大的栈溢出可以使用
我们可以选择ret2libc,也可以使用magic_gadget一次打完将printf的got表修改为one_gadget并调用printf触发execve在选项4的connMngr中,我们可以看到二级菜单在delet中,我们发现存在明显的uaf漏洞
在edit中new_lenth由我们自己传入数字,可以任意长度堆溢出
uaf和堆溢出均可以单独写成利用脚本,我现场比较慌张,于是结合这两个漏洞写了个比较复杂的脚本可以将memcpy的第三个参数
通过gdb调试可以发现,设置rdx时

如果我们将设置rdx的汇编修改为mov rdx,r8就可以防止栈溢出了同理使用gdb调试查看堆溢出发生时的寄存器帧

发现r8和r9内的数字很小,不存在溢出的风险
所以将此处修改为mov rdx,r8就可以直接将free给nop掉buf = 0LL;

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288231.htm
#2 2026-06-01 21:09:20
建议所有标题都大一个字号,分一级标题,二级标题,三级标题。希望可以重新修改一下,方便读者阅读,谢谢。
#3 2026-06-01 21:09:20
已经修改

请登录后参与讨论

立即登录 注册账号