Dump shared memory linux

Create manual shared memory dump on UNIX/Linux platforms

How to create a manual shared memory dump on UNIX/Linux platforms?

SOLUTION

Via command prompt with environment settings.

1) First start the sybmon utility:

  • $SYBASE/ASE-15_0/bin/dataserver -X –Pquine

2) Now please set the directory to dump the memory file.

Note: This is optional, if you not set the directory, the dump will be placed in the current directory

3) Then list the servers through which the mem dump can be taken. This list is created from .krg file by default and is located in $SYBASE/$SYBASE_ASE:

  • > shell echo $SYBASE/$SYBASE_ASE
  • > cat

Note: If this list file is not located in $SYBASE/$SYBASE_ASE but resides somewhere else, then use directory where it is located :

For Example:

  • > shell echo $SYBASE/$SYBASE_ASE /opt/sybase/SUN_1503/ASE-15_0
  • > cat /opt/sybase/SUN_1503/ASE-15_0

4) Now please choose the server for which memory dump needs to be taken:

Now you will get a message: ‘Attaching to , using shared memory id: #and prompt changes to :active>’

5) Take the memory dump

  • :active> memdump proc
    Halt all engines? (y/[n]) y

6) At last after the successful dump, exit:

Note: For reference full syntax of memdump command (* indicates default):

memdump [nocache* | cache] [halt* | nohalt] [noproc | proc*] [nounused* | unused] [full]

Источник

Получаем образ оперативной памяти


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

Процесс получения информации, которая содержится в оперативной памяти состоит из двух этапов: изъятие содержимого оперативной памяти
и
анализ полученных во время изъятия данных.

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

но в данном материале мы рассмотрим программные средства, которые позволяют изъять содержимое оперативной памяти защищенных машин путем так называемой «горячей» перезагрузки и запуска машины в Live-режиме.

Для выполнения этой задачи будем использовать специальный дистрибутив Ubuntu CyberPack (IRF) 1.0, состоящий из минимального набора компонент, а именно, только те, которые необходимы для изъятия данных из памяти. Соответственно отсутствует и графический интерфейс.

Использование такого подхода к изъятию содержимого оперативной памяти имеет ряд преимуществ и недостатков сравнительно с другими перечисленными выше средствами.
Плюсы:
— использование Live-дистрибутива позволяет проводить действие не зависимо от того какая операционная система установлена на исследуемой машине;
— отсутствуют затраты на приобретение дорогостоящих специальных устройств, кабелей, плат, и др.
Недостаток:
— содержимое оперативной памяти будет неполным — ее часть будет перезаписана данными, необходимыми для запуска Live-дистрибутива (приблизительно 125 Мб).

Читайте также:  Загрузчик возобновления windows не реагирует

Для использования доступны специально собранные дистрибутивы для машин с памятью объемом до 3 Гб (і386) и свыше 3 Гб (amd64). С их помощью можно создать загрузочный CD/DVD-диск или загрузочный USB-диск.

Замечания:
второго шанса система нам не дает — у нас есть только одна попытка. т. е. при повторной перезагрузке исследуемого компьютера большая вероятность того что мы уже не найдем необходимой информации. Отсюда следует что не надо перезагружать его несколько раз, экспериментировать, прицеливаться.
Необходимо заранее подготовится и знать как компьютер себя поведет после перезагрузки.
Большинство современных компьютеров позволяют прямо при старте указать откуда производить загрузку, но если этого нет, тогда необходимого настроить BIOS машины на загрузку с CD/DVD-привода или USB-привода/накопителя, после чего загрузить Live-дистрибутив с указанного устройства.

Перезагружаем компьютер.
ВАЖНО: перезагрузка ни в коем случае не должна быть холодной (путем нажатия кнопки «ресет» или выключение\включение питания), а именно — перезагрузка должна быть осуществлена средствами самой работающей системы (например нажатием кнопок Ctrl-Alt-Del или путем выбора пункта «перезагрузка» в системе)

После загрузки дистрибутива пользователю доступна привычная строка консоли Linux, и краткая информация для запуска модуля.

Подготовка к работе программы fmem заключается в выполнении следующих команд:
$ sudo -s
# cd /opt (переход в папку где находиться программа);
# ./run-fmem.sh (скрипт запуска модуля съема памяти);

Замечание: Для дальнейших действий понадобиться примонтировать заранее подготовленный носитель (внешний жесткий диск, флеш-накопитель) с файловой системой ext2/3/4, в который будет сохраняться файл с содержимым оперативной памяти.

