Может ли программа назначить память напрямую? - PullRequest
6 голосов
/ 11 апреля 2010

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

Ответы [ 5 ]

7 голосов
/ 11 апреля 2010

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

$ 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

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

4 голосов
/ 11 апреля 2010

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

1 голос
/ 11 апреля 2010

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

1 голос
/ 11 апреля 2010

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

0 голосов
/ 11 апреля 2010

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

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

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

...