GDB 打印 stl(例如 std::vector),不带调试符号

问题描述 投票:0回答:2

当我尝试对我的 C++ 代码进行逆向工程时,我遇到了想要在调试器 (gdb) 中打印我的 std::vector 元素的问题。

我的一位队友建议

p *(std::vector *)0x7fffffffe210

但后来我明白了

No symbol "std" in current context.

这是由于缺少调试符号而产生的错误。 我知道 Windbg 有预构建结构(通过“dt”命令访问)。

是否有任何已经构建的解决方案或者如何为 gdb 构建自己的结构?

谢谢!

我的测试代码很简单

std::vector<int>
c++ debugging gdb reverse-engineering
2个回答
2
投票

是否有任何已经构建的解决方案或者如何为 gdb 构建自己的结构?

这个答案展示了如何将调试符号添加到现有的GDB会话中。

正如

n.m.
所建议的,您还可以通过预加载使用
std::vector<int>
并使用调试符号进行编译的库来实现此目的,但这并不是真正必要的。


1
投票

我正在尝试反转二进制文件,因此无法访问源代码

第 1 步:创建共享库

//g++ -shared -g -fPIC  preload.cpp -o preload.so
#include <iostream>
#include <vector> 

static __attribute__((constructor)) void init(void)
{
    std::vector<int> vect2 (4,1); 
    vect2.push_back(1); //Just be sure of the compilation

    printf("Hi\n"); //Simple debug (std::cout results to segfault)
}

第 2 步:在 gdb 中打开二进制文件

gdb ./test
(gdb) set environment LD_PRELOAD  /path/to/preload.so

第 3 步:找到指针并访问它

(gdb) print *('std::vector<int, std::allocator<int> >' *) 0x7fffffffe1e0
$8 = std::vector of length 3, capacity 3 = {1, 3, 2} //w00t!

我如何发现

std::vector<int, std::allocator<int> >
是正确的指针? (还要记住引号)

找出向量 ex 的类型。来自 IDA 并使用此类型创建一个示例二进制文件,但启用了调试符号 (

-g
)。用 gdb 打开二进制文件,看看他是如何翻译它的。 (带有
<int>
向量的函数 Push_back)

   0x00005555555552f9 <+83>:    movl   $0x1,-0x4c(%rbp)
   0x0000555555555300 <+90>:    lea    -0x4c(%rbp),%rdx
   0x0000555555555304 <+94>:    lea    -0x70(%rbp),%rax
   0x0000555555555308 <+98>:    mov    %rdx,%rsi
   0x000055555555530b <+101>:   mov    %rax,%rdi
   0x000055555555530e <+104>:   callq  0x555555555598 <std::vector<int, std::allocator<int> >::push_back(int&&)>
   0x0000555555555313 <+109>:   movl   $0x2,-0x48(%rbp)
   0x000055555555531a <+116>:   lea    -0x48(%rbp),%rdx
   0x000055555555531e <+120>:   lea    -0x70(%rbp),%rax
© www.soinside.com 2019 - 2024. All rights reserved.