当我试图对我的C ++代码进行反向工程时,我想到了要在调试器(gdb)中打印std :: vector元素的问题。
我的一个队友建议
p *(std::vector *)0x7fffffffe210
但是我得到
No symbol "std" in current context.
这是由于缺少调试符号而产生的错误。 我知道windbg具有预先构建的结构(可通过“ dt”命令访问)。
是否有任何已构建的解决方案,或者如何为gdb构建自己的结构?
谢谢!
我的测试代码很简单
std::vector<int>
答案 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
那很有趣!