使用gdb检查环境变量

使用gdb检查环境变量

我一直试图在Ubuntu 12.04机器上的程序中找到SHELL环境变量的地址。我已经关闭了ASLR。

我发现了类似的帖子:那么问题博客文章

我尝试在 gdb 中使用以下内容

 (gdb) x/s *((char **)environ)

但我收到消息:

 (gdb) No symbol "environ" in current context

这在 Ubuntu 12.04 中无效吗?还有其他方法可以使用 gdb 检查进程中环境变量的地址吗?

答案1

strip您的二进制文件的符号是否已被ped?如果是这样,就不会有符号表,你也没有希望找到这个符号。你可以通过readelf- 这里我的hello二进制文件找到有它的符号表:

$ readelf -S hello | grep -i symtab
  [28] .symtab           SYMTAB           0000000000000000  000018f8
$ 

另外,当你运行GDB时,你的程序实际上启动了吗?看起来这个符号在符号表加载之前无法解析。当您第一次启动 GDB 时它不会被加载,但应该在您点击 时加载main()。您可以简单地main()在程序中放置一个断点run,然后在遇到main()断点时检查变量:

Reading symbols from hello...(no debugging symbols found)...done.
(gdb) x/s *((char **)environ)
No symbol table is loaded.  Use the "file" command.
(gdb) b main
Breakpoint 1 at 0x4005c8
(gdb) r
Starting program: /home/ubuntu/hello 

Breakpoint 1, 0x00000000004005c8 in main ()
(gdb) x/s *((char **)environ)
0x7fffffffe38f: "XDG_VTNR=7"
(gdb) 

答案2

gdb你可以使用命令show environment。作为检查进程环境的替代方法是:

$ sed 's/\x0/\n/g' /proc/<PID>/environ

sed命令是将 NUL 分隔符转换为换行符以提高可读性所必需的。

这两种方法的优点(除了简单之外)是,符号表是否被删除并不重要:-)

相关内容