是否可以没有任何file.out和源代码,只是二进制文件? 是否有可能知道var的名称,在运行时找到并读取值?
答案 0 :(得分:1)
是否有可能知道var的名称,在运行时找到并读取值
取决于。
如果变量是全局的,并且二进制文件没有被剥离,那么你应该能够用一个简单的
来检查它的值。x/gx &var
print var
后者可以打印变量,就像它是类型int
一样(如果二进制文件没有调试信息),这可能不是你想要的。
如果变量是本地的(自动),那么只能在声明它的例程内(显然)打印它。
如果二进制文件具有调试信息,则正确上下文中的简单print var
应该有效。
如果二进制文件没有,你必须弄清楚变量的内存地址(通常在帧指针寄存器的堆栈指针的固定偏移处),并检查该地址。你通常可以通过反汇编来了解给定程序。
更新
如果我剥离二进制文件,那么进行逆向工程会更难吗?
当然:你提供给攻击者的信息越少,你的工作就越难。
但是你也更难以你的工作:当你的二进制文件不起作用时,你的最终用户通常会比你更了解他的系统。通常他会将您的二进制文件加载到GDB中,并告诉您错误的确切位置。使用剥离的可执行文件,他可能无法做到这一点,所以你会来回猜测,经过一周的尝试将失去该客户。
你可以采取 nothing 来阻止一个有足够决心和足够技能的黑客通过对你的系统和硬件的root访问权来对你的程序进行逆向工程。
最后,根据我的经验,反规避技术通常比它们的价值要大得多。