pwndbg

pwndbg是gdb的一个拓展,使用体验比gdb好很多。使用文档

查看static变量存储在哪儿

编写一个测试程序staticMemberInClass.cpp

class TestClass
{
public:
  static int static_member;
};
int TestClass::static_member = 20;
int main()
{
  TestClass::static_member = 30;
}

编译g++ -g staticMemberInClass.cpp -o staticTest.o

调试gdb ./staticTest.o

在main函数处打断点,b main

运行r

Untitled

这个输出结果就人性化很多了

vmmap查看虚拟内存映射

Untitled

可以看到是没有堆的,使用heap查看堆

Untitled

进一步证实了此时确实还没有堆

p &TestClass::static_member查看静态成员的地址

Untitled

结合汇编代码

Untitled

运行到此处时,p $rip+0x2ed5查看将0x1e也就是30存在哪个地址了

Untitled

算上dword正好是static_member的地址

x/wd 0x555555558010查看一下该地址的值

Untitled

多方面都印证了static_member存储在这个地址

vmmap查看一下0x555555558010在属于哪个部分

Untitled

很明显存储在数据段中。