2010-04-11 2 views
6

Есть ли действительно низкий уровень языка программирования, который может получить доступ к переменной памяти напрямую? Например, если у меня есть программа, есть переменная i. Может ли кто-нибудь получить доступ к памяти, чтобы изменить мою программную переменную i на другое значение?Может ли программа напрямую назначить память?

ответ

7

В качестве примера того, как изменить переменную в программе извне, рассмотрите использование отладчика. Пример программы:

$ 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 

Итак, да, вы можете изменить переменную программы из «снаружи», если у вас есть доступ к ее памяти. Здесь много предостережений, например. нужно найти, где и как хранится переменная. Здесь это было легко, потому что я скомпилировал программу с помощью отладочных символов. Для произвольной программы на произвольном языке это намного сложнее, но теоретически возможно. Конечно, если бы я не являлся владельцем текущего процесса, тогда хорошо управляемая операционная система не позволяла мне получать доступ к своей памяти (без «взлома»), но это еще один вопрос.

1

Если у другого процесса есть достаточные разрешения, он может изменить память вашего процесса. В Linux это так же просто, как чтение и запись псевдофайла /proc/{pid}/mem. Это то, как много эксплойтов работают, хотя они полагаются на некоторую уязвимость, которая позволяет им работать с очень высокими привилегиями (root в Unix).

+2

@Marcelo - вы, кажется, подразумеваете, что файловая система 'proc' является дырой в безопасности. Фактически, дыра в безопасности - это то, что позволяет плохим парням получать привилегии root. –

+0

Я вполне согласен, @Stephen, поэтому я прямо сказал в своем ответе («... они полагаются на некоторую уязвимость ...»). –

4

Конечно, если, конечно, операционная система не защищает эту память от вашего имени. Язык машины (язык программирования самого низкого уровня) всегда «обращается к памяти напрямую», и ее довольно легко достичь в C (например, путем литья какого-то целого числа в указатель). Точка, если этот код не работает в вашем процессе (или ядре), на любом языке, на котором он написан, ОС обычно защищает ваш процесс от таких помех (например, путем сопоставления памяти различными способами для разных процессов).

+1

Возможно, вы захотите посмотреть различные API отладки. Вы можете быть удивлены тем, насколько ненадежная «защищенная» память может быть в реальном мире. –

+0

@ttmrichter: дело не в безопасности, это стабильность. –

+3

Те же самые отладочные API-интерфейсы одновременно создают стабильность. Особенно, когда ковбойские кодеры используют их для решения проблем дизайна. –

1

Короткий ответ: да. Длинный ответ: это зависит от множества факторов, включая ваше оборудование (управление памятью?), Ваши ОС (защищенные виртуальные адресные пространства? Функции, чтобы обойти эти защиты?) И подробные знания, которые ваш оппонент может или не может иметь как на вашем языке архитектуры и структуры вашего приложения.

0

зависит от цели. В общем, одна из функций операционной системы называется сегментацией - это означает, что программы сохраняются из памяти друг друга. Если я напишу программу, которая пытается получить доступ к памяти, принадлежащей вашей программе, ОС должна сломать меня, так как я совершаю что-то, называемое ошибкой сегментации .

Но есть ситуации, когда я могу обойти это. Например, если у меня есть права root в системе, я могу получить доступ к вашей памяти. Или, что еще хуже, я могу запустить вашу программу внутри виртуальной машины, а затем сидеть вне этой виртуальной машины и делать все, что захочу в ее памяти.

Так что, в общем, вы должны предположить, что злонамеренный человек может проникнуть в память вашей программы и поиграть с ней, если они будут достаточно стараться.