我想在内存中找到字符串的地址。在这种情况下,我正在寻找“/ bin / sh”。它是一个初始化变量,所以它在.data部分和编译后,它有一个固定的地址。那么我在GDB中如何查找其内存地址呢?而且我不知道它存储的变量的名称。
答案 0 :(得分:11)
使用info proc map
听起来对我来说更好。
(gdb) info proc map
process 930
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x400000 0x401000 0x1000 0x0 /myapp
0x600000 0x601000 0x1000 0x0 /myapp
0x601000 0x602000 0x1000 0x1000 /myapp
0x7ffff7a1c000 0x7ffff7bd2000 0x1b6000 0x0 /usr/lib64/libc-2.17.so
0x7ffff7bd2000 0x7ffff7dd2000 0x200000 0x1b6000 /usr/lib64/libc-2.17.so
0x7ffff7dd2000 0x7ffff7dd6000 0x4000 0x1b6000 /usr/lib64/libc-2.17.so
0x7ffff7dd6000 0x7ffff7dd8000 0x2000 0x1ba000 /usr/lib64/libc-2.17.so
(gdb) find 0x7ffff7a1c000,0x7ffff7bd2000,"/bin/sh"
0x7ffff7b98489
1 pattern found.
(gdb) x /s 0x7ffff7b98489
0x7ffff7b98489: "/bin/sh"
(gdb) x /xg 0x7ffff7b98489
0x7ffff7b98489: 0x0068732f6e69622f
答案 1 :(得分:9)
使用find命令。
find [/sn] start_addr, +len, val1 [, val2, …]
find [/sn] start_addr, end_addr, val1 [, val2, …]
在内存中搜索val1,val2等指定的字节序列。 搜索从地址start_addr开始,并继续为len bytes或through到end_addr包含。 s和n是可选参数。它们可以在任何一个中指定 订购,分开或一起。
s,搜索查询大小每个搜索查询值的大小。
b bytes
h halfwords(两个字节)
w字(四个字节)
g巨字(八字节)
所有值均以当前语言解释。这意味着,为 如果当前源语言是C / C ++然后搜索 对于字符串“hello”包括尾部'\ 0'。
如果未指定值大小,则从值的类型中获取值 用当前的语言。当想要指定时,这很有用 搜索模式作为类型的混合。请注意,这意味着,为 例如,在类C语言的情况下,搜索无类型 0x42将搜索'(int)0x42',通常为4个字节。
n,最大查找次数要打印的最大匹配数。该 默认是打印所有查找。
您可以使用字符串作为搜索值。用双引号引用它们 (“)。字符串值逐字节复制到搜索模式中, 无论目标的字节顺序和大小规格如何。
打印每个匹配的地址以及计数 发现的匹配数量。
找到的最后一个值的地址存储在便利变量中 “$ _”。匹配数的计数存储在'$ numfound'中。
答案 2 :(得分:9)
如果要在流程的整个地址空间中进行搜索,则需要获取流程的内存映射。使用起始地址&在gdb中使用find命令的结束地址。
例如,如果cat /proc/$PID/maps
显示您的进程的虚拟内存范围从0x08048000到0xc0000000,则可以按以下方式搜索:
(gdb) find 0x80048000, 0xc0000000, "/bin/sh"
获取进程内存映射的另一种方法是使用gdb的嵌入式命令:
(gdb) info proc map