DASCTF2024八月开学季 - alphacode
文件属性
属性 | 值 |
---|---|
Arch | amd64 |
RELRO | full |
Canary | on |
NX | on |
PIE | on |
strip | yes |
seccomp rules
解题思路
一道shellcode题,限制了字符必须是[0-9a-zA-Z]
,可以输入0x53
个字符。
程序没有显式引用libseccomp
,但是自己手搓了一个,并在运行shellcode前应用。
程序不允许直接使用read
,同时限制了参数只能是0/1,后面还关闭了标准输入流,
对重新读入shellcode造成了很大困扰,遂尝试一次发送打orw。
程序在运行shellcode前还插入了一段额外的shellcode,清空了除了rsp以外寄存器的数据。
由于read
被禁用,open+read+write
的shellcode会变得很长,
因此可以考虑使用sendfile
系统调用,当off
设为NULL
时,偏移会随读取自动更新。
因此重复调用sendfile(1, fd, NULL, 1)
就可以逐字节输出flag。显然,
syscall
不在允许的字符范围内,因此可以异或来绕过限制。但是,为了重复调用,
需要使用jmp -?
,而产生的shellcode都大于0x7f
,因此要想异或解密,需要让eax产生大于0x7f
的字节。
我使用了IMUL r32, [m32], i8
来产生这些字节,然后再异或一次得到jmp -9
的shellcode。
值得注意的是,由于之前把标准输入关闭了,新打开的文件fd取代标准输入成为了0
,
没有碰到seccomp限制。
官方题解中异或解码出ADD
来凑大于0x7f
的字节,没有使用处于范围内的IMUL
EXPLOIT
1 | from pwn import * |
纯真 师傅出的题,上来直接开做,很快啊!直接拿下唯一解,就是花了太多时间, 错过了 clock ,要不然还能得1000分
- 标题: DASCTF2024八月开学季 - alphacode
- 作者: RocketDev
- 创建于 : 2024-09-05 00:12:00
- 更新于 : 2024-09-27 00:12:00
- 链接: https://rocketmadev.github.io/2024/09/04/alphacode/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论