Для того, что бы узнать какой идентификатор присоединенному носителю присвоила система, необходимо после его подключения к компьютеру ввести следующую команду:
# dmesg | tail (Команда выводит на экран информацию буфера сообщений ядра. Нас будет интересовать последняя запись.)
Как например вот это:
[16091.995428] sd 9:0:0:0: Attached scsi generic sg2 type 0
[16091.995996] sd 9:0:0:0: [sdb] 32096120 512-byte logical blocks: (16.4 GB/15.3 GiB)
[16091.998192] sd 9:0:0:0: [sdb] Write Protect is off
[16091.998205] sd 9:0:0:0: [sdb] Mode Sense: 0b 00 00 08
[16091.999433] sd 9:0:0:0: [sdb] No Caching mode page found
[16091.999447] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[16092.003486] sd 9:0:0:0: [sdb] No Caching mode page found
[16092.003495] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[16092.004251] sdb: sdb1

(где «sdb» — присвоенное обозначение физического накопителя, а «sdb1» — присвоенное обозначение логического раздела накопителя).

Далее следует примонтировать логический раздел накопителя к папке /tmp загруженной в Live-режиме операционной системы:

# mount /dev/sdb1 /tmp
(где
«mount» — команда монтирования устройства
«/dev/sdb1» — адрес файла логического раздела присоединенного накопителя
«/tmp» — папка в которую необходимо подключить накопитель).

Все подготовительные шаги сделаны — можно переходить к изъятию содержимого оперативной памяти:

# dd if=/dev/fmem of=/tmp/ram-image.mem bs=1K count=`head -1 /proc/meminfo | awk ‘‘`
(где
«dd» — команда создания образа
«if=/dev/fmem» — источник данных, а именно оперативная память
«of=/tmp/ram-image.mem» — запись в файл «ram-image.mem» в папку «/tmp»
«bs=1K» — размер блока информации — 1 Кб
«count=`head -1 /proc/meminfo | awk ‘‘`» — объем оперативной памяти, информация о которой извлекается из файла /proc/meminfo).

Читайте также:  Гаджеты для windows не работает погода

И ждем…
В результате удачного выполнения команды, мы получим сообщение похожее на это:

521453568 bytes (521 MB) copied, 158.405 s, 3.3 MB/s
(где
«521453568 bytes (521 MB) copied» — объем скопированной информации
«158.405 s» — время в течении которого проводилась операция
«3.3 MB/s» — скорость при которой проводилась операция)

В результате мы получили содержимое оперативной памяти машины в файле «ram-image.mem» на накопителе. Теперь его можно обрабатывать в т.ч. извлекая части исполняемых процессов, удаленных файлов, информацию о пользовательских сессиях, криптографических ключах и многое другое.

P.S.
Также стоит обратить внимание что все современные системы используют в своей работе и swap-память (так называемый «файл подкачки»)
Файл подкачки – это своеобразное дополнение к оперативной памяти (которая занимается временным хранением данных для быстрой доставки их на обработку процессору) Вашего компьютера. Даже не столько дополнение, сколько её уширение или, можно сказать, продолжение. Дело в том, что когда не хватает оперативной памяти система может переносить данные из памяти на диск (так называемая дополнительная память), в котором соответственно также хранятся данные.
И для полной картины анализа памяти необходимо также получить и их.
Различные операционные системы используют разные способы их хранения.

В случае с Windows это обычно файлы в корне на системном диске С:
pagefile.sys для Win XP и Win 7 и достаточно просто скопировать файл

Для Linux — это отдельный раздел на носителе.
Например:
Команда sudo fdisk -l /dev/sda
покажет нам все разделы в системе
/dev/sda1 * 2048 78125055 39061504 83 Linux
/dev/sda2 78125056 117186559 19530752 82 Linux своп / Solaris
/dev/sda3 117186560 625141759 253977600 83 Linux
Исходя из чего мы видим что раздел подкачки находиться в /dev/sda2
Скопировать его можно также с помощию команды dd.
Например:
dd if=/dev/sda2 of=/media/ /linux-swap.dd

Для MacOS необходимо скопировать все файлы из директории /private/var/vm/swapfile*

Обработка и анализ полученных результатов (как дампа оперативной памяти так и swap-памяти) может проводиться как в ручную с помощью например HEX-редактора, так и с помощью ряда программ о которых будет рассказано в следующий раз.

Источник

