QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1942|回复: 1

james foster写的缓冲区溢出区攻击一书中s-proc.c为何运行不了

[复制链接]
发表于 2011-1-14 08:47:09 | 显示全部楼层 |阅读模式
在James C foster的书buffer overflow attacks -  detect, exploit, prevent当中第三章中有个例子s-proc.c,书中它是能执行的,并且有正确的执行结果,书中的代码及执行结果如下面两个段代码所示。
     但是我在运行书上面的例子时,出现段错误,我认为调用fread(code, 1, flen, fp)时,是把代码(write.s编译后生产的)写入数据段,数据段是不可执行的,所以会出现段错误。
   为什么写书的作者能运行下面的代码,我却实现不了??????
   我在ML2上运行的。
  • Example 3.1
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <unistd.h>
  • #include <errno.h>
  • /*
  • * Print message function
  • */
  • static void croak(const char *msg) {
  •         fprintf(stderr, "%s\n", msg);
  •         fflush(stderr);
  • }
  • /*
  • * Usage function
  • */
  • static void usage(const char *prgnam) {
  •         fprintf(stderr, "\nExecute code : %s -e <file-containingshellcode>\n", prgnam);
  •         fprintf(stderr, "Convert code : %s -p <file-containing-shellcode>\n\n", prgnam);
  •         fflush(stderr);
  •         exit(1);
  • }
  • /*
  • * Signal error and bail out.
  • */
  • static void barf(const char *msg) {
  •         perror(msg);
  •         exit(1);
  • }
  • /*
  • * Main code starts here
  • */
  • int main(int argc, char **argv) {
  • FILE *fp;
  • void *code;
  • int arg;
  • int i;
  • int l;
  • int m = 15; /* max # of bytes to print on one line */
  • struct stat sbuf;
  • long flen; /* Note: assume files are < ** bytes long;-) */
  • void (*fptr)(void);
  • if(argc < 3)
  •         usage(argv[0]);
  • if(stat(argv[], &sbuf))
  •         barf("failed to stat file");
  • flen = (long) sbuf.st_size;
  • if(!(code = malloc(flen)))
  •         barf("failed to grab required memory");
  • if(!(fp = fopen(argv[2], "rb")))
  •         barf("failed to open file");
  • if(fread(code, 1, flen, fp) != flen)
  •         barf("failed to slurp file");
  • if(fclose(fp))
  •         barf("failed to close file");
  • while ((arg = getopt (argc, argv, "e:p:")) != -1){
  •         switch (arg){
  •                 case 'e':
  •                 croak("Calling code ...");
  •                 fptr = (void (*)(void)) code;
  •                 (*fptr)();
  •                 break;
  •                 case 'p':
  •                 printf("\n/* The following shellcode is %d bytes long:*/\n",flen);
  •                 printf("\nchar shellcode[] =\n");
  •                 l = m;
  •                 for(i = 0; i < flen; ++i) {
  •                         if(l >= m) {
  •                                 if(i) printf("\"\n");
  •                                 printf( "\t\"");
  •                                 l = 0;
  •                         }
  •                         ++l;
  •                         printf("\\x%0x", ((unsigned char *)code));
  •                  }
  •                 printf("\";\n\n\n");
  •                 break;
  •                  default :
  •                 usage(argv[0]);
  •         }
  • }
  • return 0;
  • }


下面一行编译上面的代码:
gcc –o s-proc s-proc.c
  • Example 3.3 Linux Shellcode for Hello, World!
  • xor eax,eax
  • xor ebx,ebx
  • xor ecx,ecx
  • xor edx,edx
  • jmp short string
  • code:
  • pop ecx
  • mov bl,1
  • mov dl,13
  • mov al,4
  • int 0x80
  • dec bl
  • mov al,1
  • int 0x80
  • string:
  • call code
  • db 'Hello, world!'



下面编译上面的代码,及执行的情况:
[root@gabriel]# nasm -o write write.S

[root@gabriel]# s-proc -e write
Calling code ...
Hello, world!


[ 本帖最后由 zhaojt 于 2011-1-14 08:50 编辑 ]
发表于 2011-1-14 09:56:15 | 显示全部楼层
这种漏洞攻击要看系统版本的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-3-29 03:58 , Processed in 0.065676 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表