0. 写在前面
Nep的一位师傅问我的一题,是NewStarCTF的一题沙箱pwn,总体难度不大。水一下证明我还活着……
1. 分析
先查保护和沙箱规则:
保护全开。
沙箱规则比较特殊,当sys_number大于0x40000000时是被允许的。 (真的不是BPF写错了吗?) 这给我们绕过提供了一个思路:sys_number+0x40000000。
拖入IDA进行静态分析:
漏洞函数的逻辑非常简单,给了一个空函数指针全局变量zone,由它指向的内存区域可以读入0x100字节,然后调用zone。
zone是由mmap开辟的一段有rwx权限的内存区域:
属于是很典型的写shellcode的题。
利用沙箱规则,用sys_number+0x40000000来绕过无法使用sys_open进行orw(我试过用execve的sys_number+0x40000000但失败了),同时注意到函数关闭了stdout,无法进行标准输出,所以需要进行重定向,利用sys_dup将stdout重定向到stderr,(也需要加上0x40000000绕过沙箱)shellcode如下:
1 | mov edi, 1 |
进行open的shellcode如下 (直接拿shellcraft的改的) :
1 | mov rax, 0x101010101010101 |
read和write的部分因为沙箱没有禁,所以用shellcraft生成的就行了。
2.exp
完整的exp如下:
1 | from pwn import * |
成功获取flag:
3.总结
相对算是入门级的沙箱题,可以考察shellcode的编写能力和沙箱绕过技术。