james foster写的 缓冲区溢出区攻击 一书中s-proc.c例子为何运行不了
本帖最后由 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编译后生产的)写入数据段,数据段是不可执行的,所以会出现段错误。
为什么写书的作者能运行下面的代码,我却实现不了??????
- 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, "%sn", 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>nn", 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)[i]);
- }
- printf("";nnn");
- 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!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对。高版本的编译器都会做一些安全检查了。所以不少缓冲区溢出的例子,之所以可能成功,一方面也是因为编译器没有做太多的检查
你可以降低编译器版本试试
估计是编译器的问题(安全优化),以及系统问题(堆栈不可执行)
看一下书中介绍的环境和你的测试环境有哪些区别。
溢出方面,好像是高版本的 gcc 会做一些相关的检查