我读过一篇著名的文章:
Aleph One -为了好玩和利润而捣毁这堆东西
我不知道堆栈金丝雀/NX支持/ASLR如何能够避免这样的攻击。我会尽量解释得更好。严格地说:
考虑到这个例子:
example3.c:
------------------------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
------------------------------------------------------------------------------在这种情况下:
我不明白上面的补救措施如何能避免出现这样的例子。
发布于 2017-08-10 05:58:59
粉碎堆栈的圣杯是获得对指针的控制,以便您可以将其指向要执行的恶意代码。程序本身必须存在被利用的溢出。在这个示例3.c中,返回可以很容易地被控制,因为它是一个精心编制的程序。这证明了如何溢出易受攻击的缓冲区以获得指针的控制权,在这种情况下,是返回指针。
在实际的攻击中,要运行的恶意程序需要加载到可执行内存中,指令指针必须指向它。
在程序中找一个缓冲区溢出,不能只写一个。假设我们找到了一个,但是在堆栈缓冲区和任何其他堆栈帧数据(比如返回地址)之间都有Stackguard样式的金丝雀。在堆叠金丝雀满溢时,找出并完美地写一遍,这样它们就不会被更改,并希望返回地址没有被保存在其他的StackShield风格的地方,因为我们正在尝试得到所有的程序,并且堆栈没有被洗牌。英勇地说,我们有一个可以控制的指针。
我们设法将恶意程序加载到内存中,它在哪里?
ASLR -设计用于随机化可执行文件、brk()-managed堆、库映像、mmap()-managed堆、用户空间堆栈和内核空间堆栈。
这很不幸,很难跟踪库和映射内存(除非你是个艺术家),所以我们将其放在堆栈或堆上,这是最简单的。我们得到它,得到它的指针,但然后非可执行内存页阻止它的执行。
返回到库的利用,就像我上面所链接的那样,是开发出来的,因为库必须是可执行的,并且是存在的。
https://security.stackexchange.com/questions/167112
复制相似问题