总而言之,我就觉得这次主办方的想法很有问题。尤其是最后在所有选手在场等了一个下午的情况下,没有给参赛队颁奖的环节,反而给什么优秀支撑单位、技术委员会颁了奖。这也是我第一次见过这样的设计,比赛在北京打,颁奖隔两天去武汉颁,谁有精力陪你折腾,而且没有任何通知,真的是mdzz。
//以上戾气有点大,这次比赛还是学了很多东西的,内容有点短,就当我水了一篇吧,实在是有的东西不想说了。
我们队分了一道CNSS战队plusls师傅出的一道PWN题,其中有一个seccomp沙箱,里面的逻辑是这样的。
看起来,没有什么问题,主要限制了open系列的系统调用,限制了这个以后,shell也没法起了。
比赛时,没有想到如何过这个限制。第一天打完了以后和plusls师傅交流了一下,感觉是个挺有意思的东西。
首先,线上赛那个题目逻辑挺复杂的,利用seccomp-tools简单复现了一下逻辑。
sandbox.asm
1 | A = arch |
将沙箱逻辑使用seccomp-tools编译,将其转换为数组:
1 | ┌─[p4nda@p4nda-virtual-machine] - [~/Desktop/pwn/test/x32 abi] - [五 7月 27, 16:00] |
然后就可以编写程序逻辑了,这里我使用一个简化的demo,直接开沙箱执行shellcode:
1 |
|
此时,可以发现程序无法打开文件。
利用赛后交流时提到的X32 ABI,我后来搜索了一下,比较早出现这个东西的是BCTF的一道PWN题,和这个类似。看了一下发现这个东西方法是一个系统调用的两个调用号,官方的说法是0x40000000置了一个标准位。
然后,利用这一点,在调用open时,使用0x40000002,这个调用号就可以绕过沙箱,读出flag了。
1 | from pwn import * |
参考:
https://sites.google.com/site/x32abi/
https://blog.csdn.net/qq_29343201/article/details/72627528
https://github.com/david942j/seccomp-tools
https://veritas501.space/2018/05/05/seccomp%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
最后附上PPT