проверьте, включен ли PIE в python - PullRequest
0 голосов
/ 26 ноября 2018

Здесь со вчерашнего дня я смотрю, как определить, активирована ли защита "ПИРОГ".Для этого я проанализировал вывод записей о перемещении, чтобы увидеть, присутствует ли _ITM_deregisterTMClone или нет.Есть ли лучший способ обнаружить PIE без прохождения вывода readelf?

Вот что у меня сейчас есть:

def display_pie(counter):
    if (counter == 1):
            print("Pie : Enable")
    else:
            print("Pie: No PIE")

def check_file_pie(data_file):
    data = []
    data2 = []
    result = []
    ctn = 0
    check = subprocess.Popen(["readelf", "-r", data_file],
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
    result = check.stdout.readlines()
    for x in result:
        data.append(list(x))
    for lines in data:
            data2.append("".join(map(chr, lines)))
    for new_lines in data2:
            if "_ITM_deregisterTMClone" in new_lines:
                    ctn += 1
    display_pie(ctn)

Спасибо, это довольно технически, так что если кто-то может объяснить мне лучшеспособ проверить исполняемую независимую позицию, мне интересно!

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы можете использовать pyelftools , чтобы проверить, является ли ELF общим объектом и имеет ли базовый адрес изображения ноль:

def is_pie(filename):
    from elftools.elf.elffile import ELFFile
    with open(filename, 'rb') as file:
        elffile = ELFFile(file)
        base_address = next(seg for seg in elffile.iter_segments() if seg['p_type'] == "PT_LOAD")['p_vaddr']
        return elffile.elftype == 'DYN' and base_address == 0
0 голосов
/ 26 ноября 2018

Вы можете использовать pwntools , который имеет функциональность для работы с файлами ELF .Пример использования:

>>> from pwn import *
>>> e = ELF('your-elf-file')
>>> e.pie
True

Если вы хотите узнать, как это реализовано, вы можете найти исходный код здесь .

...