2015-02-17 2 views
1

Я пытаюсь запустить через переполнение буфера упражнений, вот код:Являются ли места расположения объектов измененными при запуске программы через 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.

ответ

2

gdb не делает ничего, чтобы изменить расположение функций в программах, которые он выполняет. ASLR может иметь значение, но по умолчанию gdb отключает эту функцию, чтобы упростить отладку.

Трудно сказать, почему вы видите результаты, которые вы есть. Что делает демонстрация функции в gdb?