当我尝试对我的 C++ 代码进行逆向工程时,我遇到了想要在调试器 (gdb) 中打印我的 std::vector 元素的问题。
我的一位队友建议
p *(std::vector *)0x7fffffffe210
但后来我明白了
No symbol "std" in current context.
这是由于缺少调试符号而产生的错误。 我知道 Windbg 有预构建结构(通过“dt”命令访问)。
是否有任何已经构建的解决方案或者如何为 gdb 构建自己的结构?
谢谢!
我的测试代码很简单
std::vector<int>
是否有任何已经构建的解决方案或者如何为 gdb 构建自己的结构?
这个答案展示了如何将调试符号添加到现有的GDB会话中。
正如
n.m.
所建议的,您还可以通过预加载使用std::vector<int>
并使用调试符号进行编译的库来实现此目的,但这并不是真正必要的。
我正在尝试反转二进制文件,因此无法访问源代码
第 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