首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“捣毁堆栈以获取乐趣和利润”--补救措施

“捣毁堆栈以获取乐趣和利润”--补救措施
EN

Security用户
提问于 2017-08-09 10:01:54
回答 1查看 992关注 0票数 1

我读过一篇著名的文章:

Aleph One -为了好玩和利润而捣毁这堆东西

我不知道堆栈金丝雀/NX支持/ASLR如何能够避免这样的攻击。我会尽量解释得更好。严格地说:

  • 堆栈金丝雀: RET之前的随机值
  • NX支持:用于堆栈(和堆)的无x标志
  • 地址空间随机化

考虑到这个例子:

代码语言:javascript
复制
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);
}
------------------------------------------------------------------------------

在这种情况下:

  • 堆栈金丝雀被绕过(我只更改RET值)
  • NX支持:无用
  • ASLR:无用(我绕过指令x=1添加一个偏移量)

我不明白上面的补救措施如何能避免出现这样的例子。

EN

回答 1

Security用户

发布于 2017-08-10 05:58:59

粉碎堆栈的圣杯是获得对指针的控制,以便您可以将其指向要执行的恶意代码。程序本身必须存在被利用的溢出。在这个示例3.c中,返回可以很容易地被控制,因为它是一个精心编制的程序。这证明了如何溢出易受攻击的缓冲区以获得指针的控制权,在这种情况下,是返回指针。

在实际的攻击中,要运行的恶意程序需要加载到可执行内存中,指令指针必须指向它。

你提到的保护引起现实世界困难的原因:

在程序中找一个缓冲区溢出,不能只写一个。假设我们找到了一个,但是在堆栈缓冲区和任何其他堆栈帧数据(比如返回地址)之间都有Stackguard样式的金丝雀。在堆叠金丝雀满溢时,找出并完美地写一遍,这样它们就不会被更改,并希望返回地址没有被保存在其他的StackShield风格的地方,因为我们正在尝试得到所有的程序,并且堆栈没有被洗牌。英勇地说,我们有一个可以控制的指针。

我们设法将恶意程序加载到内存中,它在哪里?

ASLR -设计用于随机化可执行文件、brk()-managed堆、库映像、mmap()-managed堆、用户空间堆栈和内核空间堆栈。

这很不幸,很难跟踪库和映射内存(除非你是个艺术家),所以我们将其放在堆栈或堆上,这是最简单的。我们得到它,得到它的指针,但然后非可执行内存页阻止它的执行。

返回到库的利用,就像我上面所链接的那样,是开发出来的,因为库必须是可执行的,并且是存在的。

票数 4
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/167112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档