菜狗工具
工具1#
学长提醒 SSTI 注入,可以直接执行shell命令,cat就出来了
工具2#
hint1: not_flag 里的内容不是考点!
hint2: poster.jpg 观察并思考
![[image-20240425114907488.jpeg]]
cat not_flag显示CHROOT JAIL,出题人表示不是考点- 尝试
__globals__['flag']和__globals__.get('flag') - 找到拿到其他模块的
__builtins__的办法,然后黑名单问题解决了 - 整半天没整出来,尝试一些shell命令,比如
find,失败 - 歪个路,尝试
from importlib import reload,没啥用 - 尝试获取python源码,
get_source失败 - 开始查看字节码
dis.dis(module_name, file=i),获取到./app.py的字节码,找不到flag,本地调试之后,发现全局变量并不会直接到字节码中(后续:直接这样传入并不会给出完全的字节码) - 发现重新把整个文件导入,然后
compile编译(成Code Object)再dis.dis,就有全局变量了,所以得想办法找到整个文件的Code Object - 找到
StackOverflow的资料,直接dis.dis出来的字节码是不包含最外层的代码的,要用frame.f_back逐层返回,直到最顶层 - 通过遍历
frame.f_back,可以打印出堆栈,发现最顶层的是threading,说明不是主线程 - 打印出主线程
threading.enumerate()[0],然后按照StackOverflow给出的frame = sys._current_frames().get(main_thread.ident, None)就可以获取到主线程的frame - 主线程最顶层的
frame就是./app.py,此时dis.dis就可以拿到frame