我正试图用c创建一个缓冲区溢出,用于学校项目:

unsafe
{
    fixed (char* ptr_str = new char[6] {'H', 'a', 'l', 'l', 'o', ','})
    {
        fixed (char* ptr_str2 = new char[6] {'W', 'e', 'r', 'e', 'l', 'd'})
        {
            fixed (char* ptr_str3 = new char[6] {'!', '!', '!', '!', '!', '!'})
            {
                for (int i = 0; i < 8; i++)
                {
                    ptr_str2[i] = 'a';
                }

                for (int i = 0; i < 6; i++)
                {
                    this.Label2.Text += ptr_str[i];
                    this.Label3.Text += ptr_str2[i];
                    this.Label4.Text += ptr_str3[i];
                }
            }
        }
    }
}

我想这会淹没ptr_str2并因此覆盖ptr_str中的字符。然而,这似乎并没有发生。它确实执行,但ptr_str中的值不会被覆盖。
有人能帮忙实现这个目标吗?我不明白我做错了什么。

最佳答案

你忽略了数组本身就是对象的事实。它们有一个类似于任何托管引用类型的对象头和一个存储数组大小的私有字段。在开始覆盖数组元素之前,必须先覆盖这些元素。在32位计算机上,您将开始用以下命令覆盖ptr\u str2的第一个元素:

                        for (int i = 0; i < 13; i++) {
                            ptr_str[i] = 'a';
                        }

当然,必须是13岁。
通过在for循环上设置断点来观察这一点。debug+windows+memory+memory 1,在地址框中键入“ptr_str”。单步执行代码以查看内存正在更改。之后会看到ptr_str2,syncblk为4字节,方法表指针为4字节,数组长度为4字节。总共12个字节,6个字符。

09-15 17:17