是否可以使用gdb读取变量的内容?

时间:2011-12-23 17:50:45

标签: gdb reverse-engineering

是否可以没有任何file.out和源代码,只是二进制文件? 是否有可能知道var的名称,在运行时找到并读取值?

1 个答案:

答案 0 :(得分:1)

  

是否有可能知道var的名称,在运行时找到并读取值

取决于。

如果变量是全局的,并且二进制文件没有被剥离,那么你应该能够用一个简单的

来检查它的值。
x/gx &var
print var

后者可以打印变量,就像它是类型int一样(如果二进制文件没有调试信息),这可能不是你想要的。

如果变量是本地的(自动),那么只能在声明它的例程内(显然)打印它。

如果二进制文件具有调试信息,则正确上下文中的简单print var应该有效。

如果二进制文件没有,你必须弄清楚变量的内存地址(通常在帧指针寄存器的堆栈指针的固定偏移处),并检查该地址。你通常可以通过反汇编来了解给定程序。

更新

  

如果我剥离二进制文件,那么进行逆向工程会更难吗?

当然:你提供给攻击者的信息越少,你的工作就越难。

但是你也更难以你的工作:当你的二进制文件不起作用时,你的最终用户通常会比你更了解他的系统。通常他会将您的二进制文件加载到GDB中,并告诉您错误的确切位置。使用剥离的可执行文件,他可能无法做到这一点,所以你会来回猜测,经过一周的尝试将失去该客户。

你可以采取 nothing 来阻止一个有足够决心和足够技能的黑客通过对你的系统和硬件的root访问权来对你的程序进行逆向工程。

最后,根据我的经验,反规避技术通常比它们的价值要大得多。