как увидеть содержимое в ОЗУ, когда программа выполняется в Linux?

Поскольку вы можете установить 32-битный Linux на 64-битный компьютер, более безопасным способом, по-видимому, является проверка возможностей процессора. Для Intel и совместимых процессоров:

grep -o -w 'lm' /proc/cpuinfo 

http://www.unixtutorial.org/2009/05/how-to-confirm-if-your-cpu-is-32bit-or-64bit/

Что вы ищу следующий флаг: lm. Это означает X86_FEATURE_LM, поддержку длительного режима (64 бит). Если вы можете найти флаг «lm» среди флагов вашего процессора, это означает, что вы смотрите на 64-битный процессор с поддержкой .

1
12.05.2019, 02:08
1 ответ

/proc/[pid]/memпозволяет получить доступ к виртуальной памяти процесса.

Смещения в этом файле соответствуют виртуальным адресам. /proc/[pid]/mapsговорит вам, какие диапазоны адресов поддерживаются фактической памятью (и где сама память поддерживается файлами ).

Все это задокументировано на странице proc (5 ).

Процесс может обращаться к памяти только тех процессов, которые запущены под тем же пользователем, что и он сам, и которые не имеют setgid/uid. Раньше было так, что вам нужно было ptrace()процесса, чтобы получить доступ к его памяти через /proc/[pid]/mem, но это НЕ ВЕРНО уже довольно давно (more именно, поскольку этот коммит от января 2012 года (v3.2+ ), целью которого было исправление ошибки безопасности, также отредактированный в статье lwn ).

Практический пример

В окне терминала:

% echo $$ # show our pid
6744
% read -sp 'secret pasword: '; echo
secret pasword:
%

Затем в другом окне терминала:

% grep heap /proc/6744/maps
01bb7000-01c3e000 rw-p 00000000 00:00 0                                  [heap]
% dd if=/proc/6744/mem bs=1 skip=$((0x01bb7000)) count=$((0x01c3e000-0x01bb7000)) status=none |
    strings | less
...
% dd if=/proc/6744/mem bs=1 skip=$((0x01bb7000)) count=$((0x01c3e000-0x01bb7000)) status=none |
    strings | grep qwerty
qwertyuiop # here is the "secret password"

Люди обычно используют отладчик, подобный gdb, чтобы заглянуть в память запущенного процесса вместо элементарных способов, подобных этому (отладчик знает формат структур, используемых процессом, может отслеживать указатели, списки и т. д. ), но принцип в основном тот же.

Последние ядра Linux также имеют более приятный интерфейс вместо /proc/[pid]/mem, напримерprocess_vm_readv. Так же, как с /proc/[pid]/memили PTRACE_PEEKи т. д., вам нужен root -как привилегии (CAP_SYS_PTRACE), чтобы прочитать память процесса, которым вы не владеете.

3
27.01.2020, 23:22

Теги

Похожие вопросы