user-0 提问: 为什么我这个数组越界的程序无法运行

回复:
user: user-1
content: 引用 4 楼 caterpillarous 的回复:[quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 caterpillarous 的回复:] [quote=引用 1 楼 user-1 的回复:] 去年/Gs（缓冲区溢出安全检查选项） 只有VS中有个这个选项吗。。其他编译器里我都搜不到。。VC++6.0可以关闭GS吗[/quote]  现在编译器一般默认会采取一些措施防止缓冲区溢出攻击，以下资料收集于网络：    对抗缓冲区溢出攻击： 栈随机化 为了在系统中插入攻击代码，攻击者不但要插入代码，还要插入指向这段代码的指针，这个指针也是攻击字符串的一部分。产生这个指针需要知道这个字符串放置的栈地址。在过去，程序的栈地址非常容易预测，在不同的机器之间，栈的位置是相当固定的。 栈随机化的思想使得栈的位置在程序每次运行时都有变化。因此，即使许多机器都运行相同的代码。它们的栈地址都是不同的。 实现的方式是：程序开始时，在栈上分配一段0--n字节之间的随机大小空间。程序不使用这段空间，但是它会导致程序每次执行时后续的栈位置发生了变化。 在Linux系统中，栈随机化已经变成了标准行为。（在linux上每次运行相同的程序，其同一局部变量的地址都不相同）  栈破坏检测 在C语言中，没有可靠的方法来防止对数组的越界写，但是，我们能够在发生了越界写的时候，在没有造成任何有害结果之前，尝试检测到它。 最近的GCC版本在产生的代码中加入了一种栈保护者机制，用来检测缓冲区越界，其思想是在栈中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值。这个金丝雀值是在程序每次运行时随机产生的，因此，攻击者没有简单的办法知道它是什么。 在恢复寄存器状态和从函数返回之前，程序检查这个金丝雀值是否被该函数的某个操作或者函数调用的某个操作改变了。如果是，那么程序异常终止。  限制可执行代码区域 限制那些能够存放可执行代码的存储器区域。在典型的程序中，只有保存编译器产生的代码的那部分存储器才需要是可执行的，其他部分可以被限制为只允许读和写。 现在的64位处理器的内存保护引入了”NX”(不执行)位。有了这个特性，栈可以被标记为可读和可写，但是不可执行，检查页是否可执行由硬件来完成，效率上没有损失。[/quote] 你好 我还想请教一个问题 我写了一个C++程序 是先声明子函数然后声明主函数的 然后我看了一下函数的入口地址，主函数是在高地址的，我觉得是先声明先在内存中定义的啊，为什么是主函数先定义的呢 先谢过[/quote]  主函数在高地址是后定义不是先定义！

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 caterpillarous 的回复:] [quote=引用 1 楼 user-1 的回复:] 去年/Gs（缓冲区溢出安全检查选项） 只有VS中有个这个选项吗。。其他编译器里我都搜不到。。VC++6.0可以关闭GS吗[/quote]  现在编译器一般默认会采取一些措施防止缓冲区溢出攻击，以下资料收集于网络：    对抗缓冲区溢出攻击： 栈随机化 为了在系统中插入攻击代码，攻击者不但要插入代码，还要插入指向这段代码的指针，这个指针也是攻击字符串的一部分。产生这个指针需要知道这个字符串放置的栈地址。在过去，程序的栈地址非常容易预测，在不同的机器之间，栈的位置是相当固定的。 栈随机化的思想使得栈的位置在程序每次运行时都有变化。因此，即使许多机器都运行相同的代码。它们的栈地址都是不同的。 实现的方式是：程序开始时，在栈上分配一段0--n字节之间的随机大小空间。程序不使用这段空间，但是它会导致程序每次执行时后续的栈位置发生了变化。 在Linux系统中，栈随机化已经变成了标准行为。（在linux上每次运行相同的程序，其同一局部变量的地址都不相同）  栈破坏检测 在C语言中，没有可靠的方法来防止对数组的越界写，但是，我们能够在发生了越界写的时候，在没有造成任何有害结果之前，尝试检测到它。 最近的GCC版本在产生的代码中加入了一种栈保护者机制，用来检测缓冲区越界，其思想是在栈中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值。这个金丝雀值是在程序每次运行时随机产生的，因此，攻击者没有简单的办法知道它是什么。 在恢复寄存器状态和从函数返回之前，程序检查这个金丝雀值是否被该函数的某个操作或者函数调用的某个操作改变了。如果是，那么程序异常终止。  限制可执行代码区域 限制那些能够存放可执行代码的存储器区域。在典型的程序中，只有保存编译器产生的代码的那部分存储器才需要是可执行的，其他部分可以被限制为只允许读和写。 现在的64位处理器的内存保护引入了”NX”(不执行)位。有了这个特性，栈可以被标记为可读和可写，但是不可执行，检查页是否可执行由硬件来完成，效率上没有损失。[/quote] 你好 我还想请教一个问题 我写了一个C++程序 是先声明子函数然后声明主函数的 然后我看了一下函数的入口地址，主函数是在高地址的，我觉得是先声明先在内存中定义的啊，为什么是主函数先定义的呢 先谢过

