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

时间:2018-10-22 15:44:00

标签: c++ debugging gdb reverse-engineering

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

我的一个队友建议

p *(std::vector *)0x7fffffffe210

但是我得到

No symbol "std" in current context.

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

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

谢谢!

我的测试代码很简单

std::vector<int>

2 个答案:

答案 0 :(得分:2)

  

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

This answer显示了如何向现有GDB会话中添加调试符号。

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

答案 1 :(得分:0)

没有@Employed Russian@n.m.的提示,再加上一个家伙,就无法实现此答案,请给他们投票:)

请记住,我正在尝试反转二进制文件,因此不存在对源代码的访问

第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

那很有趣!