我已经做了很多研究,试图理解这个话题,但是仍然有些困惑。目前,我正在调查缓冲区溢出。这是我正在查看的功能的示例:
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个字节了吗?我只是对了解这一点感到迷茫。
答案 0 :(得分:0)
您的堆栈似乎对齐了16个字节。如果有4个字节的RET和4个字节的EBP,那么您当然需要另外8个字节的填充,以保持16个字节的对齐方式,否则本地函数存储将不会以16个字节的倍数开始,那么您的堆栈就不会是16个字节对齐。