我有一个关于堆溢出的问题.
我知道如果一个堆栈变量超出它的缓冲区,它可能会覆盖EIP和ESP值,例如,让程序跳转到编码器不希望它跳转的地方.
据我所知,这看起来像是因为向后的小端存储(其中数组中的字符是"向后"存储,从最后到第一个).
另一方面,如果你把那个数组放入堆中,它会与堆栈一起增长,并且你会溢出它,它会将随机垃圾写入空的内存空间吗?
(除非你在solaris上的哪个地方,据我所知有一个大端系统,旁注)
这基本上是危险,因为它只会写入"空白空间"?
所以没有目标跳转到代码不是为其设计的地址和区域?
我弄错了吗?
要指定我的问题:
我正在编写一个程序,用户在通过命令行执行时传递字符串参数和标志,我想知道用户是否可以使用此字符串参数执行hack在具有malloc函数的堆上.
天哪,我希望这个问题不是新手:/请尽量解释简单
感谢您的回答,请在几个小时内见到您,晚安.
另一方面,如果你把那个数组放入堆中,它会与堆栈一起增长,并且你会溢出它,它会将随机垃圾写入空的内存空间吗?
你做了几个假设:
您假设堆位于主内存段的末尾.这不一定是这样.
您假设堆中的对象位于堆的末尾.这不一定是这样.(事实上,它通常不是这样......)
这是一个无论堆如何实现都可能导致问题的示例:
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可能会践踏a或c...或堆中的某些其他对象或空闲列表.
根据您践踏的对象,您可能会覆盖函数指针,或者您可能会执行其他损坏,从而导致分段错误,不可预测的行为等.这些东西可以用于代码注入,导致代码以其他方式从安全角度出现故障......或者只是通过崩溃目标应用程序/服务来实现拒绝服务攻击.
堆溢出可以通过多种方式导致代码执行:
有关一些高级技术,请参阅:
http://packetstormsecurity.com/files/view/40638/MallocMaleficarum.txt
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |