美文网首页
[转载] 从正在运行的Linux进程中dump出内存内容

[转载] 从正在运行的Linux进程中dump出内存内容

作者: Hemsl | 来源:发表于2021-06-08 14:40 被阅读0次

最近看到有个CTF题感觉挺有意思,就是从一个bin中找到一个secret key,然后用来签名session cookies用来怼一个使用go的Web服务器。通常这种类型题的flag都比较直接。可以直接用strings怼这个bin就可以了,然而这次的这个题目中的bin不同,因为有太多杂碎(noise)要过滤了。于是在此我就来展示一下如何用一些基本的Linux命令配合gdb从进程中dump出内存中的信息。
先file一下,

$ file ctf-bin
ctf-bin: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

发现是64位的Linux可执行文件。
然后strings一下,

$ strings -n 10 ctf-bin | wc | uniq
   71085  106643 2081483

发现字符串太多,还是先不看,再研究深一点吧。
然后先运行一下程序,

$ ./ctf-bin

然后再另一个终端找到这个进程的PID

$ ps -elf | grep ctf-bin
4 S root       6686   5777  0  80   0 -  8403 -      17:02 pts/0    00:00:00 ./ctf-bin
0 S root       6701   6694  0  80   0 -  3179 -      17:02 pts/2    00:00:00 grep ctf-bin

然后cat一下它的内存(太长不看TL;DR)

$ cat /proc/6686/maps
00400000-007bd000 r-xp 00000000 08:01 1727726                            /root/ctf/q3ctf/ctf-bin
007bd000-00bb9000 r--p 003bd000 08:01 1727726                            /root/ctf/q3ctf/ctf-bin
00bb9000-00bdb000 rw-p 007b9000 08:01 1727726                            /root/ctf/q3ctf/ctf-bin
00bdb000-00bff000 rw-p 00000000 00:00 0 
016b2000-016d3000 rw-p 00000000 00:00 0                                  [heap]
c000000000-c000001000 rw-p 00000000 00:00 0 
c81fff0000-c820200000 rw-p 00000000 00:00 0 
...

似乎太多了有点可怕,但是不用害怕。
然后启动gdb,将改进程attach到gdb上。

$ gdb attach 6686

然后就是gdb命令

(gdb) dump memory /root/memory.dump 0xc81fff0000 0xc820200000

解释一下语法:

  • "dump memory"是命令
  • "/root/memory.dump"是我们想保存dump出的内容的路径。
  • 两个hex是内存地址区间,这跟/proc/6686/maps的格式有些不一样。这是以0x开头的而且没有连字符。

然后就是用strings命令找出刚才dump出的文件的字符串,我喜欢最少10个长度的字符串(-n 10)来过滤掉一些无用的信息(noise)。
结果如下:

$ strings -n 10 /root/memory.dump
XDG_VTNR=2
XDG_SESSION_ID=1SHELL=/bin/bash
VTE_VERSION=4201USER=rootSHLVL=1USERNAME=root
LANG=en_US.UTF-8XDG_SEAT=seat0
HOME=/root
LOGNAME=root
...
Thu Feb 4 21:00:57 -0800 2010
aBCdEfJ2cPhLzQ2l111oZMHuADgJQVlkA
Wed Sep 28 17:02:15 EDT 2016
Wed Sep 28 17:02:15 EDT 2016
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Starting scrum-cookies-server on port 9000.
Starting scrum-cookies-server on port 9000.
Wed Sep 28 17:02:15 EDT 2016 - INFO - main.go:110 - Starting scrum-cookies-server on port 9000.

可以看到好像有个hash值,为了不泄露CTF题的答案,我已经把hash值改了。

总结
好了,你已经找到运行的进程的PID,dump出了那个进程的内存内容,然后用gdb,strings命令找出了有用的数据。

以上翻译自:
https://colin.guru/index.php?title=Dumping_Ram_From_Running_Linux_Processes

Let’s get your hands dirty
Down to business
于是我也想试一下啊,然而我想找一个执行命令之后不退出的进程还蛮难的,最终我想到了apache,然而必须要有客户端与apache建立TCP长连接,如果是那种5xx的错误,比如这个,
就会发现TCP连接建立之后马上又断开了。

