2013-09-24 3 views
-2

Я пытаюсь преобразовать, чтобы получить выполненную команду, которая передается в оператор печати. Например:Преобразование строки в команду

print "exec(raw_input())" 

Могу ли я запустить exec() в некотором роде?

+1

Обратите внимание, что почти каждый ответ здесь отвечает на другой вопрос? Это означает, что ваш вопрос не совсем ясен *. – SethMMorton

+2

Кроме того, если вы используете безопасное кодирование, как предлагает ваше имя пользователя, строка 'exec (raw_input())', вероятно, является наименее безопасной, которую вы можете написать в python. – SethMMorton

ответ

0

Вы спрашиваете что-то простое, как

aString = "raw_input()" 
print "exec(" + aString + ")" 
exec(aString) 
1

сделать

command = raw_input("Command: ") 
exec(command) 

почему вы пытаетесь напечатать? быть более ясным, если это не будет то, что вы ищете

+0

Я пытаюсь запустить эксплойт в одну или две строки кода. Я хочу, чтобы команда выполнялась только с инструкциями печати. Можно ли это сделать? – securecoding

+0

ну, так как вы не можете распечатать вызов exec(), я не знаю, возможно ли его – Serial

0
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 
0

из тегов, применяемых, кажется, что вы ищете волшебную строку, которая позволит вам запускать любой произвольный код, когда Python передает эту строку в оператор print.

Нет таких известных строк. Вы можете попробовать очень длинные строки, просто над очевидными границами, ища традиционные случаи стека и кучи переполнения, но если вы найдете их в Python X.Y.Z, скорее всего, он уже был исправлен в X.Y.Z + 1.

Если скрипт Python на самом деле делает exec или eval на вашей строке, это, конечно, легко использовать; если он просто делает print, содержимое никогда не компилируется, а тем более работает; они просто простая старая струна. Тот факт, что строка имеет опасные вещи вроде exec, в этом не имеет значения; это не более удобно, чем получение Python для печати строки "rm -rf /".

Конечно, если вы можете организовать вывод одного интерпретатора Python для подачи в качестве интерактивного сеанса в другом интерпретаторе, то все, что вы получите, чтобы первый интерпретатор печатался, будет выполняться во втором ... но в В этом случае вам не нужен exec в середине строки.

0

Оператор печати записывает файл 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 
    > 
0

Я думаю, это то, что вы ищете?

>>> exec("x = raw_input()") 
23 
>>> x 
'23' 
>>> 
Смежные вопросы