一、实验内容
利用一个程序漏洞,编写shellcode,达成效果:蹦出对话框,显示“You have been hacked!(by JWM)”
二、实验原理
因为输入了过长的字符,而缓冲区本身又没有有效的验证机制,导致过长的字符覆盖了返回地址。如果覆盖的返回地址是一个有效地址,而在该地址处又有有效的指令,那么系统就会毫不犹豫地跳到该地址处去执行指令。
本次实验中用到了跳板(jmp esp)
由于操作系统每次加载可执行文件到进程空间的位置都是无法预测的,因此栈的位置实际是不固定的,通过硬编码覆盖新返回地址的方式并不可靠。为了能准确定位shellcode的地址,需要借助一些额外的操作,其中最经典的是借助跳板的栈溢出方式。
如果在函数的返回地址填入一个地址,该地址指向的内存保存了一条特殊的指令jmp esp——跳板。那么函数返回后,会执行该指令并跳转到esp所在的位置。这样,不管程序被加载到哪个位置,最终都会回来执行栈内的代码。
跳板指令从哪找呢?“幸运”的是,在Windows操作系统加载的大量dll中,包含了许多这样的指令,比如kernel32.dll,ntdll.dll,这两个动态链接库是Windows程序默认加载的。而且更“神奇”的是Windows操作系统加载dll时候一般都是固定地址,因此这些dll内的跳板指令的地址一般都是固定的。我们可以离线搜索出跳板执行在dll内的偏移,并加上dll的加载地址,便得到一个适用的跳板指令地址!
OllyDBG命令:
- F8 单步执行
- F2 设置断点
- F7 进入函数
- F9 运行到断点
- Ctrl g 打开地址
三、实验体会
i春秋老师讲解得非常中肯,形象生动,解决了困扰我多时的疑惑。虽然感觉这次步骤多、工程大、用时久,但终究还是解决了困扰我多时的疑惑,比一个人默默看博客要好理解得多。
从前只会用msf生成现成的shellcode,并不懂得其中原理,而这次实验不同,从源码进行分析,手动编写C语言、汇编语言,亲眼见证了shellcode机器码如何生成,加深了对windows系统API库函数、函数调用堆栈、程序逆向的理解,收获颇丰。
本次实验只是本地缓冲区溢出漏洞利用,如何远程利用漏洞,开启shell,还值得进一步学习。
参考资料:
- i春秋《缓冲区溢出分析》
- http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html
四、过程记录
1、带有漏洞的程序
#include "stdio.h"
#include "string.h"
char name[] = "jiangwe";
int main()
{
char buffer[8];
strcpy(buffer, name);
printf("%s",buffer);
getchar();
return 0;
}