У меня есть строка/аргумент, который я хотел бы передать программе на C. Это эксплойт строкового формата.
'\xb2\x33\02\x08%13x%2$n'
Тем не менее, кажется, что поведение будет другим, если я вызову программу C из Python, выполнив
subprocess.Popen(["env", "-i", "./practice", '\xb2\x33\02\x08%13x%2$n'])
против
./practice '\xb2\x33\02\x08%13x%2$n'
Разница в том, что атака с использованием строкового эксплойта работает, как и ожидалось, при вызове скрипта через подпроцесс, но не при вызове через CLI.
В чем может быть причина? Спасибо.
Страница руководства Bash говорит:
Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows: [snipped]
\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
Тогда не могли бы вы попробовать:
./practice $'\xb2\x33\02\x08%13x%2$n'
Тип терминала или характеристики стандартного вывода при другом запуске программы. Возможно, вам придется исследовать «псевдо-ttys».