堆栈对齐-缓冲区溢出测试

时间:2018-10-21 06:46:54

标签: c gcc stack-overflow buffer-overflow stackframe

我已经做了很多研究,试图理解这个话题,但是仍然有些困惑。目前,我正在调查缓冲区溢出。这是我正在查看的功能的示例:

int testFunction(char* sourceBuffer)
{
    unsigned char result = 0;
    char destinationBuffer[512];

    //do some insecure stuff with strcpy()
}

我正在使用以下设置进行编译:

gcc -g -z execstack -fno-stack-protector -o test test.c

据我所知,ASLR应该使用这些设置禁用堆栈保护,canary值和编译器防护。但是,在检查GDB中的内存时,这就是我的堆栈的样子:

HIGH

sourceBuffer...temp...etc...
RET address [4 bytes]
EBP address [4 bytes]

(8 bytes of mystery memory)

result [1 byte]
destinationBuffer[512 bytes]

LOW

我尝试阅读有关堆栈对齐/填充的文章,这篇文章特别有帮助:Stack allocation, padding, and alignment

默认对齐方式为16个字节。根据该答案,如果我将n = 2更改为看起来可行。 result仅在EBP指针开始的位置之前1个字节。这将使我能够根据需要利用缓冲区溢出到返回地址中。

我真的很难做到这一点。如果默认情况下为16,那么堆栈最初是否设置为16个字节,那么RET和EBP指针每个都占用4个字节,所以只剩下8个字节了吗?我只是对了解这一点感到迷茫。

1 个答案:

答案 0 :(得分:0)

您的堆栈似乎对齐了16个字节。如果有4个字节的RET和4个字节的EBP,那么您当然需要另外8个字节的填充,以保持16个字节的对齐方式,否则本地函数存储将不会以16个字节的倍数开始,那么您的堆栈就不会是16个字节对齐。