Используя следующий код для печати ESP регистрации:Два процесса с одним указателем стека. Зачем?
#include <stdio.h>
#include <stdlib.h>
unsigned long get_sp() {
__asm__("movl %esp, %eax");
}
int main() {
sleep(5);
printf("Stack pointer (ESP): 0x%x\n", get_sp());
return 0;
}
Отключить ASLR
echo "0" > /proc/sys/kernel/randomize_va_space
Телосложение:
gcc get_sp.c -o get_sp
Выполнить два процесса:
./get_sp & ./get_sp
Я получаю:
Stack pointer (ESP): 0xbffff158
Stack pointer (ESP): 0xbffff158
Я ожидал разные адреса. Может кто-нибудь пролить некоторый свет на это? Это потому, что это адреса виртуальной памяти, а под капотом Linux отслеживает память за процесс и правильно отображает главную память?
Благодаря
Это потому, что каждая программа имеет «виртуальное адресное пространство», а не физическое - это то, что позволяет работать с файлом страницы, поскольку разделяемые виртуальные и реальные физические адресные пространства позволяют адресам в программе оставаться неизменными но относятся к совершенно другим местам (и даже пятнам, которые в настоящее время выгружаются на диск). Это также означает, что программы не могут «сжимать» воспоминания друг друга, будучи плохо запрограммированными, - помните окна 3.1 и окна 95, где одна из них разбила весь компьютер? – Patashu