Так, грубый подход:
buffer
находится в стеке, где обратный адрес main function
-callee находится. В связи с тем, что стеки растут в обратном направлении, вы можете перезаписать обратный адрес, так как он был добавлен ранее. Стек должен выглядеть следующим образом:
[buffer data][ebp save][callee return address]...anything
Это не совсем уверен, но вполне вероятно, что обратный адрес вызываемого абонента находится после ebp
сохраненного значения, который расположен после буфера данных, так что вам нужно будет дать массив длиной в 84 байта (не содержащий 0x00
, потому что это прекратит строку), за которым следует обратный адрес. Адрес должен указывать где-то, где ваш «хак» находится в памяти. Одним из возможных мест для этого может быть сам стек, поэтому вы можете захотеть добавить машинный код бесконечного цикла после обратного адреса.
Важно отметить, что вам необходимо сгенерировать машинный код, который не содержит нулевой байт. Пример компоновки строки аргумента, что вы можете дать программе должен выглядеть следующим образом:
[84 byte data][return address][machine code]
Это должно работать на старых Linux ядра. Кроме того, предполагается, что вы работаете с 32-разрядной системой, поэтому указатели имеют длину 4 байта. В 64-битной системе это будет 8 байтов.
Разве это не вопрос вашей домашней работы, чтобы узнать, как это сделать? –
Когда вы говорите, что ваша цель - «бесконечная петля», что это значит? Какая часть кода вам нужна в бесконечном цикле? В любом случае 'while (1)', вероятно, самый простой способ сделать это. –
Кроме того, почему вы 'возвращаете 1'? Необязательный код выхода указывает, что программа завершена с ошибкой. –