题目自取:
链接:https://pan.baidu.com/s/1HrMqh-lX-mkfueVeLzoEJg
提取码:oyel
介绍下这可恶的沙箱机制
这是一道非常让人蛋疼的题目,之前我只听说过沙箱,但是并没有自己实际接触过沙箱这个保护机制,大概作用就是开了沙箱之后,会禁用掉某些函数,一旦我们使用了这个函数,比如我们在栈溢出构造ROP,或者写入shellcode执行时,只要含有这些函数,这个程序就会崩掉,这题目就开了沙箱。
之前我有个疑问,这里明明没有exevce函数的引用,为什么我用pwntools工具写的 shellcode = asm(shellcraft.sh())或者网上抄来的execve(binsh)都不能打通呢??
这非常让人恼火,难道seccomp-tools错了???
后来问了学长才知道,原来是因为seccomp-tools这玩意它会显出所有可以用的,但是貌似不能用的不会完全显现,所以我们这里可以看到,这里只允许了orw的使用,其实很明显了,就是要写orw的shellcode去把flag拿出来。
反编译看看
ok,我们开始,首先放到IDA看看咋回事
沙箱之前我们已经分析过了,这里就不细说了,就是主函数的思路也非常简单,就是拿一块内存buf,然后让你输入shellcode,然后判断长度,如果小于等于5字节,就执行shellcode,否则报错gameover。
显然5字节的shellcode玩个毛,几个基本的汇编指令就已经不止5字节了,很明显我们要绕过这个strlen检测,然后我在网上冲浪的时候发现了一个好文,这里贴一下
我想过绕过strlen函数,但是我都是在shellcode前面直接加\x00\x00的,发现这是行不通的,就很淦也让我产生疑问,这究竟是为什么呢??
我们来调试下
这是填入\x00\x00的情况
很明显它call了个寂寞,里面没指令,所以报错了
但是如果我们换成了 asm(
'xor eax,0x4141'
)
的话,我们可以看看啥情况。
可以看到,这个414135即为指令xor eax,0x4141,这就做到了两点,一是绕过了strlen检测,二是call rdx的时候是有指令的,不会导致程序崩溃.
那由于沙箱把我们的execve函数禁用了,所以我们用pwntools生成的 asm(shellcraft.sh())或者网上抄来的execve(binsh)都不能打通,因为它们本质上都是调用exevce函数。
所以我们只能用orw shellcode去拿flag了,这种shellcode虽然不能拿到shell,但是可以打开flag文件,然后输出里面的内容,具体咋写这种shellcode呢?我们还是可以利用pwntools自带的功能,这里推荐一篇博客(3条消息) orw_shellcode_模板_orw的shellcode_huzai9527的博客-CSDN博客
#pwntools
shellcode = ''
shellcode += shellcraft.open('./flag')
shellcode += shellcraft.read(3,'rsp',0x100)
shellcode += shellcraft.write(1,'rsp',0x100)
payload1 = asm(shellcode)
但是注意注意!!!这里不是'esp',而是‘rsp’,而且read的系统调用号是3,
修改一下就可以拿到shell啦