我想知道可执行文件是否支持常见的安全保护,例如 NX 标志、堆栈 cookie 或 ASLR。看起来 ASLR 是在操作系统级别设置的,但你怎么知道它已启用?在 Windows 上,某些可执行文件不支持 ASLR,所以我想知道如何在 Mac OS X 上确定这一点。
首先,OSX 10.6 及更低版本中使用的 ALSR 没有随机化所有内存区域。 据我所知,所有正在运行的可执行文件都启用了 ASLR。 这“非常容易”测试,只需启动调试器设置断点并记录堆栈上的任何内存地址即可。 重新启动应用程序并查看同一变量是否具有相同的内存地址。 我认为在 OSX 10.7 中他们开始随机化动态链接器。 linux、bsd、甚至windows系统已经做了很多年了。
对于 OSX,可以使用执行
export DYLD_PRINT_SEGMENTS=1
然后运行命令来测试链接库 ASLR。 TEXT 内存区域是库的基地址。 对任何二进制文件运行此命令两次。 如果两次执行之间的基地址不同,那么 ASLR 的肮脏工作就是罪魁祸首。
堆叠饼干是一种完全不同的游戏。 这是编译器级别的保护,会根据应用程序的不同而有所不同。 现代版本的 GCC 应默认启用堆栈 carnies。 同样,您应该咨询调试器以查看特定应用程序是否正在使用金丝雀。 只需检查任何函数的堆栈帧,看看本地声明的变量和返回地址之间是否插入了随机值。
就 NX 标志而言,您应该假设 1999 年之后制造的任何系统都使用这种简单的保护形式。 但是,这是迄今为止最简单的绕过保护,只需 ret-to-libc 或使用 ROP 链(因为 aslr)。