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://rocketma.dev/2024/09/04/alphacode/
 - 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 
        评论