#python #string
#python #строка
Вопрос:
Я пытаюсь написать код на python, который выполняет исполняемый файл C, используя следующую строку
os.system("./a.out "%s"" % payload)
где ./a.out — исполняемый файл на C, а полезная нагрузка — строка (без пробелов), указанная в качестве аргумента командной строки. (Ссылка такая. Я пытаюсь следовать примеру в разделе функции цепочки)
Теперь я написал другой код на C, но он принимает 3 аргумента командной строки. Поэтому моя строка должна быть arg[1] » » arg[2] » » payloadString .
(Код c преобразует arg [1] и arg [2] в целое число, чтобы использовать его в своих функциях). Вот фрагмент моего кода на python:
p = "10 " #arg[1]
p = "10 " #arg[2]
p = "string without spaces which I need as payload" #arg[3]
os.system("./a.out "%s"" % p)
где ./a.out — исполняемый файл моего кода на C, который принимает 3 аргумента командной строки. Когда я запускаю код python, я получаю ошибку:
Traceback (most recent call last):
File "this_file.py", line XX, in <module>
os.system("./a.out "%s"" % p)
TypeError: must be string without null bytes, not str
Кто-нибудь может мне помочь?
PS Я новичок в python. Похожие вопросы были в stack overflow, но я не уверен, как использовать их ответы для решения моей проблемы.
Комментарии:
1. Я советую вам использовать
subprocess
модуль вместо этого.2. Вам не нужно
os.system
этого делать. Использованиеsubprocess.call
:subprocess.call(['./a.out', p])
нет необходимости от чего-либо убегать. Также: сообщение об ошибке касается нулевых символов, тоесть не пробелов … вы уверены, что
p
вы используете именно тот, который вы нам показали?3. Вы уверены, что это именно та командная строка, которую вы используете? Из того, что я прочитал, эта ошибка может возникнуть, если у вас есть
где-то в командной строке.
Ответ №1:
Поместите an r
в os.system
вызов.
os.system(r"./a.out "%s"" % p)
Комментарии:
1. Та же ошибка (ошибка типа: должна быть строка без нулевых байтов, а не str) появляется снова.
Ответ №2:
Почему бы вам не использовать call для этой цели. Я думаю, это сделает работу, которую вы можете предоставить аргументы в примере списка:
from subprocess import call
call(["./a.out","10","10","string without spaces which I need as payload"])
здесь в вашем случае это эквивалентно
call(["./a.out",arg[0],arg[1],arg[2]])
Я думаю, это должно сработать
Комментарии:
1. Я выполнил этот вызов строки([«./a.out»,»10″,»10″, p]) где p — моя строка полезной нагрузки, я получил ошибку: TypeError: execv() аргумент 2 должен содержать только строки.
2. вы создали свою полезную нагрузку, используя три аргумента. Я уже передал ваши аргументы как элементы в списке. Вам нужно передать три аргумента как элементы в списке, как я это сделал. Или, может быть, в вашей программе c также может быть какое-то несоответствие типов. Пожалуйста, проверьте это один раз.
3. при использовании «call» я изменил свою строку p, чтобы не включать arg[1] и arg [2] . Я проверю свой код на C на наличие несоответствий.
4. Моя строка полезной нагрузки использовала метод struct.pack() . Это приводило к сообщению об ошибке «должно содержать только строки».