我想在内存中找到字符串的地址.在这种情况下,我正在寻找"/ 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)
使用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'中.
如果要在进程的整个地址空间中进行搜索,则需要获取进程的内存映射,并使用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)