Linux: создание coredump памяти процесса, systemd-coredump и Debian

Возникла необходимость получить дамп РНР-процесса на Debian 9.

Рассмотрим механизм ядра, позволящий создать дамп, и настройку создания дампов в Linux.

Ниже будем говорить о создании дампа памяти процесса в Linux, а не дампа ядра при kernel panic — там он иной, см. Kdump на Arch Wiki.

Linux Core Dump

Ядро создаёт дамп памяти процесса, если он выполнил недопустимую операцию, и должен быть остановлен.

Для этого при выполнении такой операции ядро отправляет один из аварийных сигналов процессу, после чего процесс обрабатывает сигнал сам, или с помощью сторонних обработчиков, что запускает механизм ядра, который создаёт дамп.

Список таких сигналов задаётся в макросе SIG_KERNEL_COREDUMP_MASK :

Который используется в другом макросе — sig_kernel_coredump :

Который срабывает в случае Fatal-ошибок, и вызывает do_coredump() :

Читайте также:  Емкость диска для windows 10

Ну а сама do_coredump() создаёт дамп.

Сигналы и создание дампа

Проверим работу дампа.

Берём простой код на Си:

Собираем, и запускаем:

Во второй консоли — отправляем один из сигналов, например SIGSEGV (Segmentation violation), код 11:

В окне с приложением проверяем:

Проверяем файл дампа:

Аналогично можно создать дамп практически любого процесса, например — запустим sleep :

GDB — создать core dump

Кроме отправки сигнала — с помощью gdb , а именно gcore , можно создать дамп работающего процесса:

GDB — прочитать core dump

Что бы просмотреть содержимое — можем использовать gdb , которому передаём путь к исполняемому файлу, процесс которого сгенерировал дамп, и путь к самому файлу дампа:

kernel.core_pattern

Во время создания дампа — ядро проверяет параметр kernel.core_pattern , который определяет то, как будет обработан дамп.

Тут можно задать путь и имя файла, в который будет записан дамп, либо передать создание дампа внешнему обработчику, например systemd-coredump (рассмотрим ниже).

См. документацию Naming of core dump files тут>>>.

Из наиболее используемых опций тут:

  • %e executable filename (without path prefix)
  • %p PID of dumped process, as seen in the PID namespace in which the process resides
  • %t time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC)

Собственно файл /tmp/coredump-make_dump.2714790, который мы открыли в GDB, и состоит из kernel.core_pattern = /tmp/coredump-%e.%p :

  1. /tmp каталог
  2. %e — имя файла начинается с coredump + имя исполняемого файла make_dump
  3. %p — и PID убитого процесса — 2714790

Помимо указания на путь к файлу и созданию его имени — в core_pattern можно указать пайп | , и передать данные через него, например в /dev/null или в хендлер типа systemd-coredump .

limits.conf

Кроме имени файла — ядро проверит значение soft и hard лимитов для core в /etc/security/limits.conf :

Либо проверяем в рабочем окружении:

Лимиты конкретного процесса можно получить через его дескриптор в /proc :

fs.suid_dumpable

Иногда дамп может не создаваться, если процесс в процессе выполнения выполнил запрос на смену UID, например через вызов setuid() .

Определяется флагом fs.suid_dumpable :

Может принимать значение 0, 1 или 2, см. man proc:

  • 0: (default) This provides the traditional (pre-Linux 2.6.13) behaviour. A core dump will NOT be produced for a process which has changed credentials (by calling seteuid or similar) or whose binary does not have read permission enabled.
  • 1: («debug«) All processes dump core when possible.
  • 2: («suidsafe«) Any binary which normally would not be dumped (see «0» above) is dumped readable by root only.

systemd-coredump

В systemd , разумеется, добавлен свой обработчик дампов — уже упомянутый systemd-coredump .

На Arch Linux он используется по-умолчанию, на Debian 9 ставим из репозитория:

Файл параметров — /etc/systemd/coredump.conf .

После установки настраиваем ядро — через пайп передаём создание дампа в systemd-coredump :

Создаём дамп какого-то процесса:

coredumpctl

Для работы с дампами через systemd-coredump — используем coredumpctl :

В колонке SIG сразу видим код сигнала, с которым был убит процесс, в данном случае 11 == SIGSEGV .

Сами файлы дампов systemd-coredump сохраняет в /var/lib/systemd/coredump :

Просмотреть дамп — передаём условие для MATCH, например — PID:

Источник

Оцените статью