Есть ли действительно низкий уровень языка программирования, который может получить доступ к переменной памяти напрямую? Например, если у меня есть программа, есть переменная i
. Может ли кто-нибудь получить доступ к памяти, чтобы изменить мою программную переменную i
на другое значение?Может ли программа напрямую назначить память?
ответ
В качестве примера того, как изменить переменную в программе извне, рассмотрите использование отладчика. Пример программы:
$ cat print_i.c
#include <stdio.h>
#include <unistd.h>
int main (void) {
int i = 42;
for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
return 0;
}
$ gcc -g -o print_i print_i.c
$ ./print_i
i = 42
i = 42
i = 42
…
(. Программа выводит значение i
каждые 3 секунды)
В другом терминале, найти идентификатор процесса запущенной программы и прикрепить gdb
отладчик к нему:
$ ps | grep print_i
1779 p1 S+ 0:00.01 ./print_i
$ gdb print_i 1779
…
(gdb) bt
#0 0x90040df8 in mach_wait_until()
#1 0x90040bc4 in nanosleep()
#2 0x900409f0 in sleep()
#3 0x00002b8c in main() at print_i.c:6
(gdb) up 3
#3 0x00002b8c in main() at print_i.c:6
6 for (;;) { (void) printf("i = %d\n", i); (void) sleep(3); }
(gdb) set variable i = 666
(gdb) continue
Теперь выход программы изменения:
…
i = 42
i = 42
i = 666
Итак, да, вы можете изменить переменную программы из «снаружи», если у вас есть доступ к ее памяти. Здесь много предостережений, например. нужно найти, где и как хранится переменная. Здесь это было легко, потому что я скомпилировал программу с помощью отладочных символов. Для произвольной программы на произвольном языке это намного сложнее, но теоретически возможно. Конечно, если бы я не являлся владельцем текущего процесса, тогда хорошо управляемая операционная система не позволяла мне получать доступ к своей памяти (без «взлома»), но это еще один вопрос.
Если у другого процесса есть достаточные разрешения, он может изменить память вашего процесса. В Linux это так же просто, как чтение и запись псевдофайла /proc/{pid}/mem
. Это то, как много эксплойтов работают, хотя они полагаются на некоторую уязвимость, которая позволяет им работать с очень высокими привилегиями (root в Unix).
Конечно, если, конечно, операционная система не защищает эту память от вашего имени. Язык машины (язык программирования самого низкого уровня) всегда «обращается к памяти напрямую», и ее довольно легко достичь в C (например, путем литья какого-то целого числа в указатель). Точка, если этот код не работает в вашем процессе (или ядре), на любом языке, на котором он написан, ОС обычно защищает ваш процесс от таких помех (например, путем сопоставления памяти различными способами для разных процессов).
Возможно, вы захотите посмотреть различные API отладки. Вы можете быть удивлены тем, насколько ненадежная «защищенная» память может быть в реальном мире. –
@ttmrichter: дело не в безопасности, это стабильность. –
Те же самые отладочные API-интерфейсы одновременно создают стабильность. Особенно, когда ковбойские кодеры используют их для решения проблем дизайна. –
Короткий ответ: да. Длинный ответ: это зависит от множества факторов, включая ваше оборудование (управление памятью?), Ваши ОС (защищенные виртуальные адресные пространства? Функции, чтобы обойти эти защиты?) И подробные знания, которые ваш оппонент может или не может иметь как на вашем языке архитектуры и структуры вашего приложения.
зависит от цели. В общем, одна из функций операционной системы называется сегментацией - это означает, что программы сохраняются из памяти друг друга. Если я напишу программу, которая пытается получить доступ к памяти, принадлежащей вашей программе, ОС должна сломать меня, так как я совершаю что-то, называемое ошибкой сегментации .
Но есть ситуации, когда я могу обойти это. Например, если у меня есть права root в системе, я могу получить доступ к вашей памяти. Или, что еще хуже, я могу запустить вашу программу внутри виртуальной машины, а затем сидеть вне этой виртуальной машины и делать все, что захочу в ее памяти.
Так что, в общем, вы должны предположить, что злонамеренный человек может проникнуть в память вашей программы и поиграть с ней, если они будут достаточно стараться.
@Marcelo - вы, кажется, подразумеваете, что файловая система 'proc' является дырой в безопасности. Фактически, дыра в безопасности - это то, что позволяет плохим парням получать привилегии root. –
Я вполне согласен, @Stephen, поэтому я прямо сказал в своем ответе («... они полагаются на некоторую уязвимость ...»). –