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

发布于 2022-09-10 18:57:01 字数 6236 浏览 23 评论 4

本帖最后由 oatt 于 2011-01-13 16:18 编辑

在James C foster的书buffer overflow attacks -  detect, exploit, prevent当中第三章中有个例子s-proc.c,书中它是能执行的,并且有正确的执行结果,书中的代码及执行结果如下面两个段代码所示。
   但是我在运行书上面的例子时,出现段错误,我认为调用fread(code, 1, flen, fp)时,是把代码(write.s编译后生产的)写入数据段,数据段是不可执行的,所以会出现段错误。
   为什么写书的作者能运行下面的代码,我却实现不了??????

  1. Example 3.1
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h>
  7. #include <errno.h>
  8. /*
  9. * Print message function
  10. */
  11. static void croak(const char *msg) {
  12.         fprintf(stderr, "%sn", msg);
  13.         fflush(stderr);
  14. }
  15. /*
  16. * Usage function
  17. */
  18. static void usage(const char *prgnam) {
  19.         fprintf(stderr, "nExecute code : %s -e <file-containingshellcode>n", prgnam);
  20.         fprintf(stderr, "Convert code : %s -p <file-containing-shellcode>nn", prgnam);
  21.         fflush(stderr);
  22.         exit(1);
  23. }
  24. /*
  25. * Signal error and bail out.
  26. */
  27. static void barf(const char *msg) {
  28.         perror(msg);
  29.         exit(1);
  30. }
  31. /*
  32. * Main code starts here
  33. */
  34. int main(int argc, char **argv) {
  35. FILE *fp;
  36. void *code;
  37. int arg;
  38. int i;
  39. int l;
  40. int m = 15; /* max # of bytes to print on one line */
  41. struct stat sbuf;
  42. long flen; /* Note: assume files are < ** bytes long;-) */
  43. void (*fptr)(void);
  44. if(argc < 3)
  45.         usage(argv[0]);
  46. if(stat(argv[], &sbuf))
  47.         barf("failed to stat file");
  48. flen = (long) sbuf.st_size;
  49. if(!(code = malloc(flen)))
  50.         barf("failed to grab required memory");
  51. if(!(fp = fopen(argv[2], "rb")))
  52.         barf("failed to open file");
  53. if(fread(code, 1, flen, fp) != flen)
  54.         barf("failed to slurp file");
  55. if(fclose(fp))
  56.         barf("failed to close file");
  57. while ((arg = getopt (argc, argv, "e:p:")) != -1){
  58.         switch (arg){
  59.                 case 'e':
  60.                 croak("Calling code ...");
  61.                 fptr = (void (*)(void)) code;
  62.                 (*fptr)();
  63.                 break;
  64.                 case 'p':
  65.                 printf("n/* The following shellcode is %d bytes long:*/n",flen);
  66.                 printf("nchar shellcode[] =n");
  67.                 l = m;
  68.                 for(i = 0; i < flen; ++i) {
  69.                         if(l >= m) {
  70.                                 if(i) printf(""n");
  71.                                 printf( "t"");
  72.                                 l = 0;
  73.                         }
  74.                         ++l;
  75.                         printf("\x%0x", ((unsigned char *)code)[i]);
  76.                  }
  77.                 printf("";nnn");
  78.                 break;
  79.                  default :
  80.                 usage(argv[0]);
  81.         }
  82. }
  83. return 0;
  84. }

复制代码下面一行编译上面的代码:
gcc –o s-proc s-proc.c

  1. Example 3.3 Linux Shellcode for Hello, World!
  2. xor eax,eax
  3. xor ebx,ebx
  4. xor ecx,ecx
  5. xor edx,edx
  6. jmp short string
  7. code:
  8. pop ecx
  9. mov bl,1
  10. mov dl,13
  11. mov al,4
  12. int 0x80
  13. dec bl
  14. mov al,1
  15. int 0x80
  16. string:
  17. call code
  18. db 'Hello, world!'

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

故事与诗 2022-09-14 02:48:35

对。高版本的编译器都会做一些安全检查了。所以不少缓冲区溢出的例子,之所以可能成功,一方面也是因为编译器没有做太多的检查

与他有关 2022-09-13 19:19:38

你可以降低编译器版本试试

过气美图社 2022-09-11 04:18:22

估计是编译器的问题(安全优化),以及系统问题(堆栈不可执行)

菩提树下叶撕阳。 2022-09-10 22:58:34

看一下书中介绍的环境和你的测试环境有哪些区别。
溢出方面,好像是高版本的 gcc 会做一些相关的检查

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文