Почему существует разница между печатью экранированных шестнадцатеричных символов, встроенных в терминале, и программой, выполняющей терминал? - PullRequest
1 голос
/ 14 апреля 2019

Я пытался отправить строку в другое приложение, работающее на сервере (к которому у меня нет доступа). Строка содержит нулевые символы. Теперь я заметил, что когда я запускаю следующий код в скрипте,

print('abc\x00\x91\x11\x01123')

вывод: abc \ x00 \ x91 \ x11123.

Пытался, когда я запускаю тот же код в терминале:

python -c 'print("abc\x00\x91\x11\x01123")'

Я получаю в качестве вывода: abc 123

Какой желаемый результат в моем случае. Почему оба выхода отличаются? Как получить второй вывод при запуске функции печати в скрипте?

EDIT: Я понял, в чем причина разницы. pwntools вызвал такое поведение. Но я до сих пор не могу понять, почему. Следующий код:

#!/usr/env/python
import pwn

print('abc\x00\x91\x11\x01123')

результат в

а \ x00 \ x91 \ x11123

Когда я не импортирую pwn, результат будет таким, как ожидалось: абв123.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Я надеюсь, что это квалифицируется как ответ в стандартах переполнения стека.

Если вы играете с гранатой, угощение похоже на гранату, а не на игрушку. Инструменты PWN кажутся инструментами-сценаристами для эксплуатации. Если вы прочитаете первые несколько параграфов документации, вы найдете следующее:

Как уже говорилось, мы также хотели бы иметь возможность получить множество этих побочных эффектов по умолчанию. Это цель этого модуля. Это делает следующее:

[...] Вызывает pwnlib.term.init (), чтобы перевести ваш терминал в режим raw и реализует функциональность, чтобы он выглядел так, как будто это не так.

Вы были предупреждены, однако у вас нет RTFM. ?

0 голосов
/ 14 апреля 2019

На самом деле нет никакой разницы. Ваша проблема в другом, но не в разнице интерпретации между терминалом и скриптом.

Вот вывод, который у меня есть локально для вашегопример:

[cecile@CC-PC ~]$ python
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('abc\x00\x91\x11\x01123')
abc_123
>>>
[cecile@CC-PC ~]$ python -c 'print("abc\x00\x91\x11\x01123")'
abc_123

На этом компьютере непечатаемые символы, кажется, заменены на _, но суть в том, что, как вы можете видеть, результат в интерпретаторе и втерминал.

...