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

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

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

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

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

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

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

然后就是gdb命令

解释一下语法:

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

可以看到好像有个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连接建立之后马上又断开了。

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

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

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

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

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

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