cqq@snort-ids:/proc$ tcp|grep "172.18.xx.xx"
sshd     6502     root    3u  IPv4 138454      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:64724 (ESTABLISHED)
sshd     6524      cqq    3u  IPv4 138454      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:64724 (ESTABLISHED)
apache2 13660 www-data   14u  IPv6 179548      0t0  TCP 172.18.yy.yy:80->172.18.xx.xx:53496 (ESTABLISHED)
sshd    18442     root    3u  IPv4 180814      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:52149 (ESTABLISHED)
sshd    18454      cqq    3u  IPv4 180814      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:52149 (ESTABLISHED)
cqq@snort-ids:/proc$ tcp|grep "172.18.xx.xx"
sshd     6502     root    3u  IPv4 138454      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:64724 (ESTABLISHED)
sshd     6524      cqq    3u  IPv4 138454      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:64724 (ESTABLISHED)
sshd    18442     root    3u  IPv4 180814      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:52149 (ESTABLISHED)
sshd    18454      cqq    3u  IPv4 180814      0t0  TCP 172.18.yy.yy:22->172.18.xx.xx:52149 (ESTABLISHED)

于是只能弄一个TCP长连接吧。返回200的那种应该可以。
结果发现还是不行。
于是通过htop漫无目的地找吧,于是还是找apache的主进程吧。
通过htop发信apache的主进程的PID为6900,
于是

cqq@snort-ids:/proc$ sudo gdb attach 6900

(注意:要以root的身份启动,否则可能没有权限。)
然后gdb就开始调试6900进程了,一顿输出啊,几秒之后到达gdb的命令行。
然后dump出heap中的内容。

(gdb) dump memory /root/memory.dump 0x557b9000 0x557fb000
(gdb) dump memory /root/memory2.dump 0x557fb000 0x559eb000

然后在/root目录找到了那两个dump出来的文件,

-rw-r--r--  1 root root 2.0M May 29 20:55 memory2.dump
-rw-r--r--  1 root root 264K May 29 20:54 memory.dump

从任意一个dump中找出10个字符以上的字符串吧。

root@snort-ids:~# strings -n 10 memory.dump
log_config
/usr/lib/apache2/modules/mod_authn_file.so
/usr/lib/apache2/modules/mod_authz_core.0
{U/lib/apache2/modules/mod_authz_host.`
}U/lib/apache2/modules
mod_authz_host.so
oid_section
alg_section
SRVName otherName form
id-on-dnsSRV
Main thread
DEBUG_BACKTRACE_IGNORE_ARGS
PHP_CONFIG_FILE_PATH
E_RECOVERABLE_ERROR

————————————————

原文链接:https://blog.csdn.net/caiqiiqi/article/details/72807952

相关文章

  • [转载] 从正在运行的Linux进程中dump出内存内容

    最近看到有个CTF题感觉挺有意思,就是从一个bin中找到一个secret key,然后用来签名session co...

  • 进程管理

    1、进程 主要概念 进程是正在运行的可执行程序的实例,通过进程ID(pid)识别 LInux使用虚拟内存,所以每个...

  • Java16 多线程初识

    引用内容Java Api1.8 进程:应用程序在内存中分配的空间(正在运行中的程序)线程:进程中负责程序执行的执行...

  • JVM Heap dump和Thread dump

    1、内存Heap Dump文件抓取 heap dump记录了JVM中堆内存运行的情况。 XX:+HeapDumpO...

  • Linux 进程管理详解

    进程 是 Unix 和 Linux 系统中对正在运行中的应用程序的抽象,通过它可以管理和监视程序对内存、处理器时间...

  • 在Linux上显示正在运行的进程的线程ID

    在Linux上显示正在运行的进程的线程ID 在上Linux,“ ps -T”可以显示正在运行的进程的线程信息: 在...

  • iOS中多线程基本概念总结

    进程 正在执行中的程序,有独立的虚拟内存空间,负责程序运行中的内存分配。 线程 进程中独立的执行单元。一个进程包含...

  • Linux | Shell commands

    进程管理 Linux进程状态解析之R、S、D、T、Z、X如何在Linux中查看所有正在运行的进程我使用的命令有: ...

  • 从python角度,理解进程,线程,协程.md

    写在前面 文中有较多的内容为转载,尽量指出转载来源。 1 进程(process) 定义:进程是正在运行程序的实例。...

  • 初识多线程

    进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具...

网友评论

      本文标题:[转载] 从正在运行的Linux进程中dump出内存内容

      本文链接:https://www.haomeiwen.com/subject/rgxjeltx.html