Использование переполнения буфера стека

Во-первых, с компьютера, на котором я запускаю это, находится система Intel под управлением Linux в 32-разрядном стеке. Мой профессор поставил перед нами непростой вопрос в классе.

Вот код, прежде чем я задаю вопрос

// funWithFooAndBar.c
#include <stdio.h> 
#include <stdlib.h> 

void bar() 
{ 
 printf("Now inside bar()!\n"); 
} 

void foo() 
{ 
 void *addr[1]; 

 printf("Now inside foo()!\n"); 
 // this is where I need to modify my code, 
 //I was given the hint that it will only be two lines of code 
 // So something like: 
addr[1] = bar;
addr[5] = addr[4];
addr[4] = bar;;

} 

int main (int argc, char *argv[]) 
{ 
 foo(); 
 printf("Back in main\n"); 
 return 0; 
} 
</stdlib.h></stdio.h>

Цель состоит в том, чтобы разбить стек, написав за пределами массива, и через это переписать обратный адрес, чтобы вызов функции foo() возвращался в bar() на обратном пути к основному. Поэтому мой вывод должен выглядеть так:

Теперь внутри foo()!

Теперь внутри bar()!

Назад в основной

Для этого мне нужно переполнить массив таким образом, чтобы адрес возврата был перезаписан адресом бара. Я уверен, что он должен будет включать адрес функциональной панели(), который будет приравниваться к & bar()

Вопрос, который он задал, состоял в том, что две строки кода мы могли бы добавить (где я прокомментировал), чтобы сделать вывод как показано выше.

Благодарю!

Редактирование: я надеялся получить больше объяснений, чем прямой ответ, я знаю, что я должен делать, а не как перевести это на c-код.

Изменение: сделал попытку

2 ответа

После прочтения статьи, связанной с RM:

addr [1] = bar;

addr [5] = addr [4];

addr [4] = bar;

Оказывается, чтобы работать.


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

Разбивание стека для удовольствия и прибыли

(Извините, я бы опубликовал это в комментариях, но я не могу комментировать.)

licensed under cc by-sa 3.0 with attribution.