如何解决为什么将 exec() 函数推入 input() 时会出现 SytaxError
有一个 netcat
CTF 任务需要通过 RCE 获取标志(对我来说最简单和最明显的变体是 exec()
)
Python 2.7.18 (default,Apr 28 2021,17:39:59)
[GCC 10.2.1 20210110] on linux2
>>> print input()
pow(2,3) # No problems with functions
8
>>> print input()
None # Can print None values
None
>>> print input()
eval('1 + 1')
2
>>> print input()
eval('1 + 1') # eval() works
2
>>> x = 1
>>> print input()
eval('x + 1') # eval() with local variables involved also works
2
>>> print input()
exec('') # Even empty exec() causes an error
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "<string>",line 1
exec('') # Even empty exec() causes an error
^
SyntaxError: invalid Syntax
>>> print input()
exec('import os') # exec() call causes an error
Traceback (most recent call last):
File "<stdin>",line 1
exec('import os') # exec() call causes an error
^
SyntaxError: invalid Syntax
是否可以使用 Python 2.7 中调用的 exec()
推送 input()
? (无法切换 Python 版本或更改可执行文件 print input()
)
UPD
我需要这样的东西:
>>> print input()
exec('import os\nprint os.name') # I need a similar RCE in this CTF task,so eval() is not suitable
Traceback (most recent call last):
File "<stdin>",line 1
exec('import os\nprint os.name') # I need a similar RCE in this CTF task,so eval() is not suitable
^
SyntaxError: invalid Syntax
解决方法
代替
>>> print input()
exec('1 + 1')
做
>>> print input()
eval('1 + 1')
您将获得您期望的输出 2
。 exec()
需要可执行语句; eval()
需要一个表达式,这就是 1+1
的含义。虽然这更简单和等效:
>>> print input()
1 + 1
我必须承认我不知道 CTF 任务是什么,或者为什么它需要执行 RTE 代码,不管是什么,但考虑到您的真正要求不是产生 1 + 1
的结果,而是os.name
的值,它可能更适合您的目的,以避免在过时的 input()
函数的角落情况下进行模糊处理,而只是作为命令行执行,
python -c "import os;print(os.name)"
哪个(在我的系统上)产生输出
nt
并且适用于每个版本的 Python。
无法使 Python 2 input()
函数执行您想要的操作的原因是在 Python 2 中
-
exec
是一个语句,而不是一个函数。 -
input()
大致相当于eval(raw_input())
:它接受表达式但不接受语句。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。