//csdn博客目前暂时不再更新了,有兴趣请访问我的技术博客-晓的博客:zhangxiaolong.org
首先,先要知道什么是shellcode,Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。详见维基百科shellcode介绍:http://en.wikipedia.org/wiki/Shellcode。
今天,先从一个简单的漏洞程序入手分析进行shellcode攻击。看一个程序vulp.c
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { char buf[1024]; strncpy(buf, argv[1], sizeof(buf) - 1); printf(buf); exit(0); }
我们的目的是在程序执行到exit()时,通过更改exit的内存地址中的内容,把shellcode的地址作为内容写入到该地址。
(1)编译vulp.c程序,并且设置为suid权限。如图1所示。
图1
(2)编写一个shellcode代码(一般可以在网上找到,并做小修改就可以了),并定义一个环境变量EGG,在变量中存放shellcode;编写一个get()函数,目的是获取这个变量的地址。如图2示。所获取的地址为0xbffff838.
get()函数作用是返回变量EGG在内存中的地址。函数内容为:
#include<stdio.h> int main() { printf("%p\n",getenv("EGG")); exit(0); }
图2
(3)寻找exit函数的地址,用objdump –R vulp命令,寻找exit的地址,如图3示.
图 3
(4)为了在exit函数位置内写入地址,首先要计算在此位置要写入的字符数,如图4所示。Exit在第八个位置上。
图 4
(5)有以上内容知,用vulp函数在exit地址内写入如下图5示的内容,其中在0x0804a010的低地址写入0xf839,在高地址位写入0xbfff。(计算方法在图中已表明)
图 5
接下来在运行vulp的程序中,执行到exit时,不进行退出,而转向执行shellcode代码,运行得到root权限。如图6所示。(运行后可能结果与图片显示不一样,此图是为了更好的显示效果,所以所有的填充都用0)
图 6