在應急響應中,我們往往會有dump出某一塊內存下來進行分析的必要。今天要講的是利用gdb命令dump出sshd進程的內存。
按照 Linux 系統的設計哲學,內核只提供dump內存的機制,用戶想要dump什么樣的內存,dump多少內存是屬於策略問題,由用戶來決定。
在真實的使用場景中,主要有兩種使用方式:
- 一種是dump某一個進程的地址空間來供用戶在進程掛掉之后debug分析,也就是通常所說的coredump
- 另一種就是dump整個系統的內存空間,以便於系統管理員debug分析系統掛掉的原因,也就是通常所說的 kdump,由於dump內存的邏輯依然需要系統可以正常工作,管理系統的各種資源,所以kdump整個過程依賴kexec和一個額外的dump內核來保證整個流程正確的執行。
以下演示的是dump出某一個進程(sshd)的內存。
ps aux | grep sshd #過濾出sshd進程,記錄其PID
cat /proc/1431/maps #查看1431進程的內存地址
啟動gdb,將sshd進程attach到gdb上
gdb attach 1431
dump指定內存地址到指定的目錄下
dump memory /tmp/sshd.dump 0x7f25c2a4e000 0x7f25c2a59000 #這里只dump sshd進程的第一塊內存
dump memory /tmp/sshd.dump 0x7f25c2a4e000 0x7f25c2e61000 #dump了指定的內存塊
# "dump memory"是命令
# "/tmp/sshd.dump"是我們想保存dump出的內容的路徑。
# 兩個hex是內存地址區間,這跟/proc/1431/maps的格式有些不一樣。這是以0x開頭的16進制表示的。
之后,去/tmp目錄下,可以看到dump出的sshd.dmp內存
strings -10 sshd.dump #查看sshd.dump內存中至少大於10字符的字符