2016-03-04 9 views
-1

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

Как написать сценарий оболочки для вставки кода в файл сборки, сгенерированный из исходного файла в C?

EDIT:

Это бумага, которую я пытаюсь реализовать. cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf Авторы упомянули, что они модифицировали двоичный файл, чтобы вставить защитные устройства, но это казалось жестким. Итак, я подумал об изменении кода сборки.

Вот шаблон охранник:

guard: 
     add ebp, -checksum 
     mov eax, client_addr 

for: 
     cmp eax, client_end 
     jg end 
     mov ebx, dword[eax] 
     add ebp, ebx 
     add eax, 4 
     jmp for 
end: 

где CLIENT_ADDR и client_end отмечают начало и конец кода для защиты соответственно.

Я понимаю, что мое понимание статьи не является полным, и я до сих пор неясно о различных проблемах, но я пытаюсь понять это.

Как я могу предоставить различные функции (для защиты) в качестве ввода в shellscript?

  1. Я могу назвать имя функции как строку.
  2. Я могу указать начальный и конечный адрес функций (найденных с помощью gdb).

Но после вставки контрольной суммы адреса изменились, поэтому я думаю, что дать название было бы лучшей идеей. Это так?

Я новичок в SO, и поэтому вам еще нужно много узнать о правильных способах публикации вопроса. Но спасибо за помощь и руководство.

+0

Если _checksum guard_ вы хотите защитить функцию от переполнения стека, тогда это обычно называют _stack canary_. Пример реализации (для C) [здесь] (http://security.stackexchange.com/questions/37547/how-to-implement-canaries-to-prevent-buffer-overflows). –

+0

Вы описали задачу, вы не задали вопрос. Вам нужно вернуться к тем, кто дал вам эту задачу. И бросить ему вызов, так как заявил, что это та функция, которая * может звучать разумно для управленческих ушей. Это не. Спросить «что вы имеете в виду» - это ваша работа, а не наша. –

+0

Вы имеете в виду gcc-вставки, когда используете '-fstack-protector-strong'? Это просто пишет и читает контрольное значение; он ничего не проверяет. Что именно вы проверяете/CRCing/hashing? –

ответ

-1

Выполнение этого автоматически может стать настоящим вызовом, хотя я думаю, что это невозможно.

В структурированных языках относительно легко узнать (например, путем разбора и подсчета фигурных скобок в C), где функция запускается или заканчивается, таким образом, где должна быть вставлена ​​функция пролога и эпилога.

В ассемблере это невозможно. Метка не обязательно является началом функции, а «ret» необязательно является концом.

Лучше всего создать собственные макросы для пролога и эпилога и вставить их вручную.

Некоторое слабое намека на ваш вопрос заставляет меня думать, что код ассемблера, с которым вы работаете, может, вероятно, быть сгенерирован из компилятора C. В этом случае на самом деле это может быть возможно, проанализировав испущенный код asm, можете ли вы повторно построить C.

EDIT после некоторых уточнений:

Я не совсем понимаю, почему это должно быть сделано в ассемблере и почему это должно быть сделано, чтобы ап.asm-файл, созданный после компиляции - C будет делать все, и куски (простого) кода защиты могут быть просто введены макросом (может, вероятно, использовать встроенную сборку). В общем, если вы сделаете это в оригинальных источниках, это будет проще. И для получения источников asm, созданных компилятором, вам также нужен доступ к источникам C (или любого другого).

В другом комментарии вы говорите: «Они изменяют сам бинар и добавляют охранников». - Вставка чего-то в двоичная программа - довольно сложная задача: вы перемещаете код на более высокие адреса и должны сначала найти всех вызывающих абонентов этого фрагмента кода, а затем настроить адреса. Даже разработчики вирусов не делают этого :). Они заменяют часть существующего кода инструкциями jsr на «рюкзак», который помещается в конец двоичного файла. Я думаю, что фотографии в связанной бумаге немного вводят в заблуждение.

+0

Да, код, который должен быть защищен, является кодом C. Я внесла некоторые изменения в этот вопрос. Не могли бы вы взглянуть на него? У меня есть это сомнение относительно того, как я могу взять ввод (для моего сценария оболочки) функции для защиты? – ak0817

+0

Я упомянул документ, который я пытаюсь реализовать в вопросе. Они изменяют сам бинар и добавляют охранников. Не делает это в сборке проще? – ak0817

+0

Можете ли вы предложить, какой метод обфускации я должен использовать, чтобы предотвратить, чтобы мой шаблон защиты был легко узнаваем для злоумышленника, который разобрал двоичный файл? – ak0817

Смежные вопросы