должна быть строкой без нулевых байтов или не может объединять строку str с байтами, передавая полезную нагрузку в командной строке.

Я пытаюсь создать эксплойт для упражнения, но у меня проблема со следующим кодом:

#!/usr/bin/python
import os
import struct
address = struct.pack("I",0x201014)
payload = address+"." + ".%x."*131 + ".%n."
os.system("/home/osboxes/Desktop/formatString " + payload)

Но ошибка в следующем: TypeError: аргумент system() 1 должен быть строкой без нулевых байтов, а не str

Я пытаюсь перейти на текущую версию Python с помощью утилиты подпроцесса:

#!/usr/bin/python3
import subprocess
import struct
address = struct.pack("I",0x201014)
payload = address+"." + ".%x."*131 + ".%n."
subprocess.call("/home/osboxes/Desktop/formatString " + payload, shell=True)

Но ошибка следующая: TypeError: can't concat str to bytes

Как я могу исправить проблему преобразования byte или str для обеих версий? обе программы сходятся во мнении, что ошибка именно в строке payload=...


person Michael    schedule 22.12.2020    source источник
comment
type(address) будет возвращать байты, а такие элементы, как ".%n.", ".%x." и ".%x."*131, будут возвращать строки. Вы смешиваете типы данных. /606191/конвертировать байты в строку)   -  person Richard W    schedule 22.12.2020
comment
Сообщение об ошибке означает точно то, что оно говорит. В Python 3 'something' — это строка Unicode, а не строка байтов. Только строки байтов без каких-либо NUL могут быть помещены в командные строки (строки Unicode должны быть закодированы, чтобы попасть туда).   -  person Charles Duffy    schedule 23.12.2020
comment
Кроме того, передача полезной нагрузки через оболочку — в высшей степени плохая идея, потому что, если вы не знаете, в какие символы она преобразуется, вы не можете сказать, какой вид манипуляций будет выполнять оболочка, прежде чем передать ее в программное обеспечение, которое вы пытаетесь вызвать. Используйте subprocess.call(['/path/to/formatString', payload]) со значением по умолчанию shell=False -- предварительно убедившись, что payload действительно является строкой байтов без NUL. (Если он действительно содержит значения NUL, вам нужно будет использовать их в качестве граничных точек между отдельными записями вектора аргументов).   -  person Charles Duffy    schedule 23.12.2020
comment
Кстати, создание шелл-кода, который не содержит никаких NUL, чтобы его можно было передать таким образом, само по себе является искусством. (Кроме того, если вы не отключили рандомизацию адресного пространства, я не уверен, как это должно работать... но это вопрос уязвимости formatString и того, как вы ее используете, а не вопрос, который вы задали о Python) .   -  person Charles Duffy    schedule 23.12.2020
comment
Я следую этому учебник для изучения, но кажется, что часть эксплойта устарела. Как я могу интегрировать его, чтобы он работал?   -  person Michael    schedule 23.12.2020


Ответы (1)


Эта строка не может быть передана в качестве аргумента командной строки в UNIX.

Почему? Потому что он содержит литералы NUL, а командные строки UNIX состоят из строк C, которые заканчиваются NUL.

>>> address = struct.pack("I",0x201014)
>>> address
b'\x14\x10 \x00'

Видишь этого \x00? Не разрешено, невозможно — по крайней мере, не в качестве одного аргумента командной строки.


Но вы можете поместить его в argv, если он разбит на несколько аргументов. Обратите внимание на shell=False ниже:

payload = (address + (b'.%x.' * 131) + b'.%n.').split(b'\0')
subprocess.call(['/home/osboxes/Desktop/formatString'] + payload)

Как это работает? Потому что \x00, которые заканчивают каждую отдельную строку C, неявно присутствуют в граничных точках.

person Charles Duffy    schedule 22.12.2020
comment
Большой! Он больше не показывает мне никаких ошибок, но не распознает аргумент полезной нагрузки. То есть двоичный файл formatString просит меня ввести строку для каждого экрана. Что может быть причиной этого? - person Michael; 23.12.2020
comment
Ах. Итак, они разработали этот учебник где-то, адрес, который они пытаются внедрить, не имел NUL, поэтому все это могло поместиться в одну строку C. Это не относится к адресу, который вы пытаетесь использовать здесь, так что... ну, это ваша проблема. По сути, суть в том, что данный эксплойт нельзя использовать здесь, поэтому вам нужен другой (и вы должны следовать другому руководству). Предложение такого руководства здесь не рассматривается (действительно, запросы внешних ресурсов явно отключены -тема). - person Charles Duffy; 23.12.2020