为什么将 exec() 函数推入 input() 时会出现 SytaxError

如何解决为什么将 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') 

您将获得您期望的输出 2exec() 需要可执行语句; 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?