Я пытаюсь преобразовать, чтобы получить выполненную команду, которая передается в оператор печати. Например:Преобразование строки в команду
print "exec(raw_input())"
Могу ли я запустить exec() в некотором роде?
Я пытаюсь преобразовать, чтобы получить выполненную команду, которая передается в оператор печати. Например:Преобразование строки в команду
print "exec(raw_input())"
Могу ли я запустить exec() в некотором роде?
Вы спрашиваете что-то простое, как
aString = "raw_input()"
print "exec(" + aString + ")"
exec(aString)
сделать
command = raw_input("Command: ")
exec(command)
почему вы пытаетесь напечатать? быть более ясным, если это не будет то, что вы ищете
Я пытаюсь запустить эксплойт в одну или две строки кода. Я хочу, чтобы команда выполнялась только с инструкциями печати. Можно ли это сделать? – securecoding
ну, так как вы не можете распечатать вызов exec(), я не знаю, возможно ли его – Serial
from __future__ import print_function
def foo(x):
exec x
print = foo
print("exec(raw_input())")
Бег
% test.py
kaboom
результаты:
NameError: name 'kaboom' is not defined
из тегов, применяемых, кажется, что вы ищете волшебную строку, которая позволит вам запускать любой произвольный код, когда Python передает эту строку в оператор print
.
Нет таких известных строк. Вы можете попробовать очень длинные строки, просто над очевидными границами, ища традиционные случаи стека и кучи переполнения, но если вы найдете их в Python X.Y.Z, скорее всего, он уже был исправлен в X.Y.Z + 1.
Если скрипт Python на самом деле делает exec
или eval
на вашей строке, это, конечно, легко использовать; если он просто делает print
, содержимое никогда не компилируется, а тем более работает; они просто простая старая струна. Тот факт, что строка имеет опасные вещи вроде exec
, в этом не имеет значения; это не более удобно, чем получение Python для печати строки "rm -rf /"
.
Конечно, если вы можете организовать вывод одного интерпретатора Python для подачи в качестве интерактивного сеанса в другом интерпретаторе, то все, что вы получите, чтобы первый интерпретатор печатался, будет выполняться во втором ... но в В этом случае вам не нужен exec
в середине строки.
Оператор печати записывает файл sys.stdout по умолчанию, а файл sys.stdout похож на файл. Вы можете создать класс, который выглядит как файл, с помощью метода напишите, который вызывается оператором print. Я собрал сценарий, демонстрирующий это, print_exec.py. Также обратите внимание: это не работает, если код в заявлении печати содержит печать, сам. то есть print "print 'foo'"
не будет работать. Итак, в этом примере мне пришлось распечатать файл sys.stderr, чтобы увидеть что-то происходящее. Надеюсь это поможет.
print_exec.py
import sys
class file_like(object):
def write(self, x):
exec(x)
sys.stdout = file_like()
y = "exec(raw_input())"
print "exec(y)"
Пример запуска print_exec.py:
>python print_exec.py
print "import sys; print >> sys.stderr, 'hi'"
hi
>
Я думаю, это то, что вы ищете?
>>> exec("x = raw_input()")
23
>>> x
'23'
>>>
Обратите внимание, что почти каждый ответ здесь отвечает на другой вопрос? Это означает, что ваш вопрос не совсем ясен *. – SethMMorton
Кроме того, если вы используете безопасное кодирование, как предлагает ваше имя пользователя, строка 'exec (raw_input())', вероятно, является наименее безопасной, которую вы можете написать в python. – SethMMorton