2010-11-03 2 views
1

Существует двоичный файл, над которым я работаю. Он имеет функцию с адресом, начинающимся с 123. Мне нужно, чтобы мой код выполнял эту функцию.Атака на стек

Двоичный файл принимает байтовый массив размера 'n' и не проверяет границы. Вся задача состоит в том, чтобы переполнить буфер и вызвать плохие вещи.

Опять же, задача - вызвать адрес 123 и заставить его выполнить. У меня сложилось впечатление, что если размер буфера равен, скажем, «4», и я пропускаю 9 символов .., 5 символов будут помещены в стек и выполнены. (это правда?)

Кроме того, для того, чтобы я мог обратиться к адресу, который будет выполнен, я хотел бы сказать «звонок 123». Из того, что я понимаю, «вызов» - «e8», нет?

Эта проблема немного запутанна для меня. Если кто-то может помочь мне лучше понять это, я бы очень ценю это

(Да, это домашнее задание вопрос)

+0

0xE8 - относительный вызов, и вам нужно позвонить по абсолютному адресу. И стек обычно «плавающий». – ruslik

+3

Мне жаль, что у нас не было таких домашних заданий. – ruslik

+0

Просто немного любопытства. Я бы подумал, что класс безопасности, подобный этому, будет иметь предварительное условие для ассемблера. Что происходит? –

ответ

4

Я настоятельно рекомендую вам прочитать Smashing the Stack for Fun and Profit. Он подробно описывает шаги, которые вам нужно сделать для этого.

1

Стек не содержит кода, но содержит адрес возврата для функции. Типичная структура стека:

<stack data> <old frame pointer> <return address> 

<old frame pointer> опускается иногда и я думаю, что было бы для этого, так что все, что вы должны предоставить это данные для заполнения массива затем 123.

+0

+1 для упоминания обратного адреса в стеке. – casablanca

0

Общая стратегия состоит в том, чтобы найти код операции call ESP по фиксированному адресу памяти и перезаписать обратный адрес с этим адресом. Таким образом, выполнение будет продолжено в стеке. Он будет работать, если не активирован DEP (или поддерживается).

В вашем случае вы также можете найти abs_jump 123 в памяти.

EDIT: @Loren Он будет работать только в том случае, если стек может быть выполнен. call esp имеет только два байта кода операции, поэтому существует большая вероятность найти его где-то в памяти. Второй подход не выполняет код из стека, но требует 5-байтовый код операции, который вряд ли будет найден.

+0

Или укажите его как часть данных, которые вы используете, чтобы разбить стек. –

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