user: user-1
content: 引用 2 楼 caterpillarous 的回复:[quote=引用 1 楼 user-1 的回复:] 去年/Gs（缓冲区溢出安全检查选项） 只有VS中有个这个选项吗。。其他编译器里我都搜不到。。VC++6.0可以关闭GS吗[/quote]  现在编译器一般默认会采取一些措施防止缓冲区溢出攻击，以下资料收集于网络：    对抗缓冲区溢出攻击： 栈随机化 为了在系统中插入攻击代码，攻击者不但要插入代码，还要插入指向这段代码的指针，这个指针也是攻击字符串的一部分。产生这个指针需要知道这个字符串放置的栈地址。在过去，程序的栈地址非常容易预测，在不同的机器之间，栈的位置是相当固定的。 栈随机化的思想使得栈的位置在程序每次运行时都有变化。因此，即使许多机器都运行相同的代码。它们的栈地址都是不同的。 实现的方式是：程序开始时，在栈上分配一段0--n字节之间的随机大小空间。程序不使用这段空间，但是它会导致程序每次执行时后续的栈位置发生了变化。 在Linux系统中，栈随机化已经变成了标准行为。（在linux上每次运行相同的程序，其同一局部变量的地址都不相同）  栈破坏检测 在C语言中，没有可靠的方法来防止对数组的越界写，但是，我们能够在发生了越界写的时候，在没有造成任何有害结果之前，尝试检测到它。 最近的GCC版本在产生的代码中加入了一种栈保护者机制，用来检测缓冲区越界，其思想是在栈中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值。这个金丝雀值是在程序每次运行时随机产生的，因此，攻击者没有简单的办法知道它是什么。 在恢复寄存器状态和从函数返回之前，程序检查这个金丝雀值是否被该函数的某个操作或者函数调用的某个操作改变了。如果是，那么程序异常终止。  限制可执行代码区域 限制那些能够存放可执行代码的存储器区域。在典型的程序中，只有保存编译器产生的代码的那部分存储器才需要是可执行的，其他部分可以被限制为只允许读和写。 现在的64位处理器的内存保护引入了”NX”(不执行)位。有了这个特性，栈可以被标记为可读和可写，但是不可执行，检查页是否可执行由硬件来完成，效率上没有损失。

user: user-0
content: 引用 1 楼 user-1 的回复:去年/Gs（缓冲区溢出安全检查选项） 只有VS中有个这个选项吗。。其他编译器里我都搜不到。。VC++6.0可以关闭GS吗

user: user-1
content: 去年/Gs（缓冲区溢出安全检查选项）