Ошибка типа: должна быть строка без нулевых байтов, а не str в os.system()

#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() . Это приводило к сообщению об ошибке «должно содержать только строки».