pyjail大逃亡
本文Yolo会将各个ctf比赛中的pyjail题目刷一遍,相信收获满满
本文找到的往届比赛中的题目大多来自这位的仓库
然后题目顺序基本上按照他的难度表格排的
由于刚开始,我们直接运行脚本进行解题好了,后面我会补充docker化过程
Olicyber2023
sandbox-v1
先审计代码
1 | #!/usr/bin/env python3 |
毕竟是第一次,我就写的特别详细些
RestrictedConsole(locals, blacklist).interact()
这个会启动一个交互式终端(你已经在沙箱咯
和我们常见的终端输入python,系统自动启动python官方的REPL(交互式解释器)有很大区别的

1 | blacklist = ['import', 'os', 'system', 'subproces', 'sh', 'flag'] |
黑名单,一旦我们写入的字符中出现关键词,会直接退出
我们常用的import os
不行,os.system()
不行,subprocess.Popen
不行,出现flag
也不行
1 | if not source.isascii(): |
编码检查,这里将那些Unicode字符绕过给限制了
1 | safe_builtins = {k:v for k,v in __builtins__.__dict__.items() if k != "open"} |
在locals中,这个__builtins__
仅仅去除了open
也就是说我们这会儿用不了open(“flag.txt”),但是eval,exec,dir,getattr,globals这样的函数能用到
综上,这份jail代码只是简单的黑名单过滤还有杀掉open
方法一
通过help()加more溢出
原理就是我们执行help()后,输入sys查看模块,返回的东西会非常多,这个时候系统就会默认用more进行读取,在more的命令中,我们能通过! <想执行的命令>来获取flag
方法二
既然open被禁用了,但我非要用怎么办?那就通过格式转换,不管base64还是hex,都能解决,这里的一个关键就是exec没有被ban
方法三
既然help()都能上,那么就来尝试下breakpoint()
同样可以成功
sandbox-v2
1 | #!/usr/bin/env python3 |
这次的内置函数限制的特别狠,只有一个白名单,是help(),这样处理当然没有问题
然后我觉得貌似没有其他绕过方法了,因为内置函数被ban完了,我们正常来说的流程就是通过内置函数结合没有被ban的关键字,通过组合实现读取flag的操作
说些什么吧!