堆溢出的危险?

clo*_*0rk 2 c c++ security

我有一个关于堆溢出的问题.

我知道如果一个堆栈变量超出它的缓冲区,它可能会覆盖EIP和ESP值,例如,让程序跳转到编码器不希望它跳转的地方.

据我所知,这看起来像是因为向后的小端存储(其中数组中的字符是"向后"存储,从最后到第一个).

另一方面,如果你把那个数组放入堆中,它会与堆栈一起增长,并且你会溢出它,它会将随机垃圾写入空的内存空间吗?
(除非你在solaris上的哪个地方,据我所知有一个大端系统,旁注)
这基本上是危险,因为它只会写入"空白空间"?
所以没有目标跳转到代码不是为其设计的地址和区域?
我弄错了吗?

要指定我的问题:
我正在编写一个程序,用户在通过命令行执行时传递字符串参数和标志,我想知道用户是否可以使用此字符串参数执行hack在具有malloc函数的堆上.

天哪,我希望这个问题不是新手:/请尽量解释简单

感谢您的回答,请在几个小时内见到您,晚安.

Ste*_*n C 7

另一方面,如果你把那个数组放入堆中,它会与堆栈一起增长,并且你会溢出它,它会将随机垃圾写入空的内存空间吗?

你做了几个假设:

  1. 您假设堆位于主内存段的末尾.这不一定是这样.

  2. 您假设堆中的对象位于堆的末尾.这不一定是这样.(事实上​​,它通常不是这样......)

这是一个无论堆如何实现都可能导致问题的示例:

  char *a = malloc(100);
  char *b = malloc(100);
  char *c = malloc(100);
  for (int i = 0; i < 200; i++) {
      b[i] = 'Z';
  }
Run Code Online (Sandbox Code Playgroud)

超出结尾的写入b可能会践踏ac...或堆中的某些其他对象或空闲列表.

根据您践踏的对象,您可能会覆盖函数指针,或者您可能会执行其他损坏,从而导致分段错误,不可预测的行为等.这些东西可以用于代码注入,导致代码以其他方式从安全角度出现故障......或者只是通过崩溃目标应用程序/服务来实现拒绝服务攻击.


R..*_*R.. 5

堆溢出可以通过多种方式导致代码执行:

  • 最明显的 - 您溢出到另一个包含函数指针的对象并覆盖其中一个。
  • 不太明显 - 您溢出的对象本身不包含函数指针,但它包含将用于写入的指针,您可以覆盖其中一个指向函数指针,以便后续写入覆盖函数指针。
  • 利用堆簿记结构——通过覆盖堆分配器本身用来跟踪已分配/空闲块的大小和状态的数据,你可以欺骗它覆盖内存中其他地方的有价值的东西。
  • 等等。

有关一些高级技术,请参阅:

http://packetstormsecurity.com/files/view/40638/MallocMaleficarum.txt