![]() |
1
2
我认为这是有效的,因为它改变了共享库的基地址。回想一下,从共享库导入的函数在加载时会被修补到可执行映像中,因此本身就没有表,只有特定的地址指向分散在程序代码中的数据和代码。 它提高了有效攻击的门槛,因为它使一个简单的缓冲区溢出(在堆栈上的返回地址可以设置)变成一个溢出必须包含代码以确定正确的位置,然后JMP到它。大概这会让事情变得更困难。 实际上,Windows中的所有DLL都是为基本地址编译的,这些基本地址可能不会运行,也将被移动,但核心Windows的DLL往往会对其基本地址进行优化,因此不需要重新定位。 |
![]() |
2
1
我不知道你的问题是否正确,但我会解释ASLR何时有效,何时无效。 假设我们有app.exe和targetlib.dll。 app.exe正在使用(链接到)targetlib.dll。 为了简化解释,我们假设虚拟地址空间只有这两个模块。 如果两者都启用了alsr,则app.exe的基址未知。它可以在加载时解析某些函数调用地址,但攻击者既不知道函数在哪里,也不知道解析变量在哪里。加载targetlib.dll时也会发生同样的事情。 即使app.exe有一个查找表,攻击者也不知道该表在哪里。 由于攻击者无法分辨特定地址的内容,因此必须在不使用任何固定地址信息的情况下攻击应用程序。如果他使用通常的攻击方法,如堆栈溢出、堆溢出、空闲后使用等,通常会比较困难。 另一方面,如果app.exe未启用aslr,则攻击者更容易利用该应用程序。因为在app.exe中的特定地址可能存在对有趣API的函数调用,攻击者可以使用该地址作为目标地址进行跳转。(攻击应用程序通常从跳转到任意地址开始)。
补充:
你可能已经明白了,但我想澄清一件事。
当攻击者利用诸如内存损坏之类的漏洞攻击应用程序时,通常会强制使用
|