如何使用GDB在内存中查找字符串的地址?

use*_*353 14 c gdb

我想在内存中找到字符串的地址.在这种情况下,我正在寻找"/ bin/sh".它是一个初始化变量,所以它在.data部分和编译后,它有一个固定的地址.那么我在GDB中如何查找其内存地址呢?而且我不知道它存储的变量的名称.

Rez*_*emi 18

使用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
Run Code Online (Sandbox Code Playgroud)

  • 这很奇怪,你搜索的地址属于 libc。该字符串不应该在属于“myapp”可执行文件的范围内,即0x400000..0x602000吗? (2认同)

Jam*_*olk 9

使用find命令.

find [/sn] start_addr, +len, val1 [, val2, …]
find [/sn] start_addr, end_addr, val1 [, val2, …]

在内存中搜索val1,val2等指定的字节序列.搜索从地址start_addr开始,并继续执行len个字节或直到end_addr.s和n是可选参数.它们可以按任何顺序指定,分开或一起指定.

s,搜索查询大小每个搜索查询值的大小.

b个字节

半字(两个字节)

w字(四个字节)

g巨字(八字节)

所有值都以当前语言解释.这意味着,例如,如果当前源语言是C/C++,则搜索字符串"hello"包括尾随'\ 0'.

如果未指定值大小,则从当前语言的值类型中获取值.当想要将搜索模式指定为类型的混合时,这很有用.注意,这意味着,例如,在类C语言的情况下,搜索无类型0x42将搜索'(int)0x42',其通常是四个字节.

n,最大查找次数要打印的最大匹配数.默认是打印所有查找.

您可以使用字符串作为搜索值.用双引号(")引用它们.无论目标的字节顺序和大小规范如何,字符串值都会逐字节地复制到搜索模式中.

打印每个匹配的地址以及找到的匹配数的计数.

找到的最后一个值的地址存储在便利变量'$ _'中.匹配数的计数存储在'$ numfound'中.


Kar*_*uil 9

如果要在进程的整个地址空间中进行搜索,则需要获取进程的内存映射,并使用gdb中的find命令使用起始地址和结束地址.

例如,如果cat /proc/$PID/maps显示您的进程的虚拟内存范围从0x08048000到0xc0000000,则可以按以下

(gdb) find 0x80048000, 0xc0000000, "/bin/sh"

方式进行搜索:获取进程内存映射的另一种方法是使用gdb的嵌入式命令:

(gdb) info proc map
Run Code Online (Sandbox Code Playgroud)