【发布时间】:2012-01-26 23:51:39
【问题描述】:
是否有可能没有任何 file.out 和源代码,而只是二进制文件? 是否有可能,知道一个 var 的名称,在运行时找到并读取该值?
【问题讨论】:
-
可能,如果它是用调试符号编译的。如果没有,您将不知道如何找到它。反正你没有源码,怎么知道断点在哪里呢?
是否有可能没有任何 file.out 和源代码,而只是二进制文件? 是否有可能,知道一个 var 的名称,在运行时找到并读取该值?
【问题讨论】:
是否有可能,知道一个 var 的名称,在运行时找到并读取该值
视情况而定。
如果变量是全局变量,并且二进制文件没有被剥离,那么您应该能够通过简单的方式检查它的值
x/gx &var
print var
后者可能会打印变量,就好像它是 int 类型(如果二进制文件没有调试信息),这可能不是您要查找的内容。
如果变量是本地的(自动),那么您只能在声明它的例程中打印它(显然)。
如果二进制文件有调试信息,那么简单的print var 在正确的上下文中应该可以工作。
如果二进制文件没有,您必须找出变量的内存地址(通常在帧指针寄存器的堆栈指针的固定偏移处),并检查该地址。您通常可以通过反汇编来了解给定例程的很多信息。
更新:
如果我剥离二进制文件,是否更难进行逆向工程?
当然:你提供给攻击者的信息越少,你就越难让他的工作。
但是你也让你的工作变得更加困难:当你的二进制文件不工作时,你的最终用户通常会比你更了解他的系统。通常,他会将您的二进制文件加载到 GDB 中,并准确地告诉您错误在哪里。使用剥离的可执行文件,他可能无法做到这一点,所以你会来回猜测,经过一周的尝试会失去那个客户。
而且您没有什么办法可以阻止一个足够坚定和足够熟练的黑客对他的系统和硬件具有root访问权限,从而对您的程序进行逆向工程。
最后,根据我的经验,反规避技术通常比它们的价值要麻烦得多。
【讨论】: