Я пытаюсь реализовать атаку переполнения буфера, и мне нужно знать адрес моего буфера, который я пытаюсь переполнить.gdb, отображающий другой адрес, чем в коде
адрес, который отображается с помощью GDB отличается, чем если бы я просто сделал это в коде:
Точный код:
#include<stdio.h>
int main() {
char buffer[20];
printf("%p\n", buffer); // 0xbffff320
return 0;
}
Однако в БГД, если я:
p &buffer
Я получаю: 0xbffff330
Почему есть разница, и это испортит моя переполнение буфера переполнения?
У меня есть ALSR и защита стека отключена.
Спасибо.
EDIT 1: Даже когда я пошагово БГД и он встречает линию печати, я получаю 0xbffff320 как адрес
EDIT 2:
Окружающая среда: Ubuntu Linux 9 образ работы в виртуальном окне на окнах 7 .
GDB версии: 6,8-Debian
Составлено с использованием GCC, таких как: gcc -g -fno-stack-protector filename.c
выполнить сразу: ./a.out
адрес печать изд: 0xbffff320
Затем открыть в отладчике, как это: gdb ./a.out
введите b main
затем run
затем p &buffer
Тогда адрес 0xbffff330
Edit 3:
Это журнал GDB для воспроизводство:
$ gdb ./a.out
б главного
выполнения
р & буфер/* адрес здесь отличается от того, что отображается, если я запускаю исполняемый */
пошагово программы PRINTF о/* адрес здесь же как p & буфер, но отличается от того, что напечатано при запуске программы */
Вы имеете в виду, что во время одного и того же запуска в формате gdb printf и gdb выводит разные значения? – hdl
Опираясь на _undefined behaviour_ - неплохая идея.Во всяком случае, я не думаю, что SO должно помочь использовать уязвимости. – Olaf
@ Hdl, правильно. Они печатают разные значения. В том же компиляции и исполнении. – Kingamere