Я пытаюсь запустить через переполнение буфера упражнений, вот код:Являются ли места расположения объектов измененными при запуске программы через GDB?
#include <stdio.h>
int badfunction() {
char buffer[8];
gets(buffer);
puts(buffer);
}
int cantrun() {
printf("This function cant run because it is never called");
}
int main() {
badfunction();
}
Это простой кусок кода. Целью является переполнение буфера в badfunction()
и переопределение адреса возврата с указанием адреса памяти функции cantrun()
.
Шаг 1: Найдите смещение обратного адреса (в данном случае это 12 байт, 8 для буфера и 4 для базового указателя).
Шаг 2: Найдите ячейку памяти cantrun()
, gdb скажите, что это 0x0804849a.
Когда я запускаю программу printf "%012x\x9a\x84\x04\x08" | ./vuln
, я получаю сообщение об ошибке «незаконная инструкция». Это говорит о том, что я правильно перезаписал EIP, но неправильное расположение памяти cantrun()
.
Я использую Kali Linux, Kernel 3.14, у меня отключена ASLR, и я использую execstack для создания исполняемого стека. Я делаю что-то неправильно?
UPDATE:
Как выстрел в темноте я пытался найти правильную инструкцию, перемещая адрес вокруг и 0x0804849b делает трюк. Почему это отличается от того, что показывает GDB. При запуске GDB 0x0804849a - это местоположение инструкции prelude push ebp
и 0x0804849b - инструкция prelude mov ebp,esp
.