Почему мы печатаем шелл-код с помощью python перед его выполнением?

#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 